usuario saber obtener nombre net mvc mostrar logueado datos credenciales como asp active c# service wmi username

c# - saber - Obtener el nombre de usuario registrado de un servicio



obtener usuario de red c# (4)

Aquí está mi código (todos ellos residen dentro de una clase, en mi caso, la clase que hereda ServiceBase ).

[DllImport("Wtsapi32.dll")] private static extern bool WTSQuerySessionInformation(IntPtr hServer, int sessionId, WtsInfoClass wtsInfoClass, out IntPtr ppBuffer, out int pBytesReturned); [DllImport("Wtsapi32.dll")] private static extern void WTSFreeMemory(IntPtr pointer); private enum WtsInfoClass { WTSUserName = 5, WTSDomainName = 7, } private static string GetUsername(int sessionId, bool prependDomain = true) { IntPtr buffer; int strLen; string username = "SYSTEM"; if (WTSQuerySessionInformation(IntPtr.Zero, sessionId, WtsInfoClass.WTSUserName, out buffer, out strLen) && strLen > 1) { username = Marshal.PtrToStringAnsi(buffer); WTSFreeMemory(buffer); if (prependDomain) { if (WTSQuerySessionInformation(IntPtr.Zero, sessionId, WtsInfoClass.WTSDomainName, out buffer, out strLen) && strLen > 1) { username = Marshal.PtrToStringAnsi(buffer) + "//" + username; WTSFreeMemory(buffer); } } } return username; }

Con el código anterior en su clase, simplemente puede obtener el nombre de usuario en el método que está anulando así:

