' FSMO Rollen ermitteln ' ' fsmo_anzeigen.vbs ' http://faq.netzprisma.de/?id=205003 ' (v2005090201) ' ' use at own risk ;-) ' Eine FSMO Rolle ermitteln ' Rückgabe: Name des Domain Controllers Function my_fsmo(str_fsmo_role) Set objRootDSE = GetObject("LDAP://rootDSE") Select Case str_fsmo_role Case "domainnamingmaster": Set obj_target = GetObject("LDAP://CN=Partitions," & objRootDSE.Get("configurationNamingContext")) Case "schemamaster": Set obj_target = GetObject("LDAP://" & objRootDSE.Get("schemaNamingContext")) Case "pdc": Set obj_target = GetObject("LDAP://" & objRootDSE.Get("defaultNamingContext")) Case "rid": Set obj_target = GetObject("LDAP://CN=RID Manager$,CN=System," & objRootDSE.Get("defaultNamingContext")) Case "infrastructure": Set obj_target = GetObject("LDAP://CN=Infrastructure," & objRootDSE.Get("defaultNamingContext")) Case Else: my_fsmo="???" return End Select str_current_fsmo = obj_target.Get("fSMORoleOwner") Set objNtds = GetObject("LDAP://" & str_current_fsmo) Set objComputer = GetObject(objNtds.Parent) ' Ergebnis in objComputer.Name z.B.: "CN=SRV01" ' -> wir brauchen nur den Servernamen, also ab Pos. #4 im String my_fsmo = Mid(objComputer.Name,4) End Function ' Welcher Server hat welche FSAMO Rolle? my_fsmo_schemamaster = my_fsmo("schemamaster") my_fsmo_domainnamingmaster = my_fsmo("domainnamingmaster") my_fsmo_pdc = my_fsmo("pdc") my_fsmo_rid = my_fsmo("rid") my_fsmo_infrastructure = my_fsmo("infrastructure") str_tablestart = vbCrLf & "
" & vbCrLf str_tableende = "
" & vbCrLf & vbCrLf strErgebnis_HTML_fsmolist = "

FSMO Rollen

" & str_tablestart & _ "FSMO RolleDomain Controller" & _ "Schema Master" & my_fsmo_schemamaster & "" & vbCrLf & _ "Domain Naming Master" & my_fsmo_domainnamingmaster & "" & vbCrLf & _ "PDC Emulator" & my_fsmo_pdc & "" & vbCrLf & _ "RID Master" & my_fsmo_rid & "" & vbCrLf & _ "Infrastructure Master" & my_fsmo_infrastructure & "" & vbCrLf & _ str_tableende ' Alle Domain Controller dieser Domain durchgehen Const ADS_SCOPE_SUBTREE = 2 Const NTDSDSA_OPT_IS_GC = 1 Set objConnection = CreateObject("ADODB.Connection") Set objCommand = CreateObject("ADODB.Command") objConnection.Provider = "ADsDSOObject" objConnection.Open "Active Directory Provider" Set rootDSE=GetObject("LDAP://RootDSE") DomainContainer = rootDSE.Get("defaultNamingContext") Set objCOmmand.ActiveConnection = objConnection objCommand.CommandText = "Select Name, Location " & _ "from 'LDAP://OU=Domain Controllers, " & DomainContainer & "' " & _ "where objectClass='computer'" objCommand.Properties("Page Size") = 1000 objCommand.Properties("Searchscope") = ADS_SCOPE_SUBTREE strErgebnis_HTML_dclist = "

Domain Controller

