Obtenir le nom d’utilisateur connecté en C #

Comment puis-je obtenir le nom d’utilisateur actuellement connecté dans Windows 7 (c’est-à-dire l’utilisateur qui est connecté physiquement à la console dans laquelle le programme que je lance est en cours d’exécution).

Par exemple, si je suis connecté en tant que “MainUser” et que je lance l’application de la console (qui affiche le nom d’utilisateur connecté) en tant que “SubUser”, le programme ne renvoie que “SubUser” en tant qu’utilisateur actuellement connecté.

J’ai utilisé les 2 techniques suivantes pour obtenir le nom d’utilisateur. Les deux ne me donnent pas la chose que je veux.

System.Environment.GetEnvironmentVariable("USERNAME") System.Security.Principal.WindowsIdentity.GetCurrent().User; 

Notez cependant que ce code VBScript renvoie le nom d’utilisateur connecté quel que soit le compte d’utilisateur à partir duquel ce script est exécuté:

 strComputer = "." Set objWMIService = GetObject("winmgmts:" _ & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2") Set compsys_arr = objWMIService.ExecQuery _ ("Select * from Win32_ComputerSystem") For Each sys in compsys_arr Wscript.Echo "username: " & sys.UserName Next 

De toute façon, c’est possible en C #?

Je pense que le simple fait de convertir les appels WMI en c # fonctionne parfaitement pour moi.

  ConnectionOptions oConn = new ConnectionOptions(); System.Management.ManagementScope oMs = new System.Management.ManagementScope("\\\\localhost", oConn); System.Management.ObjectQuery oQuery = new System.Management.ObjectQuery("select * from Win32_ComputerSystem"); ManagementObjectSearcher oSearcher = new ManagementObjectSearcher(oMs, oQuery); ManagementObjectCollection oReturnCollection = oSearcher.Get(); foreach (ManagementObject oReturn in oReturnCollection) { Console.WriteLine(oReturn["UserName"].ToSsortingng().ToLower()); } 

Je pense que vous devriez suivre un itinéraire P / Invoke. Vous devez connaître le processus WindowStation dans lequel votre processus s’exécute, puis déterminer le propriétaire de ce WindowStation. Je ne pense pas qu’il existe une API .NET pour déterminer ces choses.

Les API Win32 que vous devez examiner sont probablement GetProcessWindowStation et GetUserObjectSecurity pour rechercher le propriétaire.

Bien que je ne comprenne pas si vous voulez obtenir le nom d’utilisateur, qui est connecté au système ou le nom d’utilisateur sous lequel la console est en cours d’exécution – vous pouvez peut-être essayer d’utiliser System.Environment.UserName – MSDN affirme qu’il affiche le journal sur le nom d’utilisateur.

Vous voulez le nom d’utilisateur de votre session. Vous pouvez connaître votre identifiant de session en appelant ProcessIdToSessionId . Ensuite, utilisez WTSQuerySessionInformation pour connaître le nom d’utilisateur.