如何从C#中的Active Directory用户获取所有属性

时间:2016-09-13 16:50:15

标签: c# powershell active-directory attributes ldap

我一直在寻找一个使用C#代码的解决方案,它可以向Active Directory用户查询它已注册的所有属性,无论它们是否具有NULL值。通过域服务器上ADSI Edit中用户属性中的“属性编辑器”选项卡可以看到这些属性。

AD user attributes in ADSI edit

我需要动态检索这些属性,这意味着我可能无法通过MSDN上的ADSI文档可靠地获取这些属性名称,因为并非所有这些属性都可能是特定于用户对象的: https://msdn.microsoft.com/en-us/library/ms675090(v=vs.85).aspx

这是我到目前为止所尝试的内容,但只获得了用户对象的一小部分属性:

  1. PS命令​​Get-ADUser -Identity administrator -Properties:这检索了很多属性,但几乎不是所有属性,我不知道在此命令期间调用了哪些.NET类和方法,因为{{1在.NET框架中不存在。如何在PS中查看.NET中使用的具体方法?

  2. C#调用此方法:

    TypeName = Microsoft.ActiveDirectory.Management.ADUser
  3. C#调用此方法:

    public bool GetUserAttributes(out List<string> userAttributes, string userName)
    {
        userAttributes = new List<string>();
        var valueReturn = false;
    
        try
        {
            const string pathNameDomain = "LDAP://test.local";
    
            var directoryEntry = new DirectoryEntry(pathNameDomain);
    
            var directorySearcher = new DirectorySearcher(directoryEntry)
            {
                Filter = "(&(objectClass=user)(sAMAccountName=" + userName + "))"
            };
    
            var searchResults = directorySearcher.FindAll();
    
            valueReturn = searchResults.Count > 0;
    
            StreamWriter writer = new StreamWriter("C:\\LDAPGETUSERADEXAMPLE.txt");
    
            foreach (SearchResult searchResult in searchResults)
            {
                foreach (var valueCollection in searchResult.Properties.PropertyNames)
                {
                    userAttributes.Add(valueCollection.ToString() + " = " + searchResult.Properties[valueCollection.ToString()][0].ToString());
    
                    try
                    {
                        writer.WriteLine("Bruger attribut:" + valueCollection);
                    }
                    catch (Exception)
                    {
                        throw;
                    }
                }
            }
    
  4. 如何不过滤掉我想要检索的用户对象的任何属性?

    我知道Active Directory默认只显示默认属性或其中包含值,我试图克服这个限制。

    编辑1:

    我暂时推迟了具体问题。 我一直在尝试对这些方法中的哪一个进行基准测试,以便检索(READ操作)10,000个单独AD用户的SAM帐户名称,例如&#34; testuser&#34;,我基准测试的方法如下:

    1. 完成时间:约500毫秒:ADSI - system.directoryservices
    2. 完成时间:约2700毫秒:校长 - 搜索者system.directoryservices.accountmanagement
    3. 完成时间:关于不工作:LDAP - System.DirectoryServices.Protocols
    4. 完成时间:大约60毫秒:SQL - System.Data.SqlClient
    5. 我正在查询来自工作站的用户信息 - 我正在查询的域中的Windows 10计算机。工作站(4个vcpu),DC(2vpu)和DB(2vcpu)服务器作为Hyper V vm运行。

1 个答案:

答案 0 :(得分:1)

任何类都可以拥有的所有属性都在Active Directory架构中定义

Use this来查询用户类。然后只需调用GetAllProperties方法

var context = new DirectoryContext(DirectoryContextType.Forest, "amber.local");

using (var schema = System.DirectoryServices.ActiveDirectory.ActiveDirectorySchema.GetSchema(context))
{
    var userClass = schema.FindClass("user");

    foreach (ActiveDirectorySchemaProperty property in userClass.GetAllProperties())
    {
        // property.Name is what you're looking for
    }
}

但是AD模式可能因AD环境而异。例如,第三方程序或Exchange Server可以使用自定义属性扩展架构。这意味着具有预定义列的解决方案仅适用于特定环境。