" & str_tablestart & _ "Domain ControllerFSMO RollenGC-Status" infrastructuremaster_deaktiviert=0 ' wurde ein deaktivierter IM gefunden? dc_ohne_gc_gefunden=0 ' Sind evtl. alle DCs dieser Domain ein GC? ' Alle Ergebnisse durchgehen Set objRecordSet = objCommand.Execute objRecordSet.MoveFirst Do Until objRecordSet.EOF strComputer = objRecordSet.Fields("Name").Value ' Ist dieser DC ein GC? ' Spalte mit GC-Information Set objRootDSE = GetObject("LDAP://" & strComputer & "/rootDSE") strDsServiceDN = objRootDSE.Get("dsServiceName") Set objDsRoot = GetObject("LDAP://" & strComputer & "/" & strDsServiceDN) intOptions = objDsRoot.Get("options") If intOptions And NTDSDSA_OPT_IS_GC Then str_ergebnis_current_gc = "
GC
" & vbCrLf ist_gc=1 Else str_ergebnis_current_gc = "
-
" & vbCrLf ist_gc=0 dc_ohne_gc_gefunden=1 End If ' Spalte mit FSMO Rollen str_ergebnis_current_fsmo = "" if (strComputer = my_fsmo_schemamaster) Then _ str_ergebnis_current_fsmo = str_ergebnis_current_fsmo & "Schema Master
" if (strComputer = my_fsmo_domainnamingmaster) Then _ str_ergebnis_current_fsmo = str_ergebnis_current_fsmo & "Domain Naming Master
" if (strComputer = my_fsmo_pdc) Then _ str_ergebnis_current_fsmo = str_ergebnis_current_fsmo & "PDC-Emulator
" if (strComputer = my_fsmo_rid) Then _ str_ergebnis_current_fsmo = str_ergebnis_current_fsmo & "RID-Master
" if (strComputer = my_fsmo_infrastructure) Then If (ist_gc=0) Then str_ergebnis_current_fsmo = str_ergebnis_current_fsmo & "Infrastructure-Master
" Else str_ergebnis_current_fsmo = str_ergebnis_current_fsmo & "Infrastructure-Master (*)
" infrastructuremaster_deaktiviert=1 End If End If str_ergebnis_current_fsmo = str_ergebnis_current_fsmo & "" & vbCrLf ' strComputer = "SRV01" ' Wscript.Echo "Location: " & objRecordSet.Fields("Location").Value str_ergebnis_current = "" & strComputer & "" & _ str_ergebnis_current_fsmo & _ str_ergebnis_current_gc & _ "" & vbCrLf ' Aktuelles Ergebnis zum Gesamtergebnis hinzufügen strErgebnis_HTML_dclist = strErgebnis_HTML_dclist & str_ergebnis_current objRecordSet.MoveNext Loop strErgebnis_HTML_dclist = strErgebnis_HTML_dclist & str_tableende if (infrastructuremaster_deaktiviert=1) Then If (dc_ohne_gc_gefunden=0) Then str_alle_dc_sind_gc = "was der Fall ist" Else str_alle_dc_sind_gc = "nicht alle DCs dieser Domain sind GC, evtl. die Rolle des Infr.Masters prüfen" End If strErgebnis_HTML_dclist = strErgebnis_HTML_dclist & _ "
" & _ "" & _ "" & vbCrLf & _ "
(*)Infrastructure Master deaktiviert, da auf diesem System ein GC eingerichtet ist." & _ "

Dies ist kein Problem, wenn:

" & _ "
  • Ihr AD aus einer einzelnen Domain besteht oder
  • " & _ "
  • alle DCs dieser Domain als GC konfiguriert sind (" & str_alle_dc_sind_gc & ")
" & vbCrLf End If ' Gesamtergebnis zusammensetzen strErgebnis_HTML = "" & vbCrLf & "" & vbCrLf strErgebnis_HTML = strErgebnis_HTML & "" & vbCrLf & "" & vbCrLf & "" & vbCrLf arrDomLevels = Split(DomainContainer, "DC=") strADsPath = Join(arrDomLevels, "") strADsPath = Replace(strADsPath, ",", ".") strErgebnis_HTML = strErgebnis_HTML & "

Domain " & strADsPath & "

" & vbCrLf & vbCrLf strErgebnis_HTML = strErgebnis_HTML & strErgebnis_HTML_fsmolist strErgebnis_HTML = strErgebnis_HTML & strErgebnis_HTML_dclist strErgebnis_HTML = strErgebnis_HTML & vbCrLf & "
www.netzprisma.de
" & vbCrLf strErgebnis_HTML = strErgebnis_HTML & vbCrLf & "" & vbCrLf & "" & vbCrLf ' Ergebnis im IE anzeigen Set objExplorer = CreateObject("InternetExplorer.Application") objExplorer.Navigate "about:blank" objExplorer.Visible = 1 objExplorer.document.writeln(strErgebnis_HTML) objExplorer.Stop