Определение членства пользователя в группе

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

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

Спасибо


person Allain Lalonde    schedule 06.01.2009    source источник


Ответы (3)


Аллен нашел это в Интернете

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
person Patrick Cuff    schedule 06.01.2009
comment
Истинный. Это в основном для отображения разных экранов для разных пользователей. Не столько безопасность, сколько удобство использования. - person Allain Lalonde; 06.01.2009
comment
Этот ответ на самом деле не связан с AD — это просто старые группы NTFS. В AD есть такие вещи, как организационные единицы, которые не являются частью NTFS и доступны только через запросы LDAP. - person David-W-Fenton; 07.01.2009
comment
Я бы посоветовал не использовать переменные среды для имени пользователя и домена пользователя: это локальные настройки, и их можно изменить. Запрос к сети Windows запрашивает Active Directory и сервер домена, кто вы и где вы находитесь, и это немного более надежно. - person Nigel Heffernan; 11.09.2015
comment
Чтобы уточнить комментарий Найджела, GetCurrentUser = CreateObject(WScript.Network).Username GetCurrentDomain = CreateObject(WScript.Network).UserDomain - person Sidupac; 13.03.2019

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

Обратите внимание, что я не использую 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.

person Nigel Heffernan    schedule 24.05.2013
comment
Кстати, в 2017 году это все еще весьма полезно. :) - person Andre; 25.07.2017
comment
Одно замечание: если у вашего пользователя есть членство в группах, управляемое несколькими серверами в разных часовых поясах — я работаю с клиентами, где это верно для сотрудников с профилями в двух или более офисах — вы обнаружите, что итерация по всем группам займет несколько секунд. В этих случаях лучше всего использовать objGroup.Ismember. Я призываю вас не использовать локальное кэширование списка групп пользователей, каким бы заманчивым оно ни было, когда вам нужно многократно проверять, так как это очень плохая практика безопасности. - person Nigel Heffernan; 01.08.2017
comment
И все еще полезно в 2019 году :D Спасибо @NigelHeffernan - person Gadziu; 17.05.2019

в Интернете

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 не дает мне имя своей учетной записи домена.

person Allain Lalonde    schedule 06.01.2009
comment
Просто слово предупреждения. Этот код вернет неправильные результаты для основной группы пользователей (обычно пользователи домена), поскольку они хранятся по-другому в AD. - person JohnFx; 06.01.2009
comment
Без проблем. Я боролся с этой проблемой в течение нескольких недель в конце декабря и узнал большую часть этого на собственном горьком опыте. Я настоятельно рекомендую книгу по этому типу проблем: Руководство разработчика .NET по программированию служб каталогов. - person JohnFx; 06.01.2009