c # - Når en proces er forhøjet, hvordan kan jeg få Windows-godkendelses-id'et til den ikke forhøjede session

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg skal hente AuthenticationID som returneret af GetTokenInformation med klassen TokenStatistics for den bruger, der logger ind på stationen, om jeg er forhøjet eller ej.


Lemme giver dig lidt mere info. Antag at jeg gør det:


var Result = GetTokenInformation(WindowsIdentity.GetCurrent().Token, TOKEN\_INFORMATION\_CLASS.TokenStatistics, TokenInformation, TokenInfLength, out TokenInfLength);


Dette giver mig mulighed for at få AuthenticationID fra TokenInformation struktur uden problem. Lad os sige, at den resulterende godkendelsesID er '00000000-00001234'


Nu, hvis jeg højreklikker på Visual Studio og klikker på 'Kør som administrator', skal du starte min kode en gang, resultatet bliver noget andet, for eksempel '00000000-00001289'. Men jeg har brug for '00000000-00001234'


Hvordan kan jeg få '00000000-00001234', om den aktuelle proces er forhøjet eller ej?


Jeg formoder, at det bare er et spørgsmål om at finde den rigtige Token for at give GetTokenInformation, men jeg kører i cirkler her ...


Bemærk: Jeg baserede min kode på Sådan får du logon SID i C # for at implementere GetTokenInformation og derefter tilpasset den for at kunne få TokenStatistics.

Bedste reference


OK, jeg fik endelig det til arbejde. Det er disse trin (ikke postering af fuld kode, det er ret lang tid):



  1. Brug WMI (ManagementObject) på win32\_process class + den administrerede procesklasse rekursivt for at oprette den nuværende proces 'forfædre

  2. I mit særlige tilfælde stopper jeg algoritmen, når jeg finder 'explorer' -processen, eller når jeg rammer en undtagelse, da det er meget sandsynligt, at explorer ikke er forhøjet.

  3. P/Invoke OpenProcessToken-funktionen fra advapi32.dll på ProcessId returneret af trin 2. Dette giver dig en brugerToken, der kan bruges til at opbygge en ny WindowsIdentity, som du kan bruge i trin 4

  4. Du kan derefter føje denne WindowsIdentity Token-egenskab til GetTokenInformation for at få dit AuthenticationID tilbage.



Dette er testet og arbejder.


Reference:



  • GetTokenInformation: Sådan får du logon SID i C # (skift funktionen til at ringe TokenStatistics)

  • Få forældre til processen: http://bytes.com/topic/c-sharp/answers/255642-enumerataing-processes-c

  • Få WindowsIdentity af en proces: http://dotbay.blogspot.fr/2009/06/finding-owner-of-process-in-c.html



Hvis du ser noget problem med denne procedure, tøv ikke med at kommentere eller skrive dit eget svar! [4] [5]





Bemærk: Der er et problem, hvis en af ​​hovedprocessen er blevet dræbt: WMI vil give dig id af en proces, der ikke eksisterer længere. Arten af ​​det produkt, jeg arbejder, har mig at genstarte explorer fra tid til anden (kun under dev), sådan så jeg problemet. Det er ikke rigtig et problem for mig, men godt at vide.


Tak