2010-10-28 115 views
8

如何获取当前在Windows 7中登录的用户名(即身体登录到正在运行的程序所在的控制台的用户)。获取C#中登录的用户名

例如,如果我以“MainUser”身份登录并以“SubUser”身份运行我的控制台应用程序(它将显示登录的用户名),那么程序仅返回“SubUser”作为当前登录的用户。

我使用了以下2种技术来获取用户名。两者都没有让我得到我想要的东西。

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

注意,但是,这V​​BScript代码返回登录的用户名,不论用户帐户从这个脚本运行:

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 

任何方式,可以在C#中?

+1

检查http://forums.whirlpool.net.au/archive/793434。我想你可以改变代码,使其完全符合你的VBScript。 – weismat 2010-10-28 06:24:19

+1

VBScript不适用于我(运行在Win2003服务器上)。另外,如果用户选择在不同的用户帐户下运行你的程序,*为什么*你想忽略它? – 2010-10-28 06:36:36

+0

@Damien,我需要根据登录的用户在程序中做出决定,那就是为什么! – Santhosh 2010-10-28 06:39:59

回答

6

我认为只是将WMI调用转换为c#对我来说工作得很好。

  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"].ToString().ToLower()); 
      } 
2

Altough我不明白,如果你想获得用户名,谁登录系统或控制台正在运行的用户名 - 也许你可以尝试使用System.Environment.UserName - MSDN声称它显示登录的用户名。

+0

我想要登录到系统的用户名。 System.Environment.UserName只返回程序正在运行的用户名。 – Santhosh 2010-10-28 06:22:26

5

我想你不得不去下一个P/Invoke路线。您需要找出您的进程在哪个WindowStation中运行,然后确定该WindowStation的所有者。我不认为有确定这些东西的.NET API。

您需要查看的Win32 API可能是GetProcessWindowStationGetUserObjectSecurity以找到所有者。

+1

这是错误的。窗口站的安全描述符与登录的用户无关。任何关系都是巧合的,并且与用户需要访问窗口站的事实有关。 – wj32 2010-10-28 10:25:39