0

У нас был сценарий в Powershell, где мы манипулировали Active Directory. Я запрограммировал его сейчас на C#. Мои коллеги говорят, что им нужно было указать контроллер домена в PS, потому что иначе может случиться, что вы читаете с DC A и записываете на DC B, что может вызвать проблемы.DirectoryEntry и контроллер домена

Должен ли я указывать контроллер домена, если я использую DirectorySearcher, чтобы найти запись и манипулировать ею? Или по определению один и тот же контроллер домена является пользователем для поиска объекта (DirectorySearcher) и сохраняет его (CommitChanges)?

Я так не думаю, так как я могу указать его только в поисковой части (объект DirectoryEntry для DirectorySearcher), но не тогда, когда он будет записан обратно в AD (CommitChanges). Поэтому я полагаю, что тот же 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: парень из Microsoft попросил меня использовать DirectorySearcher, потому что он более гибкий. Проблема в том, что ссылка также не отвечает на вопрос о контроллере домена. Объекты в «searchResults» «помните», какой DC они использовали для поиска объекта и используют его, если я обновляю найденные объекты? BTW: Следите за тем, чтобы использовать FindAll(), вам нужно уничтожить найденные объекты, иначе у вас будет утечка памяти. – Diver