我有一个非常简单的任务——给定用户名及其电子邮件的列表(来自文件),将其与 AD(Active Directory)用户的成员同步,这意味着——添加列表中存在但在 AD 组中缺失的用户,以及删除存在于 AD 组中且在列表中缺失的用户。复杂之处在于,这家公司非常大,并且根据他们的位置在世界各地使用了很多域——比如it.comany.com
, fr.company.com
, uk.company.com
,us.company.com
等——每个域都包含大量用户,要添加的用户可以是其中的任何一个。
我使用以下代码查找 AD 组:
var groupSearch = new DirectorySearcher(new DirectoryEntry(“LDAP://company.com”), “(&(ObjectClass=Group)(CN=TheNameOfTheADGroup))”);
var dirEntry = new DirectoryEntry(groupSearch.FindOne().Path);
并成功找到该组。
现在,我需要将用户添加到这个组(只知道他的用户名,比如willsmith
)。这可以通过调用来完成
dirEntry.Invoke(“Add”, new object[] { dirPath })
dirPath
用户的完整 LDAP 路径在哪里。我可以通过在特定域中搜索来获取它,例如:
var userSearch = new DirectorySearcher(new DirectoryEntry(“LDAP://xx.company.com”), “(&(ObjectClass=User)(CN=willsmith))”);
var dirPath = userSearch.FindOne().Path;
//and then use dirPath in Invoke(“Add”…) – see above
但问题是我不知道用户在哪个确切的域,域的数量在30个左右,每个用户搜索大约需要2-3秒,所以这将是一个很长的过程。
任何想法如何为用户定义域?或者也许有其他解决方案?
PS 我不使用 .NET 3.5 ( PrincipalContext
, GroupPrincipal.FindByIdentity
) 中引入的新 AD 管理功能,因为它们不允许指定搜索的根(这是DirectorySearcher
构造函数中的第一个参数),我需要它,因为 AD 组是位于company.com
域中,而不是us.company.com
我的帐户所在的域。