2010-07-20 55 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()); 
     } 
    } 
}