Guy’s Scripting Ezine 58 More Groups 2

Contents for Guy’s Scripting Ezine 58 More Groups 2

This Week’s Secret

This week I feel like one of those swans who appear to be gliding serenely on the surface, while all the time they are frantically paddling like mad under the surface.

No worries – your example script WILL work.  However, its development was far from smooth.  Problems with scripts make me frustrated but never angry, and there is no feeling as great as when your code finally works.

Guy Recommends: The Free IP Address Tracker (IPAT) IP Tracker

Calculating IP Address ranges is a black art, which many network managers solve by creating custom Excel spreadsheets.  IPAT cracks this problem of allocating IP addresses in networks in two ways:

For Mr Organized there is a nifty subnet calculator, you enter the network address and the subnet mask, then IPAT works out the usable addresses and their ranges. 

For Mr Lazy IPAT discovers and then displays the IP addresses of existing computers. Download the Free IP Address Tracker

This Week’s Mission – to control the group Type and Scope

Firstly, a reminder that this is More Groups (2), so I recommend reviewing More Groups (1) – particularly if you need to add users to groups.

While I haven’t forgotten my promise to deal with CONST, we will have to wait one more week for a dedicated ezine explaining Constants.  For this week’s script, I suggest that you just accept that we have to use CONST declarations to control the Type and Scope of the group.

My project to script groups started well, here are the CONST values that my research uncovered:

  • (To create a distribution group just omit the last item, there does not appear to be a = 0x8000000xx flag to reverse the security enabled flag.)

However when I entered these values exactly as above, the script failed.  So, back to the drawing board.  Next I found that VBScript wanted the CONST precisely in this format: &Hx.  Naturally H stands for Hex.


The CONST statement is really ‘picky’, for example, a space between ampersand and H results in another 0800 error.  = &H8 is correct but = &  H8 fails because of the space between & and H8.

Hooray! I had mastered the Scope of the group, but what about the Type?  Once you add one of these ADS_Group constants, the default type of group changes from security to distribution.  Another problem to overcome.

So, how do you create a Security group?  Firstly, seek out the ADS_GROUP_TYPE_SECURITY_ENABLED Constant.

Then, what should you do?  Change the value of ADS_GROUP_TYPE_SECURITY_ENABLED = 0x80000000 to: &H8? 
Wrong it should be: = &H80000000

To be crystal clear, here is the complete answer:

Next how could I persuade the script to add the two properties, Security_Enabled and Type_Universal?  Here was my suggestion:



If you think that would work, you must be joking – no chance.  Undaunted, I researched the problem and found a suggestion to add the | (pipe symbol down near the control).  This was close – but no cigar. What you really needed was an OR statement.  Strange but true.  This was the final code:

objGroup.Put "groupType", ADS_GROUP_TYPE_UNIVERSAL_GROUP _


Incidentally, have you noticed with scripting that once thing goes wrong you get more and more errors?   Well you have probably guessed that this week I had a ‘ bad hair day’.  The good news is that the converse also applies, when you are on a run, all scripts working perfectly, then you believe that you can ‘walk on water’.

Guy Recommends: Tools4ever’s UMRAUMRA The User Management Resource Administrator

Tired of writing scripts? The User Management Resource Administrator solution by Tools4ever offers an alternative to time-consuming manual processes.

It features 100% auto provisioning, Helpdesk Delegation, Connectors to more than 130 systems/applications, Workflow Management, Self Service and many other benefits. Click on the link for more information onUMRA.

Example – Creating a Security Universal Group

This script creates a new group.  It is designed to change the Scope from Global (default) to Universal.  With care, you could alter the CONST statement, for example, to create a Domain Local Group.

The trickiest part is controlling the Type.  If you remember when you create a group using script with the default values it turns out to be a Global Security group.  The minute you change the scope to Universal the default Type changes to Distribution.  Wacky?  However, all is not lost, just add 
Or ADS_GROUP_TYPE_SECURITY_ENABLED and force the group Type to be security.


  1. Copy and paste the script below into notepad.
  2. Save the file with .vbs extension e.g. UniSecureGroup1.vbs
  3. Double click and then open Active Directory Users and Computers and search the OU specified in strOU.  Did you see a new group?  Was it Universal or Global?

‘ UniSecureGroup1.vbs
‘ VBscript to create a Universal Security Group
‘ Author Guy Thomas
‘ Version 4.9 – January 9th 2005
‘ ———————————————————-‘
Option Explicit
Dim strOU, strNewGroup, strNewGroupLong, strDNSDomain
Dim objOU, objGroup, objRootDSE
Dim strGuyGp, strGPType

‘ If you want a global group, here is the CONST

‘ Challenge – Make sure you have an OU called strOU
‘ Option change the strNewGroup = "UniSec"
strOU = "OU=Cowbridge,"
strNewGroup = "GuyUniSec"
strNewGroupLong = "CN=" & strNewGroup

‘ Bind to Active Directory
Set objRootDSE = GetObject("LDAP://RootDSE")
strDNSDomain = objRootDSE.Get("DefaultNamingContext")

‘ Create new Group
Set objOU = GetObject("LDAP://" & strOU & strDNSDomain )
Set objGroup = objOU.Create("Group",strNewGroupLong)
objGroup.Put "sAMAccountName", strNewGroup

‘ Here is where you set the group Type and Scope
objGroup.Put "groupType", ADS_GROUP_TYPE_UNIVERSAL_GROUP _

Wscript.Echo "Created " &strNewGroup

‘ End of example VBScript

Learning Points

Note 1:  Const ADS_GROUP_TYPE_UNIVERSAL_GROUP = &h8 is responsible for creating the Universal Group.  Consult the notes to change the scope to Global or Domain Local.

Note 2:  Pay close attention to these two lines, under:  ‘ Here is where you set group…  In this script the group Type is Security, should you want a distribution group, just remove the _ and the line:

Note 3: To add users to your group See last week’s Ezine online

Note 4:  See more Creating Groups here

Challenges – Add error correcting code

  1. Add: On Error Resume Next   before, repeat before, ‘ Create new Group section.
  2. Insert the error correcting code itself.
  3. Optionally, add a snippet to extract the Universal Group value and echo the result in a message box.

‘ Challenge 1 – Add before Create new Groups
On Error Resume Next
‘ Create new Group



‘  Challenge 2 – Add after objGroup.SetInfo
If err.number = vbEmpty then
Wscript.Echo "Created " & strNewGroup & " type " & strGPType
ElseIf err.number = -2147019886 then
Wscript.Echo err.number & " Group Already Exists"
Wscript.Echo err.number & " Must Research"
End If


‘ Challenge 3 – add near top
If strGuyGp = 8 Then
strGPType = "Universal"
End if

Summary – Groups Type and Scope

It is fiendishly difficult for VBScript to manipulate the Type and the Scope of a new group.  Pay particular attention to the CONST = statements at the start of the script.

See More Active Directory Group VBScripts

• User Spreadsheet  • Add User to Group  • Create User  • Free Solarwinds Permissions Monitor

Ezine 57 Groups  •Ezine 58 Groups  • Ezine 73 primaryID  • Ezine 112 Local Groups

Ezine 113 Multiple Groups  • Ezine 115 Map Groups  •Ezine 138 Groups Join  • Ezines