У меня есть одна группа домино (только список управления доступом), назовем их Main_Group
.
В эту группу входят все сотрудники, о которых я хочу знать, членами каких других домино-групп они являются.
Участники Main_Group
:
- John Smith/ORGANIZATION
- Peter Smith/ORGANIZATION
- Jeff Smith/ORGANIZATION
Конечно, этот список намного длиннее, чем эти 3 записи.
Я бы искал каждого члена в этой группе, членом какой другой группы домино является этот пользователь, и помещал эту информацию в CSV. CSV должен иметь такой формат:
UserName;DominoGroups
John Smith;Domino_Group1,Domino_Group2,Domino_Group3
Peter Smith;Domino_Group2
Jeff Smith;Domino_Group1,Domino_Group3
Как лучше всего получить эту информацию? Lotus Script, любой вид с формулой? Или уже есть база данных заметок, делающая это?
Это не просто. Человек может находиться в группе через один или несколько уровней косвенности. То есть, человек находится в группе А, и группа А находится в группе Б, и группа Б находится в группе С, и группа С находится в группе D, и, кстати, группа Е, группа F и группа G... Вам придется написать код для рекурсивного обхода групп, обнаружения циклы и составить окончательный список членства в группах. Насколько я знаю, для этого никогда не было открыто API.
Нет простого способа получить желаемое. Вы можете создать представление в адресной книге, использовать представление «Группа» в качестве шаблона и добавить один категоризированный столбец для элемента «Участники». К сожалению, как писал Ричард, вы не получите такого членства во вложенных группах.
Вам нужно будет:
НО: Если вам просто нужно узнать/увидеть, в каких группах состоит конкретный пользователь, то используйте Domino Administrator Client. Откройте представление «Группы», затем панель «Группы» и выберите «Управление группами». Затем выберите пользователя на самой левой панели и нажмите «Иерархия участников» справа, после чего вы увидите группы, членом которых является этот пользователь, даже вложенные. К сожалению, вы не можете экспортировать эту информацию.
См. ниже рекурсивное решение, которое обнаруживает группы в группах :-)
Этот код создает список динамических массивов, которые действуют как пары ключ/значение (где каждое значение является массивом). Он построен из Group
вида в names.nsf
. Вместо того, чтобы брать имя каждой группы и загружать членов, он строит его наоборот, поэтому для каждого члена он имеет массив групп. Группы могут быть в других группах, поэтому он рекурсивно проходит через каждую группу. Чтобы предотвратить зацикливание (например, когда группа A находится в группе B и наоборот), он использует массив visited
, который завершает эту часть поиска, если группа уже была посещена. Посещенный массив заканчивается после завершения рекурсии списком групп, в которых находится пользователь.
Построение списка ключей/значений на начальном этапе будет быстрее, чем многократный полнотекстовый поиск, особенно если вместо поиска одного имени вы зацикливаете все имена пользователей в named.nsf, поскольку после создания списка ключей/значений нет необходимости запросите базу данных еще раз. Я не создавал цикл для каждого пользователя, но его можно легко добавить в функцию getGroupsForUser
.
Код ниже
getGroupsForUser
функция. Возвращает отформатированную строку каждой группы, в которой находится пользователь. Первым элементом является имя пользователя.
Function getGroupsForUser(userName As String) As String
If userName = "" Then Exit function
Dim ns As New NotesSession, namesDatabase As NotesDatabase
Dim visited As Variant, groupKeyValueStore List As Variant
Dim returnString As String, separator As String, i As Integer
Set namesDatabase = ns.getDatabase(ns.Currentdatabase.Server, "names.nsf", False)
visited = Null
Call getGroupKeyValues(groupKeyValueStore, namesDatabase)
Call searchGroupsRecursive(userName, visited, groupKeyValueStore)
i=0
returnString = ""
ForAll item In visited
If i=0 Then separator = ""
If i=1 Then separator = ";"
If i>1 Then separator = ","
returnString = returnString + separator + item
i = i + 1
End forall
getGroupsForUser = returnString
End Function
getGroupKeyValues
перебирает представление «Группы» в named.nsf и создает список «ключ/значение».
Public Function getGroupKeyValues(groupKeyValueStore List As Variant , namesDatabase As NotesDatabase)
Dim groupView As NotesView, doc As NotesDocument, members As Variant, groupName As String
Dim separator As String, values As Variant, i As Integer, tempString(0) As String
Set groupView = namesDatabase.getView("Groups")
Set doc=groupView.Getfirstdocument()
Do Until doc Is Nothing
groupName = doc.ListName(0)
members = doc.getItemValue("Members")
ForAll member In members
If IsElement(groupKeyValueStore(member)) Then
If IsNull(ArrayGetIndex(groupKeyValueStore(member), groupName)) Then
values = groupKeyValueStore(member)
i = ubound(values) + 1
ReDim Preserve values(i)
values(i) = groupName
groupKeyValueStore(member) = values
End If
Else
tempString(0) = groupName
groupKeyValueStore(member) = tempString
End If
End ForAll
Set doc=groupView.getNextDocument(doc)
Loop
End Function
searchGroupsRecursive
рекурсивно ищет каждую группу, гарантируя, что ни одна группа не будет посещена дважды.
Public Function searchGroupsRecursive(userName As String, visited As Variant, groupKeyValueStore List As Variant) As Variant
Dim length As Integer, userNotesName As NotesName, fullUserName As String
Dim tempArray(0) As String
Set userNotesName = New NotesName(userName)
fullUserName = userNotesName.Canonical
If IsNull(visited) Then
tempArray(0) = userName
visited = tempArray
Else
length = UBound(visited)
ReDim Preserve visited(length + 1)
visited(length + 1) = userName
End If
If Not isElement(groupKeyValueStore(fullUserName)) Then Exit function
ForAll item In groupKeyValueStore(fullUserName)
Call searchGroupsRecursive(CStr(item), visited, groupKeyValueStore)
End ForAll
End Function
См. ниже рекурсивный код, обнаруживающий циклы :-)