How To Find Extended Rights that Apply to a Schema Class Object Using Visual Basic Script (302514)
The information in this article applies to:
- Microsoft Windows 2000 Advanced Server SP1
- Microsoft Windows 2000 Advanced Server SP2
- Microsoft Active Directory Services Interface, System Component
This article was previously published under Q302514 SUMMARY
The purpose of this article is to provide a method that employs Visual Basic Script to list all of the extended rights (controlAccessRight objects) whose AppliesTo attribute matches a given SchemaIDGUID of a specified SchemaClass object. The sample in this article provides command line help that demonstrates how to search for all extended rights that apply to the User class.
MORE INFORMATION
Visual Basic Script does not provide a simple method for working with a variant array of bytes, so a method to transform the binary GUID into a string GUID suitable for an LDAP query was needed. The Array Converter sample exposes a method that can convert binary data into its hex string equivalent. This Visual Basic Script takes advantage of this capability and then reorders the hex string into a form that can be used in an LDAP query to search for the matching appliesTo properties.
This conversion takes place in the FlipOctetGuidToTextGuid function provided in the "Visual Basic Script Code" section of this article.
The code follows a very simple algorithm:
- Use the RootDSE object to obtain information about the defaultNamingContext, schemaNamingContext, and configurationNamingContext.
- Bind to the specified schema object and retrieve the schemaIDGUID property.
- Convert the schemaIDGUID into a string and manipulate the bytes.
- Perform an LDAP dialect query on the extended rights container by searching for the appliesTo property that matches the given schemaIDGUID.
- Display the results.
Visual Basic Script Code
Const ADSI_PROVIDER = "ADSDSOObject"
Const ADSI_PROV_NAME = "Active Directory Provider"
'<<<<<<<<<<<<<<<<<<<<<< MAIN VBS>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
'
'Requires that ADSEncoder.DLL and ADS.DLL be registered in order for this
' script to execute. ADSEncoder provides a set of interfaces that
' can be used to binary encode the guid string for use in an LDAP query.
'
' ADs.DLL provides some useful string conversion utilities.
'
Dim RootDSEStr
Dim oEncoder
Dim oConverter
Dim objpath
Dim oSchemaObj
Dim oRootDSE
Dim flipstring
Dim rightsguids()
'
' Validate the arguments
' See the DisplayUsage subroutine for details on calling args
'
set args = Wscript.Arguments
if( args.Count < 4 ) then
WScript.Echo "Error: Wrong Number of arguments"
call DisplayUsage( )
WScript.quit 0
end if
'
userID = args(1)
Password = args(2)
ldpServer = args(3)
'
' Bind to the rootDSE object for the domain to objtain
' The Default Naming Context
' and
' The Schema Naming Context to build the ADsPath for
' the SchemaClass object
'
Set oRootDSE = GetObject("LDAP://RootDSE")
objpath = "LDAP://cn=" & args(0) & "," & oRootDSE.Get("SchemaNamingContext")
Wscript.Echo "Binding to: " & vbCrLf & objPath
Set oSchemaObj = GetObject(objpath)
RootDSEStr = oRootDSE.Get("DefaultNamingContext")
'
' Retrieve the SchemaIDGuid and convert it to a form
' that can be used in an LDAP query.
' Flip the binary GUID around so we can work with it...
'
flipstring = FlipOctetGuidToTextGuid(oSchemaObj.Get("SchemaIDGUID"))
'
' Find all of the controlAccessRights objects whose AppliesTo attribute
' contains the specified guid and return an array of strings that contain
' the RightsGuid field of each object found that meets the match
'
FindRightsGuidsFromSchemaIDGuid flipstring, rightsguids, userID, Password, ldpServer
'
' Display the results
'
WScript.Echo "AccessControlRight Objects ( Extended Rights or Property Sets) Found: "
For i = LBound(rightsguids) To UBound(rightsguids)
WScript.Echo rightsguids(i)
Next
'
'<<<<<<<<<<<<<<<<<<<<<<< END MAIN VBS >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
'
Function FlipOctetGuidToTextGuid(octet )
Dim cnv
Dim rByte()
Dim guidByte()
'
' Due to a limitation in VBS, we need to convert
' the variant array of bytes into its string counter part.
' Then we must flip the bytes around to get them into the
' proper order and format it the string to match
' the GUID string in the AppliesTo attribute of an AccessControlRight
' object
'
set cnv = CreateObject("ADs.ArrayConvert")
tmpGuid = cnv.CvOctetStr2vHexStr(octet)
octetStr = Mid(tmpGuid, 7, 2) ' 0
octetStr = octetStr + Mid(tmpGuid, 5, 2) ' 1
octetStr = octetStr + Mid(tmpGuid, 3, 2) ' 2
octetStr = octetStr + Mid(tmpGuid, 1, 2) ' 3
octetStr = octetStr + Mid(tmpGuid, 11, 2) ' 4
octetStr = octetStr + Mid(tmpGuid, 9, 2) ' 5
octetStr = octetStr + Mid(tmpGuid, 15, 2) ' 6
octetStr = octetStr + Mid(tmpGuid, 13, 2) ' 7
'
' The remaining segments are the same...
'
octetStr = octetStr + Mid(tmpGuid, 17, Len(tmpGuid))
'
' Add the '-'s
'
guidStr = Mid(octetStr, 1, 8) & "-" & Mid(octetStr, 9, 4) & "-" & Mid(octetStr, 13, 4) & "-" & Mid(octetStr, 17, 4) & "-" & Mid(octetStr, 21, 15)
'
' Return the GUID in the form that it can be used in an LDAP
' query to find matching AppliesTo GUIDs in the Extended-Rights container
'
FlipOctetGuidToTextGuid = guidStr
End Function
'
' FindRightsGuidFromSchemaIDGuid uses the ADSI ADO provider
' to perform and LDAP dialect query against the Extended-Rights container,
' Searching for all of the AccessControlRight objects whose AppliesTo property contains
' the specified GUID in AppliesToGuid parameter.
'
' The subroutine returns an array of strings containing the Common Name and
' LDAP Display Name for each AccessControlRight object found.
'
'
Sub FindRightsGuidsFromSchemaIDGuid(appliesToGuid, RetGuids, userid, password, ldpserver)
Dim strQuery
Dim varName
Dim lErrorNumber
Dim strTotal
Dim cmd
Dim lcnt
Dim tmp
Dim m_pConn
Dim m_recordSet
Set cmd = CreateObject("ADODB.Command")
Set m_pConn = CreateObject("ADODB.Connection")
m_pConn.Provider = ADSI_PROVIDER
m_pConn.Properties("Encrypt Password") = False
m_pConn.Properties("User ID") = userid
m_pConn.Properties("Password") = password
'
' Set a color for each group
'
m_pConn.Open ADSI_PROV_NAME
Set cmd.ActiveConnection = m_pConn
strQuery = "<LDAP://" & ldpserver & "/CN=Extended-Rights,CN=Configuration," & RootDSEStr & ">;(appliesTo=" & appliesToGuid & ");RightsGuid,cn,displayname;subtree"
cmd.CommandText = strQuery
cmd.Properties("Page Size") = 10
Set m_recordSet = cmd.Execute
rCount = 0
While (Not m_recordSet.EOF)
rCount = rCount + 1
ReDim Preserve RetGuids(rCount)
tmpStr = m_recordSet.Fields("cn") & " " & Chr(34) & m_recordSet.Fields("displayName") & Chr(34)
RetGuids(rCount - 1) = tmpStr
m_recordSet.MoveNext
Wend
ReDim Preserve RetGuids(rCount - 1)
End Sub
'
' DisplayUsage provides limited help information for the script.
'
'
Sub DisplayUsage ( )
'
' This VBS requires 4 arguments in the following order:
' 1. CN for the SchemaClassObject "CN=" prefix
' 2. UserID use for credentials for the ADO query
' 3. Password for the UserID
' 4. NetBios form of the LDAP server to target
'
' ie: props user "Domain\User" "Passward" MyServer
'
' Will try to display all of the AccessControlRight objects whose
' AppliesTo property matches the SchemaIDGuid of the schemaClass object
' user using the credentials of Domain\User to bind,
' to query the LDAP server myServer
'
' 1--------0---------2---------3---------4---------5---------6---------7--------*"
WScript.Echo "appliesto.VBS ->"
WScript.Echo "Displays a list of AccessControlRight objects whose AppliesTo property"
WScript.Echo "Matches the SchemaIDGUID property of the provided SchemaClass object"
WScript.Echo
WScript.Echo "USAGE: Props Schema_Class_Object UserID Password LDAP_Server"
WScript.Echo "WHERE:"
WScript.Echo " Schem_Class_Object - CN of SchemaClass object to find AccessControlRight objects"
WScript.Echo " UserID - User credentials to use for the ADO query"
WScript.Echo " Password - Password for UserID"
WScript.Echo " LDAP_Server - can be the NetBIOS or DNS name for the LDAP server to"
WScript.Echo " target for the LDAP ADO query" & vbCrLf
WScript.Echo " Example: To list Extended Rights associated with user class object"
WScript.Echo " using the credentials for MyDomain\JoeB against the AD server"
WScript.Echo " LDAPServer the command line would be:"
WScript.Echo "props user MyDomain\JoeB PWD_for_JoeB LDAPServer"
WScript.Echo "<--------------------IMPORTANT NOTE :-------------------->"
WScript.Echo " ADsEncoder.Dll and ADS.DLL must be registered using RegSvr32 in order for"
WScript.Echo " this script to execute successfully"
end Sub
REFERENCESFor additional information on ADS.dll and ArrayConvert.exe, click the article number below
to view the article in the Microsoft Knowledge Base:
250344 SAMPLE: ARRAYCONVERT.EXE Variant Conversion Functions
For more information on controlAccessRight objects, see the following MSDN Library topics:
The ADsEncoder.dll is part of the ADSI resource kit that is found in the Platform SDK. The Platform SDK can be downloaded from the Platform SDK Update Center:
Modification Type: | Minor | Last Reviewed: | 7/1/2004 |
---|
Keywords: | kbDSWADSI2003Swept kbhowto KB302514 kbAudDeveloper |
---|
|