0

Wir hatten ein Skript in PowerShell, wo wir das Active Directory manipuliert haben. Ich habe es jetzt in C# programmiert. Meine Kollegen sagen, dass sie den Domänencontroller in PS angeben mussten, da es sonst passieren kann, dass Sie mit DC A lesen und auf DC B schreiben, was zu Problemen führen könnte.DirectoryEntry und Domain Controller

Muss ich den Domänencontroller wirklich angeben, wenn ich mit DirectorySearcher einen Eintrag suche und ihn manipuliere? Oder ist per Definition derselbe Domänencontroller ein Benutzer, der das Objekt (DirectorySearcher) findet und speichert (CommitChanges)?

Ich denke nicht, da ich es nur im suchenden Teil (DirectoryEntry-Objekt für den DirectorySearcher) angeben kann, aber nicht, wenn es zurück zum AD (CommitChanges) geschrieben wird. Ich nehme also an, dass derselbe DC zum Schreiben verwendet wird wie der zum Lesen verwendete.

Im Folgenden habe ich ein Beispiel, wo ich nach einem bestimmten Eintrag suchen und eine Eigenschaft ändern.

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(); 

Antwort

0

Darf ich empfehlen die Objekte in der System.DirectoryServices.AccountManagement Namespace? Es ist eine neuere Ergänzung zu .NET und behandelt AD-Arbeit viel eleganter. Es hat mir vor kurzem eine Menge Herzschmerz erspart, was die ältere DirectorySearcher-Methode teilweise verursacht hat. Lassen Sie den Rahmen strapazieren! Es gibt viele wirklich nützliche Artikel im Internet, wie zum Beispiel here.

Als Beispiel dafür, wie Principal zu verwenden, um Active Directory-Benutzer, versuchen Sie dies:

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

Während dieser Link, um die Frage beantworten kann, ist es besser, die wesentliche Teile der Antwort hier aufzunehmen und den Link zur Verfügung stellen als Referenz. Nur-Link-Antworten können ungültig werden, wenn sich die verknüpfte Seite ändert. - [Aus Bewertung] (/ review/low-quality-posts/13612911) – techspider

+0

Ja, Sie haben natürlich recht. Entschuldigung, ich werde die Antwort mit einem nützlichen Code aktualisieren. – DrMistry

+0

@DrMistry: Ein Kerl von Microsoft bat mich, DirectorySearcher zu verwenden, weil es flexibler ist. Das Problem ist, dass der Link auch die Frage nach dem Domänencontroller nicht beantwortet. Erinnern sich die Objekte in 'searchResults' an welchen DC sie das Objekt gefunden haben und verwenden dasselbe, wenn ich die gefundenen Objekte aktualisiere? Übrigens: Vorsicht bei der Verwendung von FindAll() Sie müssen die gefundenen Objekte beseitigen, sonst haben Sie ein Speicherleck. – Diver

Verwandte Themen