Wie man den aktuellen windows-Benutzernamen aus der windows-Dienst im multiuser-Umfeld benutzen .NET
Ich habe einen windows-Dienst ausführen, eine WPF-Anwendung die ganze Zeit für alle angemeldeten Benutzer, welche gut funktioniert, jetzt in der WPF-Anwendung, die ich nicht bekommen kann eine aktuelle username Umgebung.UserName; gibt 'SYSTEM', was verständlich ist. also, was ich dachte, war, eine session-id des aktuellen Prozesses, die abgerufen werden konnten, durch den Prozess.GetCurrentProcess().SessionId und dann bekommen Sie die Liste aller angemeldeten Benutzer in die Maschine und Durchlaufen Sie zu finden, die die session-id-übereinstimmung mit Prozess-session-id und später seinen Benutzernamen.
aber ich weiß nicht, wie man die Liste aller angemeldeten Benutzer, oder ich wäre dankbar, wenn mir jemand helfen kann mit alternativen.
- Kann man sich alle aktiven Prozesse mit einem Fenster und bekommen die Benutzer dieses Prozesses. Ein Dienst läuft als SYSTEM sollte die Rechte, dies zu tun.
- Warum nicht einfach senden Sie die Benutzername, um Ihren Dienst, wenn es beginnt, zu tun, was es für Sie tut. Prozess.GetCurrentProcess werden Ihren service in der service -...
- Erstens kann ich nicht den Benutzernamen aus der windows-Dienst und zweitens nehme ich alles "winlogon" - Prozess, d.h. die Anzahl der angemeldeten Benutzer und Angabe der WPF-Anwendung in den einzelnen Benutzer-session.
- Ich nicht fangen Szenario! jeder Benutzer ausgeführt, es ist ein eigenes WPF-Anwendung oder gibt es nur eine WPF-Anwendung und einer Menge von Benutzern zu den gleichen Zeiten?
- Sie sind auf der Suche nach "Identität Anrufer". Es gibt eine gute chance, dass Wie: die Identität des Ursprünglichen Aufrufers in WCF ist der Artikel, den Sie versuchen, zu finden.
- Szenario ist ein windows-Dienst pro Maschine, und eine WPF-Anwendung pro Benutzer auf der gleichen Maschine, ist jetzt auf einmal ist die WPF-app ausgeführt wird, ich möchte den angemeldeten Benutzernamen und es sind viele andere angemeldet als auch mit Ihren eigenen WPF-Anwendungen laufen
- Als ich versuchte, Sie zu sagen, bevor Der Weg zum tun ist, um die wpf-Anwendung zu senden, die Sie an den Dienst. Alle service-Bedürfnisse einige comms und einen Ort zum speichern (es / Sie) und definitiv keine Notwendigkeit für alle Reifen man stolpern durch jetzt.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Fand diese Lösung auf MSDN-Foren:
Dies ist nun leicht geprüft werden, indem Sie eine neue Konsole-Anwendung, kopieren Sie den obigen code, und schreiben Sie den username string auf die Konsole. Scheint zu funktionieren, aber für Dienstleistungen es ist offenbar eine komplexe situation. Da alle Dienste laufen in einem container, der läuft unter dem SYSTEM-Benutzer, das ist, was Sie zurück. Für mehr Informationen siehe den link unten, insb. alle Harry Zhu Antworten.
http://social.msdn.microsoft.com/Forums/vstudio/en-US/3be119b0-88b4-442e-9613-6856cbb27adb/how-can-i-get-current-username-in-windows-service?forum=csharpgeneral
Es würde scheinen, es ist nicht möglich, das zu erreichen, was Sie versuchen zu bekommen, da die Dienstleistungen sind völlig seperate Benutzer-Sitzung.
Environment.UserName
), nicht sicher, wie dein Vorschlag ist besser.Ich es lösen, indem das ausführen von powershell-Befehl "quser" in meiner WPF-Anwendung, die liefert alle für den angemeldeten Benutzer, dann bin ich der Iteration zu finden, session-id, in dem die Anwendung ausgeführt wird, mit der Benutzer-session-id und dann abrufen, seinen Namen. unten ist die Funktion, welche das abrufen der Benutzername durch die übergabe seiner session-id
die Funktion kann aufgerufen werden, indem Sie
Ich lief in ein ähnliches problem beim erstellen eines Windows-Dienstes. Genau wie du hatte ich auch die Session-ID und nötig, um die entsprechenden Benutzernamen. Syed ' s Antwort oben hat nicht funktioniert auf meinem Rechner (Windows 10) als Microsoft zu haben scheint, entfernt die
quser
ausführbare Datei. Nach mehreren erfolglosen Lösung hier, SO lief ich in diese Besondere Antwort und es inspiriert meine Lösung:Hier mein code (alle von Ihnen wohnen in einer Klasse, in meinem Fall, die Klasse zu Erben
ServiceBase
)Können Sie versuchen, diesen Code Spinett.
Wann immer ein Benutzer angemeldet Fenster, das Username-Attribut enthält den Benutzernamen des Benutzers. In dem Fall, wenn kein Benutzer in windows-system, wird es keine Instanzen der Win32_ComputerSystem-Klasse.
machte ich ein wenig suchen und finden, dass dieser code sollte für Sie arbeiten:
Sie erhalten den Benutzernamen, denen läuft der Prozess...
Referenz: Wie Ermittle ich den Eigentümer eines Prozesses, in C#?
Können Sie versuchen, diesen Code:
Implementierung der Methode GetUsername hier: https://stackoverflow.com/a/35810391/10412686