2011-08-15 107 views
2

我在管理員帳戶下運行windows服務,我想知道誰是當前登錄的用戶。它與當前正在運行的帳戶WindowService不同。 有沒有簡單的方法從c#中獲取它?從WindowsService如何從C#中找到當前登錄的用戶?

它不是: System.Security.Principal.WindowsIdentity.GetCurrent() 既不 System.Environment.UserName

感謝

編輯

我感興趣誰是目前使用控制檯會話登錄。謝謝jadarnel27

我對其他遠程會話不感興趣,因爲這不是我的情況。

+2

什麼讓您認爲只有一個登錄用戶?通過快速用戶切換,又名終端服務/遠程桌面,可以有多個登錄會話。 –

+0

可能有多個同時登錄的用戶。例如,通過遠程桌面。 –

+1

也許,那麼知道所有登錄用戶的列表以及誰擁有「控制檯」會話會更有用。 – jadarnel27

回答

6

1)Cassia應該能夠爲您提供包括RDC在內的當前登錄用戶的列表。

foreach (ITerminalServicesSession sess in new TerminalServicesManager().GetSessions()) 
{ 
    // sess.SessionId 
    // sess.UserName 
} 

2)WMI(SO answer

Select * from Win32_LogonSession 

3)的PInvoke到WTSEnumerateSessions

4)枚舉 「的explorer.exe」 的所有實例和使用的PInvoke獲得所有者(OpenProcessHandle) 。

Process[] processes = Process.GetProcessesByName("explorer"); 

這有點哈克。 WMI也可以用於此。

這可能是設置winmgmt爲您服務的依賴,如果你決定去與使用WMI的解決方案是一個好主意。

+0

我真的很喜歡這個解決方案。謝謝。 –

2

你可能想看看Cassia

決明子是訪問本機Windows終端服務API(即現在的遠程桌面服務API)一個.NET庫。它可以從C#,Visual Basic.NET或任何其他.NET語言中使用。

和:

枚舉終端會話和報告,包括連接狀態,用戶名,客戶名稱,客戶端顯示細節會話信息...

0

當前登錄到控制檯會話的用戶列表可以通過WMI進行檢索。您需要添加對System.Management.dll的引用:

public static List<string> GetLoggedOnUsers(CacheLevel level) 
{ 
    const int ConsoleSession = 2; 

    string logonQuery = "SELECT * FROM Win32_LogonSession WHERE LogonType = " + ConsoleSession; 

    ManagementObjectSearcher searcher = new ManagementObjectSearcher(logonQuery); 

    List<string> userNames = new List<string>(); 

    foreach (ManagementBaseObject logon in searcher.Get()) 
    { 
     string logonId = logon.Properties["LogonId"].Value.ToString(); 

     string userQuery = "ASSOCIATORS OF {Win32_LogonSession.LogonId=" + logonId + "} " 
          + "WHERE AssocClass=Win32_LoggedOnUser Role=Dependent"; 

     ManagementObjectSearcher searcher2 = new ManagementObjectSearcher(userQuery); 

     foreach (ManagementBaseObject user in searcher2.Get()) 
     { 
      string name = user.Properties["FullName"].Value.ToString(); 

      userNames.Add(name); 
     } 
    } 

    return userNames.Distinct().ToList(); 
} 
相關問題