Определение членства пользователя в группе с использованием VBA - PullRequest
8 голосов
/ 06 января 2009

Как я могу определить, является ли пользователь, например, Access, членом группы безопасности Active Directory?

Я бы предпочел не встраивать целую систему аутентификации в мою маленькую БД Access.

Спасибо

Ответы [ 3 ]

13 голосов
/ 06 января 2009

Аллен найден это онлайн

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

Вы можете получить информацию об учетной записи Windows с помощью переменных среды USERDOMAIN и USERNAME:

Function GetCurrentUser() As String
    GetCurrentUser = Environ("USERNAME")
End Function

Function GetCurrentDomain() As String
    GetCurrentDomain = Environ("USERDOMAIN")
End Function

Собираем все вместе:

If IsMember(GetCurrentDomain, "AD Group", GetCurrentUser) Then
   DoStuff()
End If
10 голосов
/ 24 мая 2013

Я опаздываю к игре с этим, но код вам нужен ниже. Он получает имена пользователей и доменные имена для вас.

Обратите внимание, что я не использую objGroup.Ismember - это на самом деле правильный метод для использования - я перечисляю список групп, в которых находится пользователь, потому что его намного проще отлаживать и нет заметного снижения производительности.

... И я поднял код из более раннего проекта, в котором мне нужно было проверить членство в группе «Чтение отчетов», «Редактировать данные» и «Редактировать системные данные», чтобы я мог выбрать, какие элементы управления включить и какие формы открывать только для чтения. Перечисление групп когда-то было быстрее, чем три отдельных проверки.

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 String
Dim objGroup    As Object
Dim objUser     As Object
Dim objNetwork  As Object

UserIsInGroup = False

If Username = "" Then
    Set objNetwork = CreateObject("WScript.Network")
    strUsername = objNetwork.UserDomain & "/" & objNetwork.Username
Else
    strUsername = Username
End If

strUsername = Replace(strUsername, "\", "/")
If InStr(strUsername, "/") Then
    ' No action: Domain has already been supplied in the user name
Else    
    If Domain = "" Then
        Set objNetwork = CreateObject("WScript.Network")
        Domain = objNetwork.UserDomain
    End If        
    strUsername = Domain & "/" & strUsername        
End If

Set objUser = GetObject("WinNT://" & strUsername & ",user")    
If objUser Is Nothing Then    
    ' Insert error-handler here if you want to report an unknown user name
Else
    For Each objGroup In objUser.Groups
        'Debug.Print objGroup.Name
        If GroupName = objGroup.Name Then
            UserIsInGroup = True
            Exit For
        End If
    Next objGroup
End If

Set objNetwork = Nothing
Set objGroup = Nothing
Set objUser = Nothing

End Function

Надеюсь, эта поздняя отправка будет полезна другим разработчикам: когда я впервые посмотрел это, еще в 2003 году, было похоже, что никто никогда не использовал группы AD в Excel или MS-Access.

2 голосов
/ 06 января 2009

Найдено это онлайн

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

Теперь мне нужно только имя учетной записи текущего пользователя. Жаль, что Application.CurrentUser не дает мне имя своей учетной записи домена.

...