2010-07-20 177 views
1

我正在嘗試使用以下代碼獲取計算機的本地用戶列表。獲取計算機的用戶

 internal void GetUsers() 
     { 
     try 
     { 
      List<string> adUsers = new List<string>(); 
      DirectoryEntry directoryEntry = new DirectoryEntry("WinNT://" + Environment.MachineName); 

      foreach (DirectoryEntry child in directoryEntry.Children) 
      { 
       if (child.SchemaClassName.Equals("User", StringComparison.OrdinalIgnoreCase)) 
       { 
        adUsers.Add(child.Name); 
       } 
      } 
     } 
     catch (Exception ex) 
     { 
      //Exception 
     } 
    } 

此代碼在我的電腦中正常工作。然而,當我測試了幾個其他計算機,以下系統的用戶被列入名單:

ASPNET, HelpAssistant的

可能有人扔我如何能擺脫這些系統的用戶的一些光並只獲得實際登錄的用戶,即普通用戶。

感謝, 拉姆

回答

2

不是答案本身,而是一些建議,可能的幫助。

我認爲問題在於這些帳戶不是真正的系統帳戶,因此可能不那麼容易區分。

您可以查看WMI類Win32_UserAccountWin32_UserProfile並查看是否有任何屬性可能指示哪些用戶帳戶是正常用戶帳戶,哪些是您提到的那些用戶帳戶。具體來說,可能是Win32_UserAccount的'SIDType'或'AccountType'屬性或Win32_UserProfile類的Special屬性。

可能是其他值得一看的WMI類。

或者可能有某種方式可以查詢用戶帳戶是否具有交互式登錄權限(我假設這兩個帳戶可能沒有正常)。

+0

嗨110 1, 非常感謝您的回覆......我會嘗試... – Ram 2010-07-20 09:28:53

1

您是否嘗試過枚舉DirectoryEntry上的Properties集合?

using (DirectoryEntry dirEntry = new DirectoryEntry(strchild)) 
    { 
     foreach (string strPropertyName in dirEntry.Properties.PropertyNames) 
     { 
      Console.WriteLine(strPropertyName + " " + dirEntry.Properties[strPropertyName].Value.ToString()); 
     } 
    } 

除此之外,你可能必須做對Active Directory的LDAP搜索來匹配你已經找到了一個ActiveDirectory的用戶的用戶名。
看看這篇文章。 http://www.codeproject.com/KB/system/everythingInAD.aspx

玩得開心。

+0

嗨blorkfish, 我懷疑的屬性會有所幫助。但沒有試過它..會試着回去..謝謝你的回覆。 – Ram 2010-07-20 09:29:56

0

以下代碼將爲您提供實際上具有本地可訪問文件夾的本地用戶。如果更好的C#開發人員可以重構代碼以使其更清潔 - 請幫助!

var localDrives = Environment.GetLogicalDrives(); 
var localUsers = new List<string>(); 
var query = new SelectQuery("Win32_UserAccount") { Condition = "SIDType = 1 AND AccountType = 512" }; 
var searcher = new ManagementObjectSearcher(query); 

foreach (ManagementObject envVar in searcher.Get()) 
{ 
    foreach (string drive in localDrives) 
    { 
     var dir = Path.Combine(String.Format("{0}Users", drive), envVar["name"].ToString()); 
     if (Directory.Exists(dir)) 
     { 
      localUsers.Add(envVar["name"].ToString()); 
     } 
    } 
}