2010-10-28 278 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