ICC Home / Members / Meetings / Peer Support / Documentation / Projects
GetGroupsForUser cmd-line scriptReturn to IT/SA Services Documentation Home |
UsageSave Wayne's code (following) as "GetGroupsForUser.vbs" and run from an ADMN-elevated cmd.exe console: D:\batch>Cscript GetGroupsForUser.vbs <username> Since a user has access to their own group memberships, anyone can do this from the Run box for themselves via: cmd /K Cscript \\ad.ufl.edu\netlogon\ifas\entnem\GetGroupsForUser.vbs %username% Source code' Display the group membership of a user ' code keeps track of the groups that have already been seen. ' Pretty output hacked in to make nested groups readable 'if you set the strUserDN manually 'strUserDN = "CN=username,OU=XXXXX,OU=XXXXX,OU=Departments,OU=UF,DC=ad,DC=ufl,DC=edu" force_cscript sub force_cscript dim args : args="" dim i, wshshell If right(lCase(wscript.fullname),11)= "wscript.exe" then for i=0 to wscript.arguments.count-1 args = args & wscript.arguments(i) & " " next set wshshell=createobject("wscript.shell") wshshell.run wshshell.ExpandEnvironmentStrings("%comspec%") & _ " /k cscript.exe //nologo """ & wscript.scriptfullname & """" & " " & args 'change to /k for stay set wshshell=nothing wscript.quit end if end sub Const ADS_SCOPE_SUBTREE = 2 Set objConnection = CreateObject("ADODB.Connection") Set objCommand = CreateObject("ADODB.Command") objConnection.Provider = "ADsDSOObject" objConnection.Open "Active Directory Provider" Set objCommand.ActiveConnection = objConnection objCommand.Properties("Page Size") = 1000 objCommand.Properties("Searchscope") = ADS_SCOPE_SUBTREE If (Wscript.Arguments.Count < 1) Then Wscript.Echo "Required Parameter (username) missing" Wscript.Quit End If strUser = Wscript.Arguments(0) wscript.echo "Location of " & strUser & " in UFAD:", vbCRLF objCommand.CommandText = _ "SELECT distinguishedName FROM 'LDAP://DC=ad,DC=ufl,DC=edu' WHERE objectCategory='user' " & _ "AND sAMAccountName='" & strUser & "'" Set objRecordSet = objCommand.Execute StrUserDN = objRecordSet.Fields("distinguishedName").Value Canonical= Replace(StrUserDN, "DC=ad,DC=ufl,DC=edu", "") Canonical=split(Canonical, ",") For Each Part in Canonical Part = replace(part, "CN=", "\") Part = replace(part, "OU=UF", "UF") Part = replace(part, "OU=", "\") CanonicalName = Part & CanonicalName Next wscript.echo CanonicalName, vbCRLF size = 0 set objUser = GetObject("LDAP://" & strUserDN) strSpaces = "" set dicSeenGroup = CreateObject("Scripting.Dictionary") wscript.echo " Groups are members of their children." wscript.echo " Child nodes show indirect membership." wscript.echo " Nodes with (SEEN) suffix have already been traversed.", vbCRLF 'Wscript.Echo "Group membership for " & objUser.Get("cn") & ":", vbCRLF DisplayGroups "LDAP://" & strUserDN, strSpaces, dicSeenGroup, size Function DisplayGroups ( strObjectADsPath, strSpaces, dicSeenGroup, size) set objObject = GetObject(strObjectADsPath) on error resume next ' Doing this to avoid an error when memberOf is empty if IsArray( objObject.Get("memberOf") ) then colGroups = objObject.Get("memberOf") else colGroups = Array( objObject.Get("memberOf") ) end if For i = (UBound(colGroups) - 1) to 0 Step -1 For j= 0 to i If UCase(colGroups(j)) > UCase(colGroups(j+1)) Then strHolder = colGroups(j+1) colGroups(j+1) = colGroups(j) colGroups(j) = strHolder End If Next Next if isarray(colGroups) then kids = ubound(colGroups)+1 else kids = 0 end if strPretty = strSpaces & "\" if (size=0 and kids>0) then strSpaces = strSpaces & " " else if (size=0 and kids=0) then strSpaces = strSpaces & "|" else strPretty = strSpaces & "|" strSpaces = strSpaces & "|" end if end if strOutput = strPretty & "- " & objObject.Get("cn") 'delete4debug & " S:" & size & " K:" & kids WScript.Echo strOutput for each strGroupDN In colGroups kids = kids - 1 if Not dicSeenGroup.Exists(strGroupDN) then dicSeenGroup.Add strGroupDN, 1 DisplayGroups "LDAP://" & strGroupDN, strSpaces & " ", dicSeenGroup, kids else if not isempty(strGroupDN) then set objTemp = GetObject("LDAP://" & strGroupDN) strOutput1 = strSpaces & " !- " & objTemp.Get("cn") & " (SEEN)" wscript.echo strOutput1 end if end if next End Function |
last edited 1 May 2008 by Steve Lasley