如何找到没有值的 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' 包含足够的信息来确定实际数据类型。
谢谢达米恩!
我正在努力寻找尚未具有值的 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' 包含足够的信息来确定实际数据类型。
谢谢达米恩!