2010-12-20 13 views
1

Ich habe ein Problem, das ist ... ich starte ein Programm mit der rechten Maustaste -> als Administrator ausführen. Das bedeutet, dass das Programm in einem administrativen Kontext ausgeführt wird.Abrufen des aktuell angemeldeten Benutzers (FullToken Context)

WindowsIdentity.GetCurrent().Name; 

wenn ich versuche, den Benutzer zu erhalten, dass die Art und Weise Namen, den ich den Benutzer erhalten, die das Programm als Administrator gestartet .. zB „Administrator“, aber was ich brauche, ist der Name der aktuellen angemeldete Benutzer der ist zum Beispiel: Bob

Kann mir jemand helfen? :)

Antwort

0

Vielleicht könnte man als normaler Benutzer starten, den Benutzernamen speichern, dann programmatisch anfordern Höhe:

Windows 7 and Vista UAC - Programmatically requesting elevation in C#

+0

Ich weiß, dass dies über Identitätswechsel möglich wäre. Also gibt es keinen anderen Weg? – Lars

+0

Ich kenne keine andere Methode .. Dies ist ein häufiges Problem während der Installation, da Sie Admin-Zugriff benötigen, um Dateien zu schreiben, aber Sie benötigen Benutzerzugriff für korrekte Benutzerpfade (/ Dokumente und Einstellungen/Benutzername/etc) ...?!? .. es ist kein Fehler, es ist eine Funktion ... –

+0

:) Nein, ich möchte alle Register entladen ich geladen, aber nicht die Registrierung der lokalen Benutzer, die ich als eine Art von Referenz verwenden. also muss ich herausfinden, welches das ist. – Lars

0

Alle .NET-Bibliotheken geben Ihnen den Benutzer aus dem aktuellen Kontext (in Ihrem Fall 'Administrator').

Wenn Sie versuchen, Ihren Code zu sichern, könnten Sie erwägen lesen: Security in the .NET framework

4

Sie könnten versuchen, mithilfe von WMI (System.Management.dll) den Besitzer des explorer.exe Prozess zu bekommen.

string GetExplorerUser() 
{ 
    var query = new ObjectQuery(
     "SELECT * FROM Win32_Process WHERE Name = 'explorer.exe'"); 

    var explorerProcesses = new ManagementObjectSearcher(query).Get(); 

    foreach (ManagementObject mo in explorerProcesses) 
    { 
     string[] ownerInfo = new string[2]; 
     mo.InvokeMethod("GetOwner", (object[])ownerInfo); 

     return String.Concat(ownerInfo[1], @"\", ownerInfo[0]); 
    } 

    return string.Empty; 
} 

Dies beruht auf der Tatsache, dass der Explorer-Prozess einzelne Instanz ist ein so beenden Sie nicht mit der Möglichkeit, mit mehreren explorer laufenden Prozesse mit unterschiedlichen Benutzer-Credentials auf.

+0

Was ist mit Terminal-Diensten, wo jede Sitzung ihren eigenen explorer.exe-Prozess haben könnte? –

+0

Ich fürchte, ich kann dir in diesem Zusammenhang nicht helfen. –

+0

Genau das, was ich gesucht habe! –

0

1) Cassia sollte in der Lage sein, Ihnen eine Liste der derzeit angemeldeten Benutzer einschließlich RDC zu geben.

foreach (ITerminalServicesSession sess in new TerminalServicesManager().GetSessions()) 
{ 
    // sess.SessionId 
    // sess.UserName 
} 

2) WMI (SO answer)

Select * from Win32_LogonSession 

3) PInvoke zu WTSEnumerateSessions

4) alle Instanzen von "explorer.exe" Auflisten und bekommen die Besitzer PInvoke verwenden (OpenProcessHandle) .

Process[] processes = Process.GetProcessesByName("explorer"); 

Dies ist ein bisschen hacky. WMI kann auch dafür verwendet werden.

Es könnte eine gute Idee sein, winmgmt als eine Abhängigkeit für Ihren Dienst festzulegen, wenn Sie sich für eine Lösung entschieden haben, die WMI verwendet.

Verwandte Themen