Link to home
Start Free TrialLog in
Avatar of amd599
amd599Flag for United Kingdom of Great Britain and Northern Ireland

asked on

Modifications to VBScript, adding users to security group based on OU - My first post!

I've searched through hundreds of forums for days on end and FINALLY found this absolutely amazing script written by Matthew Beattie and it works perfectly. The one thing is, I want to have this script run every 6 hours and have the 2 prompts suppressed. You'll see that the last 15-20 lines of code are for 2 message boxes to appear. The first is when the process starts to let you know that it's actually started and the 2nd message box is to let you know that the process finished successfully.

I tried to comment out these lines of code and just run the script but it didn't work. I want to suppress these message boxes so i can have the script run every 6 hours or so and be completely automated. Any help is appreciated.

Thanks.
'---------------------------------------------------------------------------------------------------------------------------- 
'Script Name : AddUsersToGroup.vbs      
'Author      : Matthew Beattie      
'Created     : 06/05/09      
'Description : This script adds all users within an Organizational Unit to an Active Directory security group.
'---------------------------------------------------------------------------------------------------------------------------- 
'Initialization  Section      
'---------------------------------------------------------------------------------------------------------------------------- 
Option Explicit      
Dim objDictionary, objFSO, scriptBaseName, scriptPath, scriptLogPath   
On Error Resume Next  
   Set objDictionary = NewDictionary   
   Set objFSO        = CreateObject("Scripting.FileSystemObject")      
   scriptBaseName    = objFSO.GetBaseName(Wscript.ScriptFullName)   
   scriptPath        = objFSO.GetFile(Wscript.ScriptFullName).ParentFolder.Path   
   scriptLogPath     = scriptPath & "\" & scriptBaseName   
   If Err.Number <> 0 Then     
      Wscript.Quit      
   End If     
On Error Goto 0      
'---------------------------------------------------------------------------------------------------------------------------- 
'Main Processing Section      
'---------------------------------------------------------------------------------------------------------------------------- 
On Error Resume Next     
   ProcessScript 
   If Err.Number <> 0 Then     
      Wscript.Quit      
   End If     
On Error Goto 0      
'---------------------------------------------------------------------------------------------------------------------------- 
'Main Processing Section      
'---------------------------------------------------------------------------------------------------------------------------- 
Function ProcessScript
   Dim domainName, ouPath, groupName, ldapQuery
   Dim userADsPaths, groupADsPaths, groupADsPath, group, i
   PromptScriptStart
   ouPath    = "OU=ABC,OU=Users,OU=MyBusiness"		
   groupName = "ABC Security Group"
   '-------------------------------------------------------------------------------------------------------------------------
   'Get the distinguished Name of the domain.
   '-------------------------------------------------------------------------------------------------------------------------
   If Not GetDomainName("ldap", domainName) Then     
      Exit Function     
   End If
   '-------------------------------------------------------------------------------------------------------------------------
   'Perform an LDAP query to search for all user objects within the Organizational Unit specified by the "ouPath" variable.
   '-------------------------------------------------------------------------------------------------------------------------
   ldapQuery = "Select distinguishedName From 'LDAP://" & ouPath & "," & domainName & "' Where objectCategory = 'user'"
   If Not GetADObjectsADsPaths(userADsPaths, ldapQuery) Then
      Exit Function
   End If
   '-------------------------------------------------------------------------------------------------------------------------
   'Perform an LDAP query to search for adsPath of the group to add all the users to.
   '-------------------------------------------------------------------------------------------------------------------------
   ldapQuery = "Select distinguishedName From 'LDAP://" & _
                domainName & "' Where objectCategory = 'group' And sAMAccountName = '" & groupName & "'"
   If Not GetADObjectsADsPaths(groupADsPaths, ldapQuery) Then
      Exit Function
   End If
   '-------------------------------------------------------------------------------------------------------------------------
   'Ensure that the value of the groupName variable matches the value in the array of groups returned from the ldap query.
   '-------------------------------------------------------------------------------------------------------------------------
   For i = 0 To UBound(groupADsPaths)
      group = Replace(Split(groupADsPaths(i), ",OU=")(0), "LDAP://CN=", "")
      If StrComp(group, groupName, vbTextCompare) = 0 Then
         groupADsPath = groupADsPaths(i)
         Exit For
      End If
   Next
   '-------------------------------------------------------------------------------------------------------------------------
   'Add the Array of Active Directory users to the security group.
   '-------------------------------------------------------------------------------------------------------------------------
   If Not AddGroupMembers(groupADsPath, userADsPaths) Then
      Exit Function
   End If
   PromptScriptEnd      