protected override void OnSessionChange(SessionChangeDescription changeDescription) { string username = GetUsername(changeDescription.SessionId); //continue with any other thing you wish to do }

Tengo un servicio que tuve que iniciar sesión en el administrador local para instalarlo. La fecha de este servicio para iniciar sesión cuando un usuario inicia o cierra sesión para registrar su nombre de usuario. Finalmente encontré un poco de código WMI que pensé que funcionaría, pero todavía es administrador que regresa. ¿Por qué no está funcionando?

var query = new ObjectQuery("SELECT * FROM Win32_Process WHERE Name = ''explorer.exe''"); var explorerProcesses = new ManagementObjectSearcher(query).Get(); foreach (ManagementObject mo in explorerProcesses) { string[] ownerInfo = new string[2]; mo.InvokeMethod("GetOwner", (object[])ownerInfo); userName = String.Concat(ownerInfo[1], @"/", ownerInfo[0]); } Console.WriteLine(userName); Console.ReadLine();

Para aclarar mi pregunta, estoy intentando obtener el usuario que ha iniciado sesión actualmente, pero me devuelve a Adminstrator la cuenta que utilicé para instalar el servicio.


Debe usar las Notificaciones del Administrador de control de servicios para esto. Puede configurar su servicio para recibir eventos de notificación cuando un usuario inicia sesión y / o cierra sesión. Esto permite que un servicio haga una suplantación interactiva de usuarios si el servicio lo requiere, pero debe proporcionarle la información que necesita para su registro.

Consulte la sección "Uso de Notificaciones del Administrador de control de servicios (SCM)" aquí http://technet.microsoft.com/en-us/library/cc721961(WS.10).aspx

editar

En su clase de Servicio, anule el controlador de eventos OnSessionChange para verificar los eventos de inicio de sesión y cierre de sesión.

protected override void OnSessionChange(SessionChangeDescription changeDescription) { base.OnSessionChange(changeDescription); switch (changeDescription.Reason) { case SessionChangeReason.SessionLogon: // do your logging here break; case SessionChangeReason.SessionLogoff: // do your logging here break; } }

edit2:

class Class1 { [DllImport("Advapi32.dll")] static extern bool GetUserName(StringBuilder lpBuffer, ref int nSize); [STAThread] static void Main(string[] args) { StringBuilder Buffer = new StringBuilder(64); int nSize=64; GetUserName(Buffer, ref nSize); Console.WriteLine(Buffer.ToString()); } }

edit3:

public class InteractiveUser { [DllImport("wtsapi32.dll", SetLastError = true)] static extern bool WTSQueryUserToken(UInt32 sessionId, out IntPtr Token); [DllImport("kernel32.dll")] private static extern UInt32 WTSGetActiveConsoleSessionId(); enum TOKEN_INFORMATION_CLASS { TokenUser = 1, TokenGroups, TokenPrivileges, TokenOwner, TokenPrimaryGroup, TokenDefaultDacl, TokenSource, TokenType, TokenImpersonationLevel, TokenStatistics, TokenRestrictedSids, TokenSessionId, TokenGroupsAndPrivileges, TokenSessionReference, TokenSandBoxInert, TokenAuditPolicy, TokenOrigin } public struct TOKEN_USER { public SID_AND_ATTRIBUTES User; } [StructLayout(LayoutKind.Sequential)] public struct SID_AND_ATTRIBUTES { public IntPtr Sid; public int Attributes; } // Using IntPtr for pSID insted of Byte[] [DllImport("advapi32", CharSet=CharSet.Auto, SetLastError=true)] static extern bool ConvertSidToStringSid( IntPtr pSID, out IntPtr ptrSid); [DllImport("kernel32.dll")] static extern IntPtr LocalFree(IntPtr hMem); [DllImport("advapi32.dll", SetLastError=true)] static extern bool GetTokenInformation( IntPtr TokenHandle, TOKEN_INFORMATION_CLASS TokenInformationClass, IntPtr TokenInformation, int TokenInformationLength, out int ReturnLength); private static string GetSID(IntPtr token) { bool Result; int TokenInfLength = 0; string sidAsString = String.Empty; // first call gets lenght of TokenInformation Result = GetTokenInformation( token , TOKEN_INFORMATION_CLASS.TokenUser , IntPtr.Zero , TokenInfLength , out TokenInfLength ); IntPtr TokenInformation = Marshal.AllocHGlobal( TokenInfLength ) ; Result = GetTokenInformation( token , TOKEN_INFORMATION_CLASS.TokenUser , TokenInformation , TokenInfLength , out TokenInfLength ) ; if ( Result ) { TOKEN_USER TokenUser = ( TOKEN_USER )Marshal.PtrToStructure( TokenInformation , typeof( TOKEN_USER ) ) ; IntPtr pstr = IntPtr.Zero; Boolean ok = ConvertSidToStringSid( TokenUser.User.Sid , out pstr ); sidAsString = Marshal.PtrToStringAuto( pstr ); LocalFree(pstr); } Marshal.FreeHGlobal( TokenInformation ); return sidAsString; } public static string Account() { IntPtr token = IntPtr.Zero; String account = String.Empty; if (WTSQueryUserToken(WTSGetActiveConsoleSessionId(), out token)) { String sid = GetSID(token); account = new SecurityIdentifier(sid).Translate(typeof(NTAccount)).ToString(); } else { int err = Marshal.GetLastWin32Error(); switch (err) { case 5: account = "ERROR_ACCESS_DENIED"; break; case 87: account = "ERROR_INVALID_PARAMETER"; break; case 1008: account = "ERROR_NO_TOKEN"; break; case 1314: account = "ERROR_PRIVILEGE_NOT_HELD"; break; case 7022: account = "ERROR_CTX_WINSTATION_NOT_FOUND"; break; default: account = String.Format("ERROR_{0}", err.ToString()); break; } } return account; } }


Intente cambiar el método Account () insertando el parámetro sessionId y pasando el changeDescription.SessionId al método WTSQueryUserToken

public static string Account(uint sessionId) { IntPtr token = IntPtr.Zero; String account = String.Empty; if (WTSQueryUserToken(sessionId, out token)) { ... ...

ps: ejecuta tu servicio con la cuenta LocalSystem


Sé que este hilo es viejo, pero si alguien necesita saber cómo funciona:

Agregue una referencia a System.Management

Poner using System.Management; en la parte superior de tu archivo

Crea esta variable privada en tu clase:

private readonly ManagementClass _wmiComputerSystem = new ManagementClass("Win32_ComputerSystem");

Crea este método en tu servicio:

protected override void OnSessionChange(SessionChangeDescription changeDescription) { base.OnSessionChange(changeDescription); switch (changeDescription.Reason) { case SessionChangeReason.SessionLogon: { string user = ""; foreach (ManagementObject currentObject in _wmiComputerSystem.GetInstances()) { user = currentObject.Properties["UserName"].Value.ToString().Trim(); } } break; } }

Ahora tienes el nombre de user en user . Si la computadora está en un dominio, se parece a este domain/username