【发布时间】:2016-09-13 16:50:14
【问题描述】:
我一直在寻找使用 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 类和方法,因为TypeName = Microsoft.ActiveDirectory.Management.ADUser,它.NET 框架中不存在。如何在 PS 中查看 .NET 中使用的具体方法?-
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; } } } -
C#调用这个方法:
public List<string> GetADUserAttributes() { string objectDn = "CN=testuser,OU=TEST,DC=test,DC=local"; DirectoryEntry objRootDSE = new DirectoryEntry("LDAP://" + objectDn); List<string> attributes = new List<string>(); foreach (string attribute in objRootDSE.Properties.PropertyNames) { attributes.Add(attribute); } return attributes; }
我应该怎么做才能不过滤掉我试图从中检索的用户对象的任何属性?
我知道默认情况下 Active Directory 只会显示默认属性或其中包含值的属性,我正在尝试克服此限制。
编辑 1:
我暂时推迟了具体问题。 我一直在尝试对这些方法中的哪一种在检索(读取操作)10.000 个名为“testuser”的个人 AD 用户的 SAM 帐户名称时最快的进行基准测试,我基准测试的方法如下:
- 完成时间:大约 500 毫秒:ADSI - system.directoryservices
- 完成时间:大约 2700 毫秒:主体 - 搜索器 system.directoryservices.accountmanagement
- 完成时间:关于 NOT WORKING :LDAP - System.DirectoryServices.Protocols
- 完成时间:大约 60 毫秒:SQL - System.Data.SqlClient
我正在从工作站查询用户信息 - 我正在查询的域中的 Windows 10 机器。工作站 (4 vcpu)、DC (2vpu) 和 DB (2vcpu) 服务器作为 Hyper V vm 运行。
【问题讨论】:
-
我正在努力克服这个限制。 这不是限制。你想达到什么目的,即你为什么认为你需要这个?
-
@AnsgarWiechers :我需要获取属性名称(例如 AD 用户对象)的原因是因为我想为我的项目创建几乎相同的 AD 缓存。这个想法是在我的数据库的“用户”表中为每个属性名称创建一个列。然后我的前端网站可以从数据库而不是 AD 中检索这些缓存条目及其内容,我相信这会更快,因为它只需要快速 SQL 查询而不是 LDAP 查询。希望清除它,否则评论它。
-
您的 LDAP 查询是否太慢?你对它们进行基准测试吗?如何?你试过caching LDAP proxy吗?
-
确切地说,我目前没有使用 LDAP 查询,而是通过 system.directoryservices 类使用 ADSI,而不是专门使用 LDAP。但是我考虑过只通过 system.directoryservices.protocols.LDAP 使用 LDAP 查询。目前我还没有对哪个更快、ldap 或 sql 进行基准测试。也许如果我发现 LDAP/ADSI 和 SQL 一样快,我会让我的前端直接检索 AD 信息,这样我就不必同步 AD 和我的缓存 AD DB。我将尽快尝试创建基准。我将研究 LDAP 代理缓存。
标签: c# powershell active-directory attributes ldap