FSMO Roles ermitteln

Mit dem folgenden Skript können die FSMO (Flexible Single Master Operation) Inhaber einer Active Directory Domäne ermittelt werden.

Die FSMO Rollen "Schema Master" und "Domain Naming Master" kommen in jeder AD Gesamtstruktur insgesamt nur einmal vor. Die FSMO Rollen "PDC Emulator", "RID Master" und "Infrastructure Master" kommen in jeder AD Domäne innerhalb der Gesamtstruktur nur einmal vor.

On Error Resume Next
Dim ADOconnObj, strADOquery, oRoot, oRS
Dim oFSM,oCompNTDS, oComp, strDomainDN
Dim fsmoPDC, fsmoRID, fsmoInfra, fsmoSchem, fsmoNam

Set oRoot = GetObject("LDAP://rootDSE")
If Err.Number Then
    Print Err.Number, " - Schwerer Fehler bei oRoot = GetObject()",0
    WScript.quit
End If
strDomainDN = oRoot.Get("defaultNamingContext")
strDomainDN = InputBox("FSMO Roles for Domain:","LDAP-strDomainDN",strDomainDN)
WScript.echo "Ermittle FSMO-Rollen für " & strDomainDN & VbCrLf

Set ADOconnObj = CreateObject("ADODB.Connection")
ADOconnObj.Provider = "ADSDSOObject"
ADOconnObj.Open "ADs Provider"


'PDC FSMO
strADOquery = "<LDAP://" & strDomainDN & ">;(&(objectClass=domainDNS) _
    (fSMORoleOwner=*));adsPath;subtree"
fsmoPDC = "PDC: " & GetRoleOwner(strADOquery) & vbCRLF

'Rid FSMO
strADOquery = "<LDAP://" & strDomainDN & ">;(&(objectClass=rIDManager) _
    (fSMORoleOwner=*));adsPath;subtree"
fsmoRID = "RID: " & GetRoleOwner(strADOquery) & vbCRLF

'Infrastructure FSMO
strADOquery = "<LDAP://" & strDomainDN & ">;(&(objectClass=infrastructureUpdate) _
    (fSMORoleOwner=*));adsPath;subtree"
fsmoInfra = "Infra: " & GetRoleOwner(strADOquery) & vbCRLF

'Schema FSMO
strADOquery = "<LDAP://" & oRoot.Get("schemaNamingContext") & ">;(&(objectClass=dMD) _
    (fSMORoleOwner=*));adsPath;subtree"
fsmoSchem = "Schema: " & GetRoleOwner(strADOquery) & vbCRLF

'Domain Naming FSMO
strADOquery = "<LDAP://" & oRoot.Get("configurationNamingContext") & ">;(& _
     (objectClass=crossRefContainer)(fSMORoleOwner=*));adsPath;subtree"
fsmoNam = "Naming: " & GetRoleOwner(strADOquery) & vbCRLF

MsgBox fsmoPDC & fsmoRID & fsmoInfra & fsmoSchem & fsmoNam,0 ,"FSMO-Roles for " & _
    strDomainDN


'****************************
'* Function GetRoleOwner()
'* Purpose:    FSMO Rolle holen
'* Input:    ADO Query String
'* Output:    Hostname of Server
'****************************
Function GetRoleOwner(ByVal strADOquery)
    On Error Resume Next
    Set oRS = ADOconnObj.Execute(strADOquery)
    Set oFSM = GetObject(oRS.Fields(0).Value)
    Set oCompNTDS = GetObject("LDAP://" & oFSM.fSMORoleOwner)
    Set oComp = GetObject(oCompNTDS.Parent)
    GetRoleOwner = oComp.dnsHostName
End Function

Dieses komplette lauffähige Skript nutzt ADO (ActiveX Data Object), um Active Directory Informationen über die FSMO Rollen zu bekommen. Ein ADO Querystring entspricht in der Syntax einer SQL Abfrage.

Download GetFSMO.vbs

AD - Scripting Basics