Determining a User's Group Membership Determining a User's Group Membership vba vba

Determining a User's Group Membership


Allain found this online

Function IsMember(strDomain As String, strGroup _  As String, strMember As String) As Boolean  Dim grp As Object  Dim strPath As String  strPath = "WinNT://" & strDomain & "/"  Set grp = GetObject(strPath & strGroup & ",group")  IsMember = grp.IsMember(strPath & strMember)End Function

You can get the Windows account info by way of the USERDOMAIN and USERNAME environment vars:

Function GetCurrentUser() As String    GetCurrentUser = Environ("USERNAME")End FunctionFunction GetCurrentDomain() As String    GetCurrentDomain = Environ("USERDOMAIN")End Function

Putting it all together:

If IsMember(GetCurrentDomain, "AD Group", GetCurrentUser) Then   DoStuff()End If


I'm late to the game with this, but the code you need is below. It gets user names and domain names for you.

Note that I'm not using objGroup.Ismember - that's actually the correct method to use - I'm enumerating the list of groups that the user is in, because it's much easier to debug and there's no appreciable performance penalty.

...And I lifted the code from an earlier project, in which I needed to check membership of a 'Read Reports' group, an 'Edit Data' Group, and an 'Edit System Data' group, so that I could choose which controls to enable and which forms to open read-only. Enumerating groups once was faster than three separate checks.

Public Function UserIsInGroup(GroupName As String, _                              Optional Username As String, _                              Optional Domain As String) As Boolean'On Error Resume Next' Returns TRUE if the user is in the named NT Group.' If user name is omitted, current logged-in user's login name is assumed.' If domain is omitted, current logged-in user's domain is assumed.' User name can be submitted in the form 'myDomain/MyName' '                                        (this will run slightly faster)' Does not raise errors for unknown user.'' Sample Usage: UserIsInGroup( "Domain Users")Dim strUsername As StringDim objGroup    As ObjectDim objUser     As ObjectDim objNetwork  As ObjectUserIsInGroup = FalseIf Username = "" Then    Set objNetwork = CreateObject("WScript.Network")    strUsername = objNetwork.UserDomain & "/" & objNetwork.UsernameElse    strUsername = UsernameEnd IfstrUsername = Replace(strUsername, "\", "/")If InStr(strUsername, "/") Then    ' No action: Domain has already been supplied in the user nameElse        If Domain = "" Then        Set objNetwork = CreateObject("WScript.Network")        Domain = objNetwork.UserDomain    End If            strUsername = Domain & "/" & strUsername        End IfSet objUser = GetObject("WinNT://" & strUsername & ",user")    If objUser Is Nothing Then        ' Insert error-handler here if you want to report an unknown user nameElse    For Each objGroup In objUser.Groups        'Debug.Print objGroup.Name        If GroupName = objGroup.Name Then            UserIsInGroup = True            Exit For        End If    Next objGroupEnd IfSet objNetwork = NothingSet objGroup = NothingSet objUser = NothingEnd Function

Hopefully this late submission is of use to other developers: when I looked this up for the first time, back in 2003, it was like nobody had ever used AD groups in Excel or MS-Access.


Found this online

Function IsMember(strDomain As String, strGroup _  As String, strMember As String) As Boolean  Dim grp As Object  Dim strPath As String  strPath = "WinNT://" & strDomain & "/"  Set grp = GetObject(strPath & strGroup & ",group")  IsMember = grp.IsMember(strPath & strMember)End Function

Now, I only need the account name of the current user. Too bad Application.CurrentUser doesn't give me their Domain Account name.