2010-06-29 26 views
13

Dado el nombre de un servicio, me gustaría recuperar el nombre de usuario con el que se ejecuta (es decir, el nombre de usuario que se muestra en la pestaña 'Iniciar sesión' de la ventana de propiedades de un servicio). No parece haber nada en la clase ServiceController para recuperar esta información básica. Nada más en System.ServiceProcess parece que expone esta información tampoco. ¿Existe una solución administrada para esto o tendré que pasar a un nivel inferior?¿Cómo recupero el nombre de usuario con el que se ejecuta un servicio de Windows?

Respuesta

20

mediante WMI, con el System.Management puede probar el siguiente código:

using System; 
namespace WindowsServiceTest 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      System.Management.SelectQuery sQuery = new System.Management.SelectQuery(string.Format("select name, startname from Win32_Service")); // where name = '{0}'", "MCShield.exe")); 
      using (System.Management.ManagementObjectSearcher mgmtSearcher = new System.Management.ManagementObjectSearcher(sQuery)) 
      { 
       foreach (System.Management.ManagementObject service in mgmtSearcher.Get()) 
       { 
        string servicelogondetails = 
         string.Format("Name: {0} , Logon : {1} ", service["Name"].ToString(), service["startname"]).ToString(); 
        Console.WriteLine(servicelogondetails); 
       } 
      } 
      Console.ReadLine(); 
     } 
    } 
} 

entonces se puede sustituir después el código comentado con su nombre de servicio, y sólo debe devolver los casos de su proceso de servicio eso está funcionando.

+0

No lo he probado todavía, ¡pero parece un ganador! ¡Gracias! – Pwninstein

2

Prueba esto:

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

pero la más obvia que conseguirá SISTEMA local o de red. La razón por la que no puede mostrar este usuario: ese servicio puede administrar varios usuarios (compartido por el escritorio, conectado a la sesión de Windows actual, utilizando recursos compartidos ...) El sistema inicia el servicio, pero cualquier usuario puede usarlo.

+0

entonces se puede obtener la propiedad Name del objeto WindowsIdentity volvió del comando anterior. – ewall

+3

-1 Esto devuelve 'WindowsIdentity' del usuario actual, no de un servicio especificado. – Pwninstein

+0

@Pwninstein, como de costumbre, el servicio se inicia a partir de credenciales de SISTEMA o RED, no de usuarios "iniciados". Ver mis ediciones sobre esto. Así que aclare que desea obtener una cuenta del sistema que inicie el servicio (mi respuesta es correcta al respecto) o la lista de usuarios que inició sesión actualmente, que podría usar este servicio. – Dewfy

0

Esta solución funciona bien para mí:

ManagementObject wmiService = new ManagementObject("Win32_Service.Name='" + this.ServiceName + "'"); 
    wmiService.Get(); 
    string user = wmiService["startname"].ToString(); 
+0

Agregue una explicación con la respuesta de cómo esta respuesta ayuda OP en la edición actual –

0
public String getUsername() { 
    string username = null; 
    try { 
     ManagementScope ms = new ManagementScope("\\\\.\\root\\cimv2"); 
     ms.Connect(); 
     ObjectQuery query = new ObjectQuery 
       ("SELECT * FROM Win32_ComputerSystem"); 
     ManagementObjectSearcher searcher = 
       new ManagementObjectSearcher(ms, query); 
     foreach (ManagementObject mo in searcher.Get()) { 
     username = mo["UserName"].ToString(); 
     } 
     string[] usernameParts = username.Split('\\'); 
     username = usernameParts[usernameParts.Length - 1]; 
    } catch (Exception) { 
     username = "SYSTEM"; 
    } 
    return username; 
    } 
+1

Debe dar contexto a su código. – Milo

Cuestiones relacionadas