Come posso ottenere il nome utente attualmente registrato da un servizio Windows in .NET?

Ho un servizio di Windows che richiede il nome utente attualmente registrato. Ho provato System.Environment.UserName , Windows identity e Windows Form Authentication, ma tutti stanno restituendo ” System ” come utente mentre il mio servizio è in esecuzione in sistema privilegiato. C’è un modo per ottenere il nome utente attualmente connesso senza cambiare il tipo di account di servizio?

Questa è una query WMI per ottenere il nome utente:

 ManagementObjectSearcher searcher = new ManagementObjectSearcher("SELECT UserName FROM Win32_ComputerSystem"); ManagementObjectCollection collection = searcher.Get(); string username = (string)collection.Cast().First()["UserName"]; 

Sarà necessario aggiungere manualmente System.Management in References.

Se ti trovi in ​​una rete di utenti, il nome utente sarà diverso:

 Environment.UserName 

Sarà visualizzato il formato: “Nome utente”, piuttosto che

 System.Security.Principal.WindowsIdentity.GetCurrent().Name 

Sarà visualizzato il formato: “Nome rete \ Nome utente”

Scegli il formato che desideri.

ManagementObjectSearcher (“SELECT UserName FROM Win32_ComputerSystem”) soluzione ha funzionato bene per me. MA non funziona se il servizio viene avviato tramite una connessione desktop remoto. Per ovviare a questo, possiamo chiedere il nome utente del proprietario di un processo interattivo che è sempre in esecuzione su un PC: explorer.exe. In questo modo, otteniamo sempre il nome utente attualmente connesso a Windows dal nostro servizio Windows:

 foreach (System.Management.ManagementObject Process in Processes.Get()) { if (Process["ExecutablePath"] != null && System.IO.Path.GetFileName(Process["ExecutablePath"].ToString()).ToLower() == "explorer.exe" ) { string[] OwnerInfo = new string[2]; Process.InvokeMethod("GetOwner", (object[])OwnerInfo); Console.WriteLine(string.Format("Windows Logged-in Interactive UserName={0}", OwnerInfo[0])); break; } } 

Codice modificato della risposta di Tapas :

 Dim searcher As New ManagementObjectSearcher("SELECT UserName FROM Win32_ComputerSystem") Dim collection As ManagementObjectCollection = searcher.[Get]() Dim username As String For Each oReturn As ManagementObject In collection username = oReturn("UserName") Next 

Prova WindowsIdentity.GetCurrent() . È necessario aggiungere un riferimento a System.Security.Principal

Puoi anche provare

 System.Environment.GetEnvironmentVariable("UserName"); 

Nel caso in cui qualcuno stia cercando Nome utente visualizzato in contrapposizione a Nome utente , come me.

Ecco il trattamento:

System.DirectoryServices.AccountManagement.UserPrincipal.Current.DisplayName.

Aggiungi riferimento a System.DirectoryServices.AccountManagement nel tuo progetto.