如何使用c#.net列出他在winnt文件夹(本地用户和组)或活动目录(域下)中创建的PC用户

本文关键字:用户 活动 PC 创建 域下 net 何使用 文件夹 winnt | 更新日期: 2023-09-27 18:17:19

我实现了一个c# windows应用程序。

对于该应用程序,我想提供windows用户凭据登录。

现在的问题是我需要通过代码从windows pc获取用户列表。

如何获取在winnt文件夹中创建的用户列表(在本地用户和组下)或在active directory域中创建的用户列表。

我有一个从winnt文件夹获取用户列表的想法,它是

DirectoryEntry localMachine = new DirectoryEntry("WinNT://" + Environment.MachineName);
// DirectoryEntry admGroup = localMachine.Children.Find("Guests", "group");
// DirectoryEntry admGroup = localMachine.Children.Find("administrators", "group");
DirectoryEntry admGroup = localMachine.Children.Find("users", "group");
//DirectoryEntry admGroup = localMachine.Children.Find("TestUser1", "group");
object members = admGroup.Invoke("members", null);
foreach (object groupMember in (IEnumerable)members)
{
    DirectoryEntry member = new DirectoryEntry(groupMember);
    listBox1.Items.Add(member.Name);
} 

但现在我想列出用户,如果他存在于活动目录或winnt文件夹。

谁能给我代码来交叉验证用户从两个c#代码

如何使用c#.net列出他在winnt文件夹(本地用户和组)或活动目录(域下)中创建的PC用户

对于活动目录部分,如果您使用的是。net 3.5或更新版本,您可以查看新的System.DirectoryServices.AccountManagement命名空间。

您可以使用PrincipalSearcher和"按例查询"主体来进行搜索:

// create your domain context
PrincipalContext ctx = new PrincipalContext(ContextType.Domain);
// define a "query-by-example" principal - here, we search for a UserPrincipal 
UserPrincipal qbeUser = new UserPrincipal(ctx);
// create your principal searcher passing in the QBE principal    
PrincipalSearcher srch = new PrincipalSearcher(qbeUser);
List<string> userNames = new List<string>();
// find all matches
foreach(var found in srch.FindAll())
{
    // do whatever here - "found" is of type "Principal"
    if(!userNames.Contains(found.Name))
    {
       userNames.Add(found.Name);
    }
}

如果你还没有-绝对阅读MSDN文章在。net框架3.5中管理目录安全主体,它很好地展示了如何充分利用System.DirectoryServices.AccountManagement的新特性

对于本地机器帐户,基本上可以做相同的事情—只是使用不同的PrincipalContext:

// create your local machine context
PrincipalContext local = new PrincipalContext(ContextType.Machine);

代码的其余部分是相同的—但是您的主体对象实际填充的属性可能要少得多(因为本地机器帐户没有像Active Directory帐户那样为它们存储那么多信息)—但是每个主体肯定至少有一个.Name属性!