如何找到没有值的 AD 属性的数据类型

How do I find the data type of an AD attribute not having a value

我正在努力寻找尚未具有值的 AD 属性的数据类型。 到目前为止,生成的 DirecoryEntry 仅包含 属性 用于已经具有值的属性。我找不到获取所有其他属性信息的方法。

向 'PropertiesToLoad' 添加值似乎没有任何作用。返回的 DirectoryEntry 对象包含所有属性(带值),无论此处添加了什么。

使用的代码:

public void Test(string ldapPath)
{
   Type orgType;
   try
   {
     using (DirectoryEntry searchRoot = GetSearchRoot(ldapPath))
     {
        using (DirectorySearcher search = new DirectorySearcher(searchRoot))
        {
            search.Filter = "(&(objectCategory=person)(objectClass=user)(sAMAccountName=coen))";

            search.PropertiesToLoad.Add("msExchHomeServerName");

            SearchResult searchResult = search.FindOne();
            {
                using (DirectoryEntry entry = searchResult.GetDirectoryEntry())
                {
                    if (entry != null)
                    {
                        if (entry.Properties.Contains("msExchHomeServerName"))
                        {
                            orgType = entry.Properties["msExchHomeServerName"].GetType();
                        }
                        else // The value is empty and NOT present in the current 'entry.Properties' object.
                        {
                            throw new Exception("Unknown type");
                        }
                    }
                }
            }
        }
    }
   }
   catch (Exception e)
   {
     <handle exception>
   }
}

有没有办法找到 'msExchHomeServerName'(或任何 'empty' 属性)属性的数据类型?

非常感谢任何帮助!

科恩

Active Directory 有一个架构。说起来很明显,想起来却不明显,因为默认情况下,您无法探索它。

但是,您可以 Register the Active Directory Schema MMC Snap-In1,然后在 MMC 的新实例中添加该管理单元。

这样您就可以探索构成当前 AD 模式的 类 和属性(如果您知道自己在做什么并选择这样做,还可以添加新的 classes/attributes)。

然后可以发现

msExchHomeServerName 是 "Unicode String",这意味着来自 C# 的普通 string 应该是可以接受的。另请注意,某些类型(尤其是数字类型)也可能指定应遵守的最小值和最大值。

您还可以通过 ActiveDirectorySchema class 以编程方式探索架构,例如调用 ActiveDirectorySchema.GetCurrentSchema(); 然后从那里探索。


1我不记得您是否需要安装通用域管理工具(例如用户和计算机)才能使该 DLL 存在于您的系统上。

感谢 Damien_The_Unbeliever 为我指明了正确的方向,我设法创建了以下方法:

public Dictionary<string, ActiveDirectorySyntax> GetAttributeSyntaxes(List<string> lstAttributeNames)
{
    Dictionary<string, ActiveDirectorySyntax> dictRes = new Dictionary<string, ActiveDirectorySyntax>();

    if (lstAttributeNames.Count > 0)
    {
        DirectoryContext directoryContext = new DirectoryContext(DirectoryContextType.DirectoryServer,
                                                             m_Server, m_UserName, m_Password);

        using (ActiveDirectorySchema currentSchema = ActiveDirectorySchema.GetSchema(directoryContext))
        {
            using (ActiveDirectorySchemaClass objClass = currentSchema.FindClass("user"))
            {
                if (objClass != null)
                {
                    ReadOnlyActiveDirectorySchemaPropertyCollection propcol = objClass.GetAllProperties();

                    foreach (ActiveDirectorySchemaProperty schemaProperty in propcol)
                    {
                        foreach (string attrName in lstAttributeNames)
                        {
                            if (schemaProperty.Name.Equals(attrName))
                            {                                    
                                dictRes.Add(attrName, schemaProperty.Syntax);

                                break;
                            }
                        }
                    }
                }
            }
        }
    }

    return dictRes;
}

返回的 'schemaProperty.Syntax' 包含足够的信息来确定实际数据类型。

谢谢达米恩!