List FSMO roles

listFSMORoles.vbs
' 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

zurück