End Function   
'---------------------------------------------------------------------------------------------------------------------------- 
'Name       : GetDomainName -> Gets the name of the domain based on the input parameter parsed to the function.   
'Parameters : format        -> Defines the naming format the function returns. This can be:   
'           :               -> "dns"       : = microsoft.com   
'           :               -> "ldap"      : = DC=microsoft,DC=com   
'           :               -> "netbios"   : = MICROSOFT   
'           : result        -> Input/outup : The name of the domain in the input specified format.   
'Return     : GetDomainName -> Returns True and the Domain Name in the input format specified otherwise returns False.   
'---------------------------------------------------------------------------------------------------------------------------- 
Function GetDomainName(format, result)   
   Const AdsNameInitTypeGC = 3   
   Const AdsNameTypeNT4    = 3   
   Const AdsNameType1779   = 1   
   GetDomainName           = False  
   Dim domain, netbios   
   Dim objTranslate   
   On Error Resume Next  
      Set objTranslate = CreateObject("NameTranslate")   
      If Err.Number <> 0 Then  
         Exit Function  
      End If  
      domain = GetObject("LDAP://RootDSE").Get("DefaultNamingContext")   
      If Err.Number <> 0 Then  
         Exit Function  
      End If  
   On Error Goto 0   
   Select Case Lcase(format)   
      Case "ldap"  
         result = domain   
      Case "dns"  
         result = Mid(Replace(domain, ",DC=", "."), 4)   
      Case "netbios"  
         objTranslate.Init AdsNameInitTypeGC, ""  
         objTranslate.Set AdsNameType1779, domain 'GetDomainName("ldap")   
         netbios = Left(objTranslate.Get(AdsNameTypeNT4), Len(objTranslate.Get(AdsNameTypeNT4)) -1)   
         If Err.Number <> 0 Then  
            Exit Function  
         End If  
         result = netbios            
   End Select  
   GetDomainName = True  
End Function
'----------------------------------------------------------------------------------------------------------------------------
'Name       : GetADObjectsADsPaths -> Searches Active Directory for the objects specified in the LDAP query and 
'           :                      -> returns and Array of the object adsPaths.
'Parameters : adsPaths             -> Output: An array. Each element of the array contains the ADsPath of an Object found.
'           : ldapQuery            -> String contain the LDAP query to process.
'Return     : GetADObjectsADsPaths -> Returns True and an Array containing the ADsPaths of the objects returned from the
'           :                      -> LDAP Query otherwise returns False.
'----------------------------------------------------------------------------------------------------------------------------
Function GetADObjectsADsPaths(adsPaths, ldapQuery)
   Dim objectDict, objConnection, objCommand, objRecordSet, objectADsPath
   Const ADsScopeSubtree                  = 2
   GetADObjectsADsPaths                   = False
   Set objectDict                         = NewDictionary
   Set objConnection                      = CreateObject("ADODB.Connection")
   Set objCommand                         = CreateObject("ADODB.Command")
   objConnection.Provider                 = "ADsDSOOBject"
   objConnection.Open                       "Active Directory Provider"
   objCommand.ActiveConnection            = objConnection
   objCommand.Properties("Page Size")     = 100
   objCommand.Properties("Timeout")       = 30
   objCommand.Properties("Cache Results") = False
   objCommand.Properties("Searchscope")   = ADsScopeSubtree 
   objCommand.CommandText                 = ldapQuery
   On Error Resume Next
      Set objRecordSet = objCommand.Execute
      If objRecordSet.BOF And objRecordSet.EOF Then
         Exit Function
      End If
      objRecordSet.MoveFirst
      Do Until objRecordSet.EOF
         objectADsPath = "LDAP://" & Replace(objRecordSet.Fields("distinguishedName").Value, "/", "\/")
         objectDict(objectDict.Count) = objectADsPath
         objRecordSet.MoveNext
      Loop
      If Err.Number <> 0 Then
         Exit Function
      End If
      objConnection.Close
   On Error Goto 0
   adsPaths             = objectDict.Items
   GetADObjectsADsPaths = True
