servicios - instalar servicio windows c# visual studio 2017
¿Cómo obtengo el nombre de usuario actualmente registrado de un servicio de Windows en.NET? (7)
Código modificado de la respuesta de 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
Tengo un servicio de Windows que necesita el nombre de usuario actualmente registrado. System.Environment.UserName
, la identidad de Windows y la autenticación de formulario de Windows, pero todos devuelven " Sistema " como el usuario ya que 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?
En caso de que alguien esté buscando el nombre para mostrar del usuario en lugar del nombre de usuario , como yo.
Aquí está el regalo:
System.DirectoryServices.AccountManagement.UserPrincipal.Current.DisplayName.
Agregue referencia a System.DirectoryServices.AccountManagement
en su proyecto.
Esta es una consulta de 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"];
Deberá agregar System.Management
en References manualmente.
La solución ManagementObjectSearcher ("SELECT UserName FROM Win32_ComputerSystem") funcionó bien para mí. PERO no funciona si el servicio se inicia a través de una conexión de escritorio remoto. Para solucionar este problema, podemos solicitar el nombre de usuario del propietario de un proceso interactivo que siempre se ejecuta en una PC: explorer.exe. De esta forma, siempre obtenemos el nombre de usuario registrado actualmente de Windows 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;
}
}
Prueba WindowsIdentity.GetCurrent()
. Necesita agregar referencia a System.Security.Principal
Si se encuentra en una red de usuarios, el nombre de usuario será diferente:
Environment.UserName
Se mostrará el formato: ''Nombre de usuario'', en lugar de
System.Security.Principal.WindowsIdentity.GetCurrent().Name
Formato de visualización: ''Nombre de red / Nombre de usuario''
Elija el formato que desee.
También puedes probar
System.Environment.GetEnvironmentVariable("UserName");