2010-12-14 15 views
2

Ich habe Schwierigkeiten, den Benutzernamen einer Person zu erhalten, die mit einem Windows-Dienst an einem Computer angemeldet ist.C# .NET Abrufen des Benutzernamens des Computers mit Windows-Dienst

Bei Verwendung von System.Environment.UserName oder WindowsIdentity.GetCurrent(). UserName bekomme ich NTAUTHORITY \ SYSTEM, aber wenn diese Anwendung gedrängt wird, muss ich in der Lage sein, die Benutzer-ID der am System angemeldeten Person zuzuordnen. Das Betriebssystem, auf dem es verwendet wird, ist Windows XP.

Jede Hilfe wäre sehr willkommen.

+1

Welcher Benutzer möchten Sie? Es können mehrere Personen in Sitzungen auf einem Computer angemeldet sein (entweder durch schnelle Benutzerumschaltung auf XP oder Remote Desktop auf einem Server). In jeder Sitzung können Prozesse unter verschiedenen Logins ausgeführt werden (über den Befehl Ausführen als). –

+0

Der aktuell angemeldete Benutzer. Zum Glück können diese Maschinen nur jeweils einen Client anmelden. –

+0

Tim, du solltest das anders formulieren und es als Antwort posten - ich vermute, dass das OP das Unmögliche verlangt und dir ist die beste Antwort, die er bekommt! –

Antwort

1

Für XP nur sollte dieser Rat gilt: Get Window Station for a non-interactive user per process, user or session?

  • Anruf OpenWindowStation einen Griff zu bekommen, um "winsta0"
  • Anruf GetUserObjectInformation, um herauszufinden, wer der Eigentümer winsta0

Dieser Ansatz wird jedoch bei der Aktualisierung Ihrer App auf Vista, Windows 7 oder höher unterbrochen, wenn die Dienste in einer anderen Sitzung als bei interaktiven Anmeldungen ausgeführt werden. Sie müssen die Terminaldienste-API aufrufen, um eine Liste der angemeldeten Benutzer zu erhalten und Ihre "interaktive" auswählen.

-1

Windows-Dienst wird immer unter den Anmeldeinformationen ausgeführt, die auf der Registerkarte Eigenschaften/Anmelden des Dienstes angegeben sind. Dies hat nichts mit den Anmeldeinformationen der Person/Personen zu tun, die derzeit in ihren eigenen Sitzungen bei Windows angemeldet sind.

Der Wert von NTAUTHORITY \ SYSTEM ist korrekt, da Ihr Dienst unter den Anmeldeinformationen des lokalen Systemkontos ausgeführt wird.

Sie können nicht Windows-Dienst unter dem Konto von "derzeit angemeldeten" Benutzer ausführen - das ist nicht, was Windows-Dienst ist.

+0

Er fragte, wie man den angemeldeten Benutzernamen von einem Dienst erhalten, wie man einen Dienst unter dem Dienst ausführt Konto von 'derzeit angemeldet' Benutzer – iedoc

4

Try this:

var connectionOptions = new ConnectionOptions(); 
var scope = new System.Management.ManagementScope("\\\\localhost", connectionOptions); 
var query = new System.Management.ObjectQuery("select * from Win32_ComputerSystem"); 
var searcher = new ManagementObjectSearcher(scope, query); 
foreach (var row in searcher.Get()) 
{ 
    Console.WriteLine(row["UserName"].ToString().ToLower()); 
} 
+1

+1 dieser Code tut genau das, was ich will, ich wünschte nur, ich wollte es nicht – Jodrell

+0

Ich habe auch das gleiche Problem, @jgaufin Ihren Code wird auch für 64-Bit-Betriebssystem funktionieren? – Wilz

+1

ja, sollte es. – jgauffin

Verwandte Themen