Const VN_AB_VIMGROUPS = "($VIMGroups)"
Const IN_GROUPMEMBERS = "Members"
%REM
Description: разворачивание групп; вложенность поддерживается
%END REM
Class GroupExpander
'объект БД АК (для того, чтобы представление групп не обнулялось)
Private m_ndbAB As NotesDatabase
'представление, по которому будет производиться поиск групп
Private m_nvGroup As NotesView
'счётчик пользователей группы
Private m_iMember As Integer
Sub New(ndbAB As NotesDatabase)
Set Me.m_ndbAB = ndbAB
Set Me.m_nvGroup = Me.m_ndbAB.GetView(VN_AB_VIMGROUPS)
Call Me.m_nvGroup.Refresh()
End Sub
%REM
Description: установка другой АК
%END REM
Public Property Set AddressBook As NotesDatabase
Set Me.m_ndbAB = Me.AddressBook
End Property
%REM
Description: получение всех пользователей группы с помощью перебора; рекурсивная :(
Возвращаемые значения:
- Empty - если группа не найдена;
- в остальных случаях - массив
%END REM
Public Function ExplodeGroup(sGroupName As String) As Variant
Dim arrMembers() As String
Dim ndGroup As NotesDocument
If CStr(GetThreadInfo(1)) <> CStr(GetThreadInfo(10)) Then
Me.m_iMember = 0 'обнуляем, т.к. метод может вызываться извне несколько раз, к примеру, в цикле
End If
Set ndGroup = Me.m_nvGroup.GetDocumentByKey(sGroupName)
If ndGroup Is Nothing Then Exit Function
arrMembersAll = ndGroup.GetItemValue(IN_GROUPMEMBERS)
If Len(arrMembersAll(0)) > 0 Then
For i% = 0 To UBound(arrMembersAll)
sEntry$ = arrMembersAll(i%)
If InStr(sEntry$, "CN=") <> 0 Then 'ускоряем, чтобы "взрывал" только группы!
'это имя в системе пользователя
ReDim Preserve arrMembers(Me.m_iMember)
arrMembers(Me.m_iMember) = sEntry$
Me.m_iMember = Me.m_iMember + 1
Else
'это группа
Call Me.ExplodeGroup(sEntry$)
End If
Next
Else
ReDim arrMembers(Me.m_iMember)
End If
Me.ExplodeGroup = ArrayUnique(arrMembers)
End Function
%REM
Description: определяет, есть ли пользователь в указанной группе
работает по методу перебора
%END REM
Public Function IsMemberUser(sGroupName As String, sUserName As String) As Boolean
Dim arrMembers As Variant
arrMembers = Me.ExplodeGroup(sGroupName)
If Not IsEmpty(arrMembers) Then
Me.IsMemberUser = Not IsNull(ArrayGetIndex(arrMembers, sUserName, 5))
End If
End Function
%REM
Description: определяет, есть ли пользователь в указанной группе
работает по @ExpandNameList
%END REM
Public Function IsMemberUserEx(sGroupName As String, sUserName As String) As Boolean
Dim arrMembers As Variant
arrMembers = Evaluate(|@ExpandNameList("| & Me.m_ndbAB.Server & |":"| & Me.m_ndbAB.FilePath & |";"| & sGroupName & |")|)
Me.IsMemberUserEx = Not IsNull(ArrayGetIndex(arrMembers, sUserName, 5))
End Function
End Class