Определение членства пользователя в группе с помощью VBA
Как определить, является ли пользователь, скажем Access, членом группы безопасности Active Directory?
Я бы предпочел не строить всю систему аутентификации в моей маленькой БД доступа.
спасибо
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
окружающая среда vars:
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
Я опоздал на игру, но код ниже. Он получает имена пользователей и доменные имена для вас.
обратите внимание, что я не использую 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 году, это было похоже на то, что никто никогда не использовал группы объявлений в Excel или MS-Access.
нашел этот онлайн
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
не дает мне имя учетной записи домена.