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
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.
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.
entonces se puede obtener la propiedad Name del objeto WindowsIdentity volvió del comando anterior. – ewall
-1 Esto devuelve 'WindowsIdentity' del usuario actual, no de un servicio especificado. – Pwninstein
@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
WMI es tu amigo. Mire Win32_Service, específicamente la propiedad StartName
. Puede acceder a WMI desde C# a través del System.Management.ManagementClass.
Si no ha usado WMI antes, el artículo this parece ser un buen tutorial.
Gracias! 15chars – Pwninstein
Esta solución funciona bien para mí:
ManagementObject wmiService = new ManagementObject("Win32_Service.Name='" + this.ServiceName + "'");
wmiService.Get();
string user = wmiService["startname"].ToString();
Agregue una explicación con la respuesta de cómo esta respuesta ayuda OP en la edición actual –
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;
}
Debe dar contexto a su código. – Milo
- 1. Servicio de Windows que se ejecuta periódicamente
- 2. ¿Cómo detectar la actividad del usuario con un servicio Java que se ejecuta en Windows?
- 3. Deje que el usuario especifique en qué cuenta se ejecuta un servicio
- 4. WiX ServiceInstall: configurar el servicio para que se ejecute como el usuario de Windows actual
- 5. ¿Cómo obtengo el nombre de usuario actualmente registrado de un servicio de Windows en .NET?
- 6. ¿Cómo puedo cambiar el nombre de un servicio de Windows?
- 7. El cierre de un servicio de Windows que tiene roscas
- 8. ¿En qué directorio se ejecuta un servicio de Windows?
- 9. Con ThreadPoolExecutor, ¿cómo obtener el nombre del subproceso que se ejecuta en el grupo de subprocesos?
- 10. Cómo configurar que el WCF Test Client se ejecutará cada vez que se ejecuta el servicio
- 11. Instalar el servicio de Windows con nombre personalizado
- 12. ¿Cómo puedo detener con seguridad un hilo de C# .NET que se ejecuta en un servicio de Windows?
- 13. Instalar un servicio de Windows en una máquina remota usando el nombre de usuario dado
- 14. ¿Cómo obtengo el nombre del usuario actual de Windows en formato de nombre de usuario @ dominio?
- 15. ¿Cómo se implementa un oyente de tuberías con nombre reutilizable que se ejecuta de forma asíncrona?
- 16. ¿Cómo obtener el nombre del servicio de Windows desde app.config
- 17. stdout.log cuando se ejecuta Apache Tomcat servicio de Windows
- 18. ¿Cómo puedo obtener el nombre del usuario que ejecuta mi script de Perl?
- 19. Cambiar el usuario del servicio de Windows mediante programación
- 20. Credenciales al instalar el servicio de Windows
- 21. Usuario ASP.NET se ejecuta bajo
- 22. ¿Recibe el nombre de usuario de Windows del usuario actual que usa php?
- 23. servicio web ASP.Net: código que se ejecuta de forma asíncrona
- 24. Programe el servicio de Windows con Quartz.NET
- 25. ¿Cómo puedo obtener el usuario real uid si el programa se ejecuta con sudo?
- 26. Cómo obtener el nombre de la secuencia de comandos Perl que se ejecuta
- 27. Cómo crear un servicio que se reinicia en el bloqueo
- 28. Permitir que se configure un servicio de Windows
- 29. ¿Cómo se usa un nombre de variable con el mismo nombre que un paquete en Go?
- 30. Buscar el nombre de usuario de Windows dentro de R
No lo he probado todavía, ¡pero parece un ganador! ¡Gracias! – Pwninstein