我一直在寻找一个使用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
这是我到目前为止所尝试的内容,但只获得了用户对象的一小部分属性:
PS命令Get-ADUser -Identity administrator -Properties
:这检索了很多属性,但几乎不是所有属性,我不知道在此命令期间调用了哪些.NET类和方法,因为{{1在.NET框架中不存在。如何在PS中查看.NET中使用的具体方法?
C#调用此方法:
TypeName = Microsoft.ActiveDirectory.Management.ADUser
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;
}
}
}
如何不过滤掉我想要检索的用户对象的任何属性?
我知道Active Directory默认只显示默认属性或其中包含值,我试图克服这个限制。
编辑1:
我暂时推迟了具体问题。 我一直在尝试对这些方法中的哪一个进行基准测试,以便检索(READ操作)10,000个单独AD用户的SAM帐户名称,例如&#34; testuser&#34;,我基准测试的方法如下:
我正在查询来自工作站的用户信息 - 我正在查询的域中的Windows 10计算机。工作站(4个vcpu),DC(2vpu)和DB(2vcpu)服务器作为Hyper V vm运行。
答案 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可以使用自定义属性扩展架构。这意味着具有预定义列的解决方案仅适用于特定环境。