[green]'===============================================================================
'
' URLS: [URL unfurl="true"]http://www.activexperts.com/activmonitor/windowsmanagement/adminscripts/usersgroups/users/[/URL]
' [URL unfurl="true"]http://msdn2.microsoft.com/en-us/library/aa706128(VS.85).aspx[/URL]
'
' COMMENT: The script logs to CSV format whether the inheritance flag is
' enabled or disabled. Inheritance is typically only disabled on accounts that
' are subject to the 'adminSDHolder' (Enterprise, Domain, Schema Admins, etc...)
'
'===============================================================================
[/green]
Option Explicit
Dim sFilter, sAttributes, sDefaultNC, sQuery, iNtSecDescCont, sUserDN, sLog
Dim oRootDSE, oConnection, oCommand, oRecordSet, oUser, oNtSecDesc
Dim oFSO, oTSLog
Const SE_DACL_PROTECTED = &H1000
[green]' Bind to Active Directory so that future calls will not re-bind (more efficient)[/green]
Set oRootDSE = GetObject("LDAP://RootDSE")
[green]' Set up ADO Connection to Active Directory[/green]
Set oConnection = CreateObject("ADODB.Connection")
oConnection.Provider = "ADsDSOObject"
oConnection.Open "Active Directory Provider"
[green]' Set up ADO Command with typical properties, reference ADO connection[/green]
Set oCommand = CreateObject("ADODB.Command")
Set oCommand.ActiveConnection = oConnection
oCommand.Properties("Page Size") = 100
oCommand.Properties("Timeout") = 30
oCommand.Properties("Cache Results") = False
[green]' Prepare AD Query (Returns DNs of all users in AD)[/green]
sFilter = "(&(objectClass=user)(objectCategory=person))"
sAttributes = "distinguishedName"
sDefaultNC = oRootDSE.Get("defaultNamingContext")
sQuery = "<LDAP://" & sDefaultNC & ">;" & sFilter & ";" & sAttributes & ";subtree"
[green]' Execute query and return results to RecordSet object[/green]
oCommand.CommandText = sQuery
Set oRecordSet = oCommand.Execute
[green]' Open Output File[/green]
Set oFSO = CreateObject("Scripting.FileSystemObject")
Set oTSLog = oFSO.OpenTextFile("Output.csv",2,True)
[green]' Write CSV header line[/green]
oTSLog.WriteLine "DN,Inheritance"
[green]' Loop through records (User DNs)[/green]
Do Until oRecordSet.EOF
[green]' Copy user DN to short variable[/green]
sUserDN = oRecordSet.Fields("distinguishedName")
[green]' Start Data line for Output file[/green]
sLog = """" & sUserDN & """"
[green]' Bind to User object[/green]
Set oUser = GetObject("LDAP://" & sUserDN)
[green]' Retrieve Security Descriptor[/green]
Set oNtSecDesc = oUser.Get("ntSecurityDescriptor")
[green]' Acquire the SD Control Property to detect inheritance setting[/green]
iNtSecDescCont = oNtSecDesc.Control
If iNtSecDescCont And SE_DACL_PROTECTED Then
sLog = sLog & ",Disabled"
Else
sLog = sLog & ",Enabled"
End If
[green]' Write results to Output File[/green]
oTSLog.WriteLine sLog
[green]' Advance to next record in recordset[/green]
oRecordSet.MoveNext
Loop