2011-03-07 5 views
53

Tengo un servicio de Windows que necesita el nombre de usuario actualmente registrado. Intenté System.Environment.UserName, identidad de Windows y autenticación de formulario de Windows, pero todos están devolviendo "Sistema" ya que el usuario como mi servicio se está ejecutando en el sistema con privilegios. ¿Hay alguna manera de obtener el nombre de usuario registrado actualmente sin cambiar el tipo de mi cuenta de servicio?¿Cómo obtengo el nombre de usuario actualmente registrado de un servicio de Windows en .NET?

+11

¿Sabía que puede haber más de un usuario conectado? ¿Los quieres a todos? –

+0

http://stackoverflow.com/questions/4442488/c-net-getting-user-name-of-machine-using-windows-service y http://stackoverflow.com/questions/2727393/get-user-sid -from-logon-id-windows-xp-and-up Creo que también puede obtener los usuarios que han iniciado sesión leyendo el registro de Windows (aquellos con subclave SID). –

+0

ya por supuesto, todo usuario registrado. –

Respuesta

4

Pruebe WindowsIdentity.GetCurrent(). Es necesario añadir una referencia a System.Security.Principal

+8

Creo que esto devolverá al usuario que el servicio se está ejecutando como, no todos usuarios interactivos como se ve desde el servicio que se ejecuta bajo una cuenta de sistema. –

66

Esta es una consulta WMI para obtener el nombre de usuario:

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

Usted tendrá que añadir System.Management bajo Referencias manualmente.

+9

La gente sigue olvidando que las formas habituales de "obtener" un nombre de usuario no funcionan cuando se ejecuta un servicio debido a las cuentas del sistema ... +1 por ser la única respuesta para tener esto en cuenta – amartin94

+2

Me doy cuenta de que esta pregunta es muy antigua, pero Lo encontré al buscar en Google el mismo problema. Si bien esta respuesta es correcta, tenga en cuenta que, como dijo @xanblax en su respuesta, esta consulta WMI no funcionará en una sesión remota (RDP). Solo quería señalarlo y hacerlo más visible, en caso de que alguien más lo lea en el futuro. – CodeCanuck

6

código Modificado de Tapas's answer:

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 
2

También puede intentar

System.Environment.GetEnvironmentVariable("UserName"); 
+1

¿Qué mostrará? Dominio \ Nombre de usuario o simplemente Nombre de usuario? – SearchForKnowledge

+0

@SearchForKnowledge: Simplemente devuelve el nombre de usuario: es equivalente a usar la propiedad 'Environment.UserName' – Bhramar

15

ManagementObjectSearcher ("SELECT nombre de usuario de Win32_ComputerSystem") solución funcionó bien para mí. PERO no funciona si el servicio se inicia a través de una conexión de escritorio remoto. Para solucionar esto, podemos solicitar el nombre de usuario del propietario de un proceso interactivo que siempre se ejecuta en una PC: explorer.exe. De esta manera, siempre nos dan la actualidad de Windows que ha iniciado sesión en el nombre de usuario de nuestro servicio de 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; 
    } 
} 
+4

bastante inteligente :) –

+0

Quería usar esta respuesta, pero no pude encontrar la clase Procesos. –

38

Si se encuentra en una red de usuarios, entonces el nombre de usuario será diferente:

Environment.UserName 

mostrará formato: 'nombre de usuario', en lugar de

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

mostrará formato: 'NetworkName \ nombre de usuario'

Elija el formato que desee.

+1

¡justo lo que estaba buscando! – thedrs

+19

Eso totalmente no responde la pregunta. Cuando su aplicación se ejecuta como un servicio, ambas llamadas devolverán el nombre de la cuenta del servicio. –

+1

devolverá el usuario del servicio actual, no el usuario – Mahdi

0

Sólo en caso de que alguien está buscando el usuario Mostrar nombre en contraposición a Nombre de Usuario, como yo.

Aquí está el placer:

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

Agregue la referencia a System.DirectoryServices.AccountManagement en su proyecto.

Cuestiones relacionadas