End Function
'----------------------------------------------------------------------------------------------------------------------------
'Name       : AddGroupMembers -> Adds an Array of Active Directory users to an Array of Active Directory Groups.
'Parameters : groupADsPaths   -> An Array containing the ADsPath values of the groups to add each user to.
'           : userADsPaths    -> An Array containing the ADsPath values of users to add to each group.
'Return     : AddGroupMembers -> Returns True if successfull otherwise returns False.
'----------------------------------------------------------------------------------------------------------------------------
Function AddGroupMembers(groupADsPaths, userADsPaths)
   Dim objGroup, errorCount, i, j, userdn
   Const adsPropertyAppend = 3 
   AddGroupMembers         = False
   errorCount              = 0
   If Not IsArray(groupADsPaths) Then
      groupADsPaths = Array(groupADsPaths)
   End If
   If Not IsArray(userADsPaths) Then
      userADsPaths = Array(userADsPaths)
   End If
   On Error Resume Next
      For i = 0 To UBound(groupADsPaths)
         Do
            Set objGroup = GetObject(groupADsPaths(i))
            If Err.Number <> 0 Then
               errorCount = errorCount + 1
               Exit Do
            End If
            For j = 0 To UBound(userADsPaths)
               Do
                  objGroup.PutEx adsPropertyAppend, "member", Array(Replace(userADsPaths(j), "LDAP://", ""))
                  objGroup.SetInfo
                  If Err.Number <> 0 Then
                     errorCount = errorCount + 1
                     Exit Do
                  End If
               Loop Until True
            Next
         Loop Until True
      Next
   On Error Goto 0
   If errorCount <> 0 Then
      Exit Function
   End If
   AddGroupMembers = True   
End Function
'---------------------------------------------------------------------------------------------------------------------------- 
'Name       : NewDictionary -> Creates a new dictionary object.      
'Parameters : None          ->      
'Return     : NewDictionary -> Returns a dictionary object.      
'---------------------------------------------------------------------------------------------------------------------------- 
Function NewDictionary      
   Dim dict      
   Set dict          = CreateObject("scripting.Dictionary")      
   dict.CompareMode  = vbTextCompare      
   Set NewDictionary = dict      
End Function  
'---------------------------------------------------------------------------------------------------------------------------- 
'Name       : DQ          -> Place double quotes around a string and replace double quotes   
'           :             -> within the string with pairs of double quotes.   
'Parameters : stringValue -> String value to be double quoted   
'Return     : DQ          -> Double quoted string.   
'---------------------------------------------------------------------------------------------------------------------------- 
Function DQ (ByVal stringValue)   
   If stringValue <> "" Then  
      DQ = """" & Replace (stringValue, """", """""") & """"   
   Else  
      DQ = """"""  
   End If  
End Function
'---------------------------------------------------------------------------------------------------------------------------- 
'Name       : PromptScriptStart -> Prompt when script starts.   
'Parameters : None   
'Return     : None   
'---------------------------------------------------------------------------------------------------------------------------- 
'Function PromptScriptStart   
'   MsgBox "Now processing the " & DQ(Wscript.ScriptName) & " script.", vbInformation, scriptBaseName   
'End Function  
'---------------------------------------------------------------------------------------------------------------------------- 
'Name       : PromptScriptEnd -> Prompt when script has completed.   
'Parameters : None   
'Return     : None   
'---------------------------------------------------------------------------------------------------------------------------- 
'Function PromptScriptEnd   
'   MsgBox "The " & DQ(Wscript.ScriptName) & " script has completed successfully.", vbInformation, scriptBaseName   
'End Function  
'----------------------------------------------------------------------------------------------------------------------------

Open in new window

ASKER CERTIFIED SOLUTION
Avatar of amd599
amd599
Flag of United Kingdom of Great Britain and Northern Ireland image

Link to home
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
Start Free Trial