Avatar billede kza Nybegynder
14. oktober 2009 - 23:46 Der er 2 kommentarer og
1 løsning

Kan man lave Impersonation i WinForms program

Hej,

Kan man 'impersonate' en bruger i en .NET 2.0 WinForms applikation? Og i så fald hvordan?

Jeg har en WinForms applikation, hvor den aktulle Windows bruger bruges til at connect'e til en SQL Server database. Jeg bruger også brugerens bruger-id til at indsætte initialer på nogle rapporter.

Jeg har fået et ønske fra brugerne om, at man skal kunne gå hen til en kørende instans af mit program og skifte bruger uden at behøve at ændre logon på Windows. Altså en slags logon-dialog kun for mit programs proces.

Kan man det?
Avatar billede arne_v Ekspert
15. oktober 2009 - 00:37 #1
Avatar billede kza Nybegynder
15. oktober 2009 - 12:01 #2
Tak for link'et arne_v. Jeg undersøger, om det kan bruges.

/Klaus
Avatar billede kza Nybegynder
19. oktober 2009 - 10:35 #3
Hvis der er nogle, der står med det sammen problem, så vil jeg lige skrive, hvad jeg har tænkt mig at gøre.

Jeg vil også gerne høre, hvis der er nogle, der har nogle tanker om eller erfaringer med den løsning, jeg foreslår. Jeg føler mig lidt på tynd is her.

Til at starte med, kan jeg sige, at min overskrift var lidt forkert. Man kan godt lave impersonation i WinForms, men det jeg spurgte om var, om man kan ændre på den bruger, der kører en proces i Windows.

Det kan man ikke! Når en proces startes i Windows, knyttes den til en token, der repræsenterer en brugerkonto, og dette proces-token kan ikke ændres - på nogen måde overhoved.

Man kan så bruge Impersonation til at lade som om, at en tråd udføres af en anden bruger vha. WindowsIdentity.Impersonate() som forklaret i link'et ovenfor. Hvis den tråd nu fx. forsøger at få adgang til en fil, så vil det ske som den impersonated brugerkonto. Hvis jeg udfører en
WindowsIdentity.GetCurrent() så vil jeg få fat i den impersonated bruger.

Men hvis jeg udfører en Threads.CurrentPrincipal, så vil jeg få fat i den oprindelige bruger!
Så efter
    WindowsIdentity.Impersonate();
skal jeg udføre en
    Thread.CurrentPrincipal = new WindowsPrincipal(WindowsIdentity.GetCurrent())

Thread.CurrentPrincipal følger ikke automatisk WindowPrincipal.GetCurrent() - det skal jeg selv sørge for (hvis det er det, jeg ønsker (og det er det)).

Thread.CurrentPrincipal har betydning for den rollebaserede sikkerhed i .NET og indtil jeg fik sat den, så connected min program til SQL Server med den oprindelige bruger ikke den impersonated bruger.


WindowsIdentity.Impersonate() og Thread.CurrentPrincipal berører kun den aktuelle tråd, så når mine baggrundstråde starter med at køre, skal jeg sørge for at de også kalder Impersonate() og sætter CurrentPrincipal til den bruger, der er 'logget på' forgrundstråden.

I øvrigt: Mine baggrundstråde bliver startet op med en Timer, og når de er færdige og går tilbage i ConnectionPool'en, så bliver de ikke 'nulstillet' til den oprindelige brugerkonto, de bevarer 'impersoneringen'.

Jeg har haft rigtig god nytte af følgende online bog:
http://alt.pluralsight.com/wiki/default.aspx/Keith.GuideBook.HomePage

arne_v: Jeg håber, det er i orden, at du ikke får 200 point for dit link.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester