' 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 Rolle | Domain 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 Controller | FSMO Rollen | GC-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 & _
"" & _
"(*) | " & _
"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 & _
"
" & 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