0

我有一个非常简单的任务——给定用户名及其电子邮件的列表(来自文件),将其与 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我的帐户所在的域。

4

0 回答 0