Posting & Help REQ - Active Directory Reporting Script - pls help add to it

Tech-Archive recommends: Repair Windows Errors & Optimize Windows Performance

From: NoNameHere (recpharm_at_hotmail.com)
Date: 05/30/04


Date: 29 May 2004 21:17:34 -0700

I started writing a script to make a basic HTML report of my active
directory. Sort of like an overview of the config. I stole all of
the code, and put it into one script (scriptmonkey that I am). Can
anyone think of anything else to add? If so, pls post.

' ************************
' Domain Report Script
' Version: 1.0
' Creation Date: 5/29/04
' Last Modified Date: 5/29/04
' ************************
'Option Explicit
On Error Resume Next

' Variables you want to modify
outdir = "c:\temp\"
strDomain = "acme.com" ' e.g. rallencorp.com

' Variables you don't want to modify
Dim DomainList(1,20)
dc = 0

' Next, open HTML file for writing
Const ForWriting = 2
outFile = outdir & GetCurrDate() & "_" & GetCurrTime() & ".htm"
Set fs = CreateObject ("Scripting.FileSystemObject")
Set f = fs.OpenTextFile (outfile, ForWriting, True)

'
' Output a Report Header
'
' Output the html headers first
'
a1="<!DOCTYPE HTML PUBLIC ""-//W3C//DTD HTML 4.01 Transitional//EN"">"
a2="<html>"
a3="<head>"
a4="<title>Domain Report Output for " & strDomain & "</title>"
a5="<meta http-equiv=""Content-Type"" content=""text/html;
charset=iso-8859-1"">"
a6="</head>"
a7="<body>"
a8="<p><font size=""4"" face=""Comic Sans MS"" FONT
COLOR=""#ff0000"">Domain Report Output for " & strDomain &
"</font></p>"
a9="<table width=""90%"" border=""1"">"

f.WriteLine a1
f.WriteLine a2
f.WriteLine a3
f.WriteLine a4
f.WriteLine a5
f.WriteLine a6
f.WriteLine a7
f.WriteLine a8
f.WriteLine a9

'
' This code prints out the forest tree hierarchy
'
f.Writeline "<p><font size=""3"" face=""Comic Sans MS"">Forest Domain
Hierarchy</font></p>"
set objRootDSE = GetObject("LDAP://RootDSE")
strBase = "<LDAP://cn=Partitions," & _
              objRootDSE.Get("ConfigurationNamingContext") & ">;"
strFilter = "(&(objectcategory=crossRef)(systemFlags=3));"
strAttrs = "name,trustParent,distinguishedName;"
strScope = "onelevel"

set objConn = CreateObject("ADODB.Connection")
objConn.Provider = "ADsDSOObject"
objConn.Open "Active Directory Provider"
set objRS = objConn.Execute(strBase & strFilter & strAttrs & strScope)
objRS.MoveFirst

set dicSubDomainTrue = CreateObject("Scripting.Dictionary")
set dicDomainHierarchy = CreateObject("Scripting.Dictionary")
while not objRS.EOF
   if objRS.Fields("trustParent").Value <> "" then
      dicSubDomainTrue.Add objRS.Fields("name").Value, 0
      set objDomainParent = GetObject("LDAP://" &
objRS.Fields("trustParent").Value)
      dicDomainHierarchy.Add objRS.Fields("name").Value,
objDomainParent.Get("name")
   else
      dicSubDomainTrue.Add objRS.Fields("name").Value, 1
   end if
   objRS.MoveNext
wend

for each strDomain in dicSubDomainTrue
  if dicSubDomainTrue(strDomain) = 1 then
            dc = dc+1
           DisplayDomains strDomain, "", dicDomainHierarchy
    end if
next

'
' This code prints out a list of global catalogs for the forest
'
f.Writeline "<p><font size=""3"" face=""Comic Sans MS"">Global Catalog
List for Forest</font></p>"
set objRootDSE = GetObject("LDAP://" & DomainList(1,0) & "/" &
"RootDSE")
strADsPath = "<LDAP://" & objRootDSE.Get("configurationNamingContext")
& ">;"
strFilter = "(&(objectcategory=ntdsdsa)(options=1));"
strAttrs = "distinguishedname;"
strScope = "SubTree"

set objConn = CreateObject("ADODB.Connection")
objConn.Provider = "ADsDSOObject"
objConn.Open "Active Directory Provider"
set objRS = objConn.Execute(strADsPath & strFilter & strAttrs &
strScope)
objRS.MoveFirst
while not objRS.EOF
    set objNTDS = GetObject("LDAP://" & objRS.Fields(0).Value)
    set objServer = GetObject( objNTDS.Parent )
    f.Writeline objServer.Get("dNSHostName")
    objRS.MoveNext
wend

'
' This code prints out any domain trusts
'
f.Writeline ""
f.Writeline "<p><font size=""3"" face=""Comic Sans MS"">Domain
Trusts</font></p>"
f.Writeline ""
set objWMI = GetObject("winmgmts:\\" & strDomain & _
                       "\root\MicrosoftActiveDirectory")
set objTrusts = objWMI.ExecQuery("Select * from
Microsoft_DomainTrustStatus")
for each objTrust in objTrusts
    f.Writeline objTrust.TrustedDomain
    f.Writeline " TrustedAttributes: " & objTrust.TrustAttributes &
"<BR>"
    f.Writeline " TrustedDCName: " & objTrust.TrustedDCName &
"<BR>"
    f.Writeline " TrustedDirection: " & objTrust.TrustDirection &
"<BR>"
    f.Writeline " TrustIsOk: " & objTrust.TrustIsOK & "<BR>"
    f.Writeline " TrustStatus: " & objTrust.TrustStatus &
"<BR>"
    f.Writeline " TrustStatusString: " & objTrust.TrustStatusString &
"<BR>"
    f.Writeline " TrustType: " & objTrust.TrustType & "<BR>"
    f.Writeline ""
next

'
' This code prints out a list of domain controllers
'
f.Writeline ""
f.Writeline "<p><font size=""3"" face=""Comic Sans MS"">Domain
Controller List</font></p>"
set objRootDSE = GetObject("LDAP://" & strDomain & "/RootDSE")
set objDomain = GetObject("LDAP://" &
objRootDSE.Get("defaultNamingContext"))
strMasteredBy = objDomain.GetEx("masteredBy")
for each strNTDSDN in strMasteredBy
   set objNTDS = GetObject("LDAP://" & strNTDSDN)
   set objServer = GetObject(objNTDS.Parent)
   strDC = objServer.Get("dNSHostName")
   f.Writeline strDC & " Site:"
   set objRootDSE = GetObject("LDAP://" & strDC & "/RootDSE")
   set objNTDS = GetObject("LDAP://" &
objRootDSE.Get("dsServiceName"))
   set objSite = GetObject(GetObject(GetObject(objNTDS.Parent).Parent).Parent)
   f.Writeline objSite.Get("cn") & "<BR>"
   strServer = strDC
          set objDNS = GetObject("winMgmts:\\" & strServer &
"\root\MicrosoftDNS")
          set objDNSServer = objDNS.Get("MicrosoftDNS_Server.Name="".""")
          set objZones = objDNS.ExecQuery("Select * from MicrosoftDNS_Zone "
& _
                                          "Where DnsServerName = '" & _
                                          objDNSServer.Name & "'")
          f.Writeline "DNS Zones on " & objDNSServer.Name & "<BR>"
          for each objZone in objZones
          f.Writeline " " & objZOne.Name & "<BR>"
        next
next

'
' Print list of FSMO role holders
'
f.Writeline ""
f.Writeline "<p><font size=""3"" face=""Comic Sans MS"">FSMO Role
Holder List</font></p>"
set objRootDSE = GetObject("LDAP://" & strDomain & "/RootDSE")
strDomainDN = objRootDSE.Get("defaultNamingContext")
strSchemaDN = objRootDSE.Get("schemaNamingContext")
strConfigDN = objRootDSE.Get("configurationNamingContext")

' PDC Emulator
set objPDCFsmo = GetObject("LDAP://" & strDomainDN)
f.Writeline "PDC Emulator: " & objPDCFsmo.fsmoroleowner & "<BR>"

' RID Master
set objRIDFsmo = GetObject("LDAP://cn=RID Manager$,cn=system," &
strDomainDN)
f.Writeline "RID Master: " & objRIDFsmo.fsmoroleowner & "<BR>"

' Schema Master
set objSchemaFsmo = GetObject("LDAP://" & strSchemaDN)
f.Writeline "Schema Master: " & objSchemaFsmo.fsmoroleowner & "<BR>"

' Infrastructure Master
set objInfraFsmo = GetObject("LDAP://cn=Infrastructure," &
strDomainDN)
f.Writeline "Infrastructure Master: " & objInfraFsmo.fsmoroleowner &
"<BR>"

' Domain Naming Master
set objDNFsmo = GetObject("LDAP://cn=Partitions," & strConfigDN)
f.Writeline "Domain Naming Master: " & objDNFsmo.fsmoroleowner &
"<BR>"

'
' list of GPOs in the domain
'
f.Writeline ""
f.Writeline "<p><font size=""3"" face=""Comic Sans MS"">GPO List for
Domain</font></p>"
set objGPM = CreateObject("GPMgmt.GPM")
set objGPMConstants = objGPM.GetConstants()
  
' Initialize the Domain object
set objGPMDomain = objGPM.GetDomain(strDomain, "",
objGPMConstants.UseAnyDC)

' Create an empty search criteria
set objGPMSearchCriteria = objGPM.CreateSearchCriteria
set objGPOList = objGPMDomain.SearchGPOs(objGPMSearchCriteria)

' Print the GPOs.
f.Writeline "Found " & objGPOList.Count & " GPOs in " & strDomain &
":"
for each objGPO in objGPOList
   f.Writeline " " & objGPO.DisplayName & "<BR>"
next

' Close HTML file and Exit
f.Writeline "</body>"
f.Writeline "</html>"
f.Close
wscript.echo "Done"

'
' Functions
'
Function DisplayDomains ( strDomain, strSpaces, dicDomainHierachy )
   f.WriteLine strSpaces & strDomain & "<BR>"
   domainlist(1,dc) = strSpaces & strDomain
   for each strD in dicDomainHierarchy
      if dicDomainHierarchy(strD) = strDomain then
         DisplayDomains strD, " " & strSpaces, dicDomainHierarchy
      end if
   next
End Function

Function GetCurrDate()
On Error Resume Next
   GetCurrDate = DatePart("yyyy", Now) & "-" & DatePart("m", Now) &
"-" & DatePart("d", Now)
End Function
Function GetCurrTime()
On Error Resume Next
   GetCurrTime = DatePart("h", Now) & "-" & DatePart("n", Now) & "-" &
DatePart("s", Now)
End Function



Relevant Pages

  • Cant make this page work
    ... I can't make this script work properly. ... The script at the bottom of the html page ... Does someone have a perl ... sub output_trace_headers { ...
    (comp.lang.javascript)
  • Re: Use with Action "Send Reply" Dont Go
    ... Set Up an HTML Signature ... Go to Tools/Signatures in Entourage, ... "Auto-Reply HTML" or something similar. ... script in the Entourage Script Menu Items folder. ...
    (microsoft.public.mac.office.entourage)
  • Validating to a higher 4.01 standard (long)
    ... The next step is to copy these HTML documents to a new directory (so you do ... onmousedown %Script; #IMPLIED ... datafld CDATA #IMPLIED ... href %URI; #IMPLIED ...
    (alt.html)
  • Re: Twee Cheerz fur Unka Dan!
    ... Finish the script that will allow review and selection of messages ... Write a script to convert special characters to HTML entities (half ... Fangu! ...
    (rec.pets.cats.community)
  • Re: Add AD group to local Admin via user interaction
    ... so, then strUserName must be the NetBIOS name of a group, but you specify ... Dim strComputer, strDomain, strDomainGroup, objLocalGroup ... This si what I want the script to do- It will be run from an HTA, ...
    (microsoft.public.windows.server.scripting)