![]() |
Table of Contents |
![]() |
Working with GroupsYou'll want to do two primary things with groups: modify their membership and check their membership. The former can be useful in scripts that bulk-add new users to the domain; the latter is invaluable in logon scripts. Let's take checking group membership first. The basic trick is to get a reference to a group, and then scan through its members until you find a particular user (or not). This is best implemented as a function, which can be easily reused in different scripts. The function is in Listing 16.1. Listing 16.1. CheckGroupMembership.vbs. This function checks to see if a specified user belongs to a specified group.Function IsMember(sUser, sGroup) Dim oGroup, bIsMember, oMember bIsMember = False Set oGroup = GetObject("LDAP://" & sGroup) For Each oMember in oGroup.GetEx("member") If oMember.Name = sUser Then bIsMember = True Exit For End If Next IsMember = bIsMember End Function You need to pass FQDNs to this function. For example, to see if user DonJ, located in the MIS OU, is a member of the HelpDesk group, also located in the MIS OU, you'd do something like this. If IsMember( _ "cn=DonJ,ou=MIS,dc=domain,dc=com", _ "cn=HelpDesk,ou=MIS,dc=domain,dc=com") Then WScript.Echo "He's a member!" Else WScript.Echo "He's not a member!" End If Notice that the function uses the GetEx method to retrieve the group object's member attribute, which is a multivalued attribute. Each entry in the attribute is the FQDN of a user that belongs to the group. The benefit of a function like this is that it can check for users from different domains belonging to, for example, a Universal security group, because you're using the FQDN of the user, which includes his home domain. Given this example on how to read the group's membership list, you probably have a good idea of how to modify that list. Suppose you have a group named HelpDesk in the MIS OU. You want to add a user named DonJ, also from the MIS OU, and delete a user named GregM from the Sales OU. Here's how. Dim oGroup Set oGroup = GetObject("LDAP://cn=HelpDesk,ou=MIS,dc=" & _ "domain,dc=com") 'PutEx constants Const MVP_CLEAR = 1 Const MVP_UPDATE = 2 Const MVP_APPEND = 3 Const MVP_DELETE = 4 'add user oGroup.PutEx MVP_APPEND, "member", "cn=DonJ,ou=MIS,dc=" & _ "domain,dc=com" oGroup.SetInfo 'delete user oGroup.PutEx MVP_DELETE, "member", "cn-GregM,ou=Sales,dc=" & _ "domain,dc=com" oGroup.SetInfo What if you want to do this with an NT domain or a local SAM? Using the WinNT provider is slightly different. First, you need to connect to the user account to obtain its security identifier (SID), and then you can add that to the group. Dim oUser, oGroup Set oUser = GetObject("WinNT://DOMAIN/DonJ,user") Set oGroup = GetObject("WinNT://DOMAIN/HelpDesk,group") oGroup.Add oUser.ADsPath Here again, you see how the WinNT provider can make things a tiny bit easier, because it's designed specifically for dealing with users, groups, and other stuff like that. The LDAP provider, on the other hand, provides more flexibility because it's designed as a generic LDAP provider. That means future changes to AD won't require a new LDAP provider. |
![]() |
Table of Contents |
![]() |