0

我们在Powershell中创建了一个脚本,用于处理Active Directory。我现在用C#编写了它。我的同事们说他们必须在PS中指定域控制器,否则可能会发生这种情况,您用DC A读取并在DC B上写入可能会导致问题。DirectoryEntry和域控制器

如果我使用DirectorySearcher查找条目并对其进行操作,是否真的必须指定域控制器?或者每个定义是否有相同的域控制器是用于查找对象(DirectorySearcher)并保存它(CommitChanges)的用户?

我不这么认为,因为我只能在搜索部分(DirectorySearcher的DirectoryEntry对象)中指定它,而不是在写回到AD(CommitChanges)时才指定它。所以我认为用同样的DC来书写就像用于阅读的DC一样。

下面我有一个例子,我搜索一个特定的条目并更改属性。

string filter = "(proxyaddresses=SMTP:[email protected])"; 
string searchOU = "ou=Users,dc=abc,dc=com"; 

DirectoryEntry entry = new DirectoryEntry("LDAP://" + searchOU); 
DirectorySearcher search = new DirectorySearcher(entry); 
search.Filter = filter; 
SearchResult result = search.FindOne(); 
search.Dispose(); 
entry.Close(); 

DirectoryEntry toContact = result.GetDirectoryEntry();  
toContact.Properties["showInAddressBook"].Value = addressbook; 
toContact.CommitChanges(); 
toContect.Close(); 

回答

0

我可以推荐使用System.DirectoryServices.AccountManagement命名空间中可用的对象吗?这是.NET的更新版本,可以更加优雅地处理AD工作。它最近为我节省了很多心痛,而较旧的DirectorySearcher做事的方式部分原因在于此。让框架承受压力!网上有很多非常有用的文章,例如here

至于如何使用PrincipalContext搜索Active Directory中的例子,试试这个:

var adContext = new PrincipalContext(ContextType.Domain); 
var queryTemplateUser = new UserPrincipal(adContext); 
queryTemplateUser.SamAccountName = "HenryCrunn"; 
var ldapSearcher = new PrincipalSearcher(queryTemplateUser); 
var searchResults = ldapSearcher.FindAll(); 
+0

虽然这种联系可以回答这个问题,最好是在这里有答案的主要部件,并提供连结以供参考。如果链接页面更改,则仅链接答案可能会失效。 - [来自评论](/ review/low-quality-posts/13612911) – techspider

+0

是的,你当然是对的。抱歉,我会用一些有用的代码更新答案。 – DrMistry

+0

@DrMistry:微软的一个人问我使用DirectorySearcher,因为它更灵活。问题是该链接也不回答关于域控制器的问题。 “searchResults”中的对象“记住”他们用来查找对象的DC,并且如果我更新找到的对象时使用相同的DC?顺便说一句:小心使用FindAll()时,你必须处理找到的对象,否则你有内存泄漏。 – Diver