' 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 & "<blockquote><table border='1' cellpadding='6' cellspacing='0' style='border-collapse: collapse' bordercolor='#555555'>" & vbCrLf str_tableende = "</table></blockquote>" & vbCrLf & vbCrLf strErgebnis_HTML_fsmolist = "<h2>FSMO Rollen</h2>" & str_tablestart & _ "<tr><th>FSMO Rolle</th><th>Domain Controller</th></tr>" & _ "<tr><td>Schema Master</td><td>" & my_fsmo_schemamaster & "</td></tr>" & vbCrLf & _ "<tr><td>Domain Naming Master</td><td>" & my_fsmo_domainnamingmaster & "</td></tr>" & vbCrLf & _ "<tr><td>PDC Emulator</td><td>" & my_fsmo_pdc & "</td></tr>" & vbCrLf & _ "<tr><td>RID Master</td><td>" & my_fsmo_rid & "</td></tr>" & vbCrLf & _ "<tr><td>Infrastructure Master</td><td>" & my_fsmo_infrastructure & "</td></tr>" & 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 = "<h2>Domain Controller</h2>" & str_tablestart & _ "<tr><th>Domain Controller</th><th>FSMO Rollen</th><th align='center'>GC-Status</th></tr>" 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 = "<td><center>GC</center></td>" & vbCrLf ist_gc=1 Else str_ergebnis_current_gc = "<td><center>-</center></td>" & vbCrLf ist_gc=0 dc_ohne_gc_gefunden=1 End If ' Spalte mit FSMO Rollen str_ergebnis_current_fsmo = "<td>" if (strComputer = my_fsmo_schemamaster) Then _ str_ergebnis_current_fsmo = str_ergebnis_current_fsmo & "Schema Master<br>" if (strComputer = my_fsmo_domainnamingmaster) Then _ str_ergebnis_current_fsmo = str_ergebnis_current_fsmo & "Domain Naming Master<br>" if (strComputer = my_fsmo_pdc) Then _ str_ergebnis_current_fsmo = str_ergebnis_current_fsmo & "PDC-Emulator<br>" if (strComputer = my_fsmo_rid) Then _ str_ergebnis_current_fsmo = str_ergebnis_current_fsmo & "RID-Master<br>" if (strComputer = my_fsmo_infrastructure) Then If (ist_gc=0) Then str_ergebnis_current_fsmo = str_ergebnis_current_fsmo & "Infrastructure-Master<br>" Else str_ergebnis_current_fsmo = str_ergebnis_current_fsmo & "<strike>Infrastructure-Master</strike> (*)<br>" infrastructuremaster_deaktiviert=1 End If End If str_ergebnis_current_fsmo = str_ergebnis_current_fsmo & "</td>" & vbCrLf ' strComputer = "SRV01" ' Wscript.Echo "Location: " & objRecordSet.Fields("Location").Value str_ergebnis_current = "<tr><td><b>" & strComputer & "</b></td>" & _ str_ergebnis_current_fsmo & _ str_ergebnis_current_gc & _ "</tr>" & 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 & _ "<blockquote><table><tr>" & _ "<td>(*)</td>" & _ "<td>Infrastructure Master deaktiviert, da auf diesem System ein GC eingerichtet ist." & _ "<p>Dies ist kein Problem, wenn:</p>" & _ "<ul><li>Ihr AD aus einer einzelnen Domain besteht oder</li>" & _ "<li>alle DCs dieser Domain als GC konfiguriert sind (" & str_alle_dc_sind_gc & ")</li></ul></td>" & vbCrLf & _ "</tr></table></blockquote>" & vbCrLf End If ' Gesamtergebnis zusammensetzen strErgebnis_HTML = "<html>" & vbCrLf & "<head>" & vbCrLf strErgebnis_HTML = strErgebnis_HTML & "<STYLE type='text/css'>" & vbCrLf _ & "BODY {FONT-SIZE: 9pt; FONT-FAMILY: Arial,verdana; BACKGROUND-COLOR: #ffffff;}" & vbCrLf _ & "H1 {FONT-SIZE: 18pt; FONT-FAMILY: Arial,verdana;margin-top: 50px;}" & vbCrLf _ & "H2 {FONT-SIZE: 14pt; FONT-FAMILY: Arial,verdana;margin-top: 35px;}" & vbCrLf _ & "TD {FONT-SIZE: 9pt; FONT-FAMILY: Arial, verdana;text-align:left; vertical-align:top;}" & vbCrLf _ & "TH {FONT-WEIGHT: bold; FONT-SIZE: 9pt; BACKGROUND: #e0e0e0; FONT-FAMILY: Arial, verdana;text-align:left;}" & vbCrLf _ & "A:link{COLOR: #202080;text-decoration:none;font-weight: bold;}" & vbCrLf _ & "A:visited{COLOR: #202080;text-decoration:none;font-weight: bold;}" & vbCrLf _ & "A:active{COLOR: #202080;text-decoration:none;}" & vbCrLf _ & "A:hover{COLOR: #9090d0;}" & vbCrLf _ & "</STYLE>" & vbCrLf & "</head>" & vbCrLf & "<body>" & vbCrLf arrDomLevels = Split(DomainContainer, "DC=") strADsPath = Join(arrDomLevels, "") strADsPath = Replace(strADsPath, ",", ".") strErgebnis_HTML = strErgebnis_HTML & "<h1>Domain " & strADsPath & "</h1>" & vbCrLf & vbCrLf strErgebnis_HTML = strErgebnis_HTML & strErgebnis_HTML_fsmolist strErgebnis_HTML = strErgebnis_HTML & strErgebnis_HTML_dclist strErgebnis_HTML = strErgebnis_HTML & vbCrLf & "<hr><center><a href='http://www.netzprisma.de' target='_blank'>www.netzprisma.de</a></center>" & vbCrLf strErgebnis_HTML = strErgebnis_HTML & vbCrLf & "</body>" & vbCrLf & "</html>" & vbCrLf ' Ergebnis im IE anzeigen Set objExplorer = CreateObject("InternetExplorer.Application") objExplorer.Navigate "about:blank" objExplorer.Visible = 1 objExplorer.document.writeln(strErgebnis_HTML) objExplorer.Stop