Wo ist mein DC?
Wie findet eine Workstation den optimalen Domänencontroller für die Anmeldung? Über den „Domain Controller Locator“ Prozess...
Eine kurze Anmerkung zum Thema Caching vorneweg: Prinzipiell berücksichtig jede Workstation (und jeder Mitgliedsserver) zuerst den vom letzten Kontakt gecachten Domänencontroller. Das geht allerdings nur, solange die Workstation nicht neu gestartet wird. Das löscht den Cache. Für den Prozess „Anmeldung“ gibt es also keine Möglichkeit gecachete Informationen zu verwenden. Was man trotzdem beachten sollte: Wenn ein Domänencontroller über eine längere Zeit abgeschaltet wird, schalten die Domänenmitglieder auf einen anderen verfügbaren Domänencontroller um, der dadurch unter Last gerät. Wird der Original DC wieder online genommen, so wird er immer noch nicht angesprochen, solange der Cache auf den Arbeitsplätzen nicht gelöscht wird. Deshalb hat der cache nur eine Lebensdauer von 30 Minuten.
Wie findet nun der Arbeitsplatz bei der Anmeldung den zugehörigen Domänencontroller?
Der erste Schritt ist eine gezielte Anfrage nach dem Domänencontroller für den aktuellen Standort des Arbeitsplatzes.
Die entsprechende API heisst DSGetDCName. DSGetDCName akzeptiert einige Optionen, die das Ergebnis des Aufrufs maßgeblich beeinflussen. Die Option die hier spezifiziert wird ist DS_TRY_NEXTCLOSEST_SITE. Diese Option sucht ebenso erst in der lokalen Site. Falls da kein DC gefunden werden kann. beschafft sich der Domänencontroller über die APIs DSBindToISTG die Topologieinformationen und DSQuerySitesByCost den „nächst besten Standort“.
Falls das alles zu nichts führt fragt der Arbeitsplatz nach allen verfügbaren Domänen Controllern. Sollte der Prozess irgendwann erfolgreich sein landet der gefunden Domänencontroller im Cache.
Um sicherzustellen, dass ein „günstiger“ Domänencontroller sich im DNS für einen „leeren“ Standort registriert muss „AutoSiteCoverage“ angeschaltet sein.
Falls man die „Coverage“ nicht berechnen, sondern selbst vorgeben möchte, ist „SiteCoverage“ der richtige Weg.
Sollte es in dem Umfeld zu Unstimmigkeiten kommen kann man über „nltest /dsgetsitecov“, „nltest /dsgetsite“ und „nltest /dsgetdc:domainname /avoidself“ Informationen über die aktuelle Coverage erhalten. Natürlich gibt es DCGetDCName auch als managed code zum selbstanprogrammieren, wenn die Funktionalität für eigene Programme benötigt wird. (System.DirectoryServices.ActiveDirectory Namespace)
Auch ein hübscher Knowledgebase Artikel existiert: How to optimize the location of a domain controller or global catalog that resides outside of a client's site