Das Notes Forum

Domino 9 und frühere Versionen => Entwicklung => Thema gestartet von: TMC am 21.12.04 - 18:58:47

Titel: Gegeben: Rolle -- Gesucht: wer hat alles diese Rolle
Beitrag von: TMC am 21.12.04 - 18:58:47
Hi,

wenn ich eine ACL-Rolle habe, z.B. [Admin], wie komme ich am einfachsten an eine Liste / Array, die alle Namen der ACL beinhaltet, welche diese Rolle haben?

Beispiel:
  - Reiner Unsinn
  - Axel Schweiss
haben in der ACL die Rolle [Admin]. Wie erhalte ich programmatisch diese Namen, wenn mir nur die Rolle [Admin] bekannt ist?


Benötige das in LS, darf aber auch @Formula sein, dann würde ich mir das über Evaluate holen.

Danke,
Matthias

P.S. ich habe das Gefühl dies geht ziemlich einfach, aber ich finde es aktuell einfach nicht.
Titel: Re: Gegeben: Rolle -- Gesucht: wer hat alles diese Rolle
Beitrag von: eknori am 21.12.04 - 19:10:07
guck mal Designer Help  IsRoleEnabled
Da musst du dann durch die ACL mit acl.GetEntry durch und prüfen ob der Eintrag IsRoleEnabled ist. Wenn ja, ab damit in ein Array
Titel: Re: Gegeben: Rolle -- Gesucht: wer hat alles diese Rolle
Beitrag von: TMC am 21.12.04 - 19:13:31
Danke Ulrich, ich glaube that's it.

In der Property IsRoleEnabled war ich schon kurz drin während meiner Suche, aber auf das bin ich nicht gekommen  :P

Nochmal danke, ich wußte doch es muss eine einfache Lösung geben  :)

Matthias
Titel: Re: Gegeben: Rolle -- Gesucht: wer hat alles diese Rolle
Beitrag von: eknori am 21.12.04 - 19:16:21
hier noch schnell eine Hilfsfunktion um Gruppenmitglieder ( auch aus verschachtelten ) Gruppen zu extrahieren

Function GetMembersInGroup(GroupName As String) As Variant
   Dim session As New NotesSession
   Dim db As New NotesDatabase("Servernamet", "Names.NSF")
   Dim doc As NotesDocument
   Dim view As NotesView
   Set view=Db.GetView("($VIMGroups)")
   Set doc=View.GetDocumentByKey(GroupName)
   Redim tmpMembers(1) As Variant
   J=0
   
   If Not(doc Is Nothing) Then
      tmpGroupName1=Doc.GetItemValue("Members")
      GroupLowerBound1= Lbound(tmpGroupName1)
      GroupUpperBound1= Ubound(tmpGroupName1)
      For i=GroupLowerBound1 To GroupUpperBound1
         tmpGroupName2= GetMembersinGroup(tmpGroupName1(i))
         GroupLowerBound2= Lbound(tmpGroupName2)
         GroupUpperBound2= Ubound(tmpGroupName2)
         Redim Preserve tmpMembers(GroupUpperBound2+J) As Variant
         For K= GroupLowerBound2 To GroupUpperBound2
            tmpMembers(J) = tmpGroupName2(K)
            J=J+1
         Next
      Next
   Else
      Redim tmpMembers(0) As Variant
      tmpMembers(0) = GroupName
   End If
   
   GetMembersInGroup= tmpMembers
End Function

könnte für dich nützlich sein
Titel: Re: Gegeben: Rolle -- Gesucht: wer hat alles diese Rolle
Beitrag von: TMC am 21.12.04 - 19:24:08
danke Ulrich, kann gut sein dass ich das bald brauche hier  :D

Titel: Re: Gegeben: Rolle -- Gesucht: wer hat alles diese Rolle
Beitrag von: Axel am 22.12.04 - 08:32:46
Hi,

aber Achtung mit IsRoleEnabled. Wenn ein User in einer Gruppe enthalten ist und dieser eine Rolle zugewiesen wurde, nutzt diese Property nichts. Es werden nur direkt zugewiesen Rollen erkannt.

Deshalb habe ich mir eine eigene Funktion gestrickt -> Prüfung der Zuordnung von Rollen mit Script (http://www.free.dominoserver.de/computer/noteslibrary.nsf/d2d59a3d7fc73a2bc1256a6900638352/c91df359b64b39f1c1256e1600611883!OpenDocument)


Axel
Titel: Re: Gegeben: Rolle -- Gesucht: wer hat alles diese Rolle
Beitrag von: TMC am 22.12.04 - 23:06:42
Danke, Axel.

Problem dabei ist allerdings, dass ich -- unabhängig von @Username -- wissen musste, wer alles eine bestimmte Rolle hat.
Wenn man dann in der Rückgabe Gruppen hat und dies auf einzelne Personen runterbrechen muss, dann muss sowas wie Ulrich's Function herhalten, die das ganze wohl rekursiv auflöst.
Titel: Re: Gegeben: Rolle -- Gesucht: wer hat alles diese Rolle
Beitrag von: koehlerbv am 22.12.04 - 23:23:59
Reicht es Dir eigentlich, wenn (wie bisher angegeben) das ganze nur auf einem Server funktioniert ? Sonst wären ja noch ein paar Erweiterungen erforderlich. Die könnte ich liefern.

Bernhard
Titel: Re: Gegeben: Rolle -- Gesucht: wer hat alles diese Rolle
Beitrag von: TMC am 22.12.04 - 23:44:41
Nein, Bernhard, sollte auch lokal funzen. Aber trotzdem danke für Dein Angebot  :D
Trotzdem würde mich interessieren, wie Du das auf einem Server umsetzen würdest.

Eigentlich hab ich ja auch schon die Lösung, nur die rekursive Auflösung der Gruppen hab ich noch nicht implementiert.

Ah ja, hier bisherige die Umsetzung in kürze:
Code
	intCount = 0
	Set aclentry = acl.GetFirstEntry	
	While Not aclentry Is Nothing
		If aclentry.IsRoleEnabled(strRole) Then
			Redim Preserve vElemArray(intCount)
			vElemArray(intCount) = aclentry.Name
			intCount = intCount + 1
		End If			
		Set aclentry = acl.GetNextEntry(aclentry)
	Wend

Bei Ulrich's Script stört mich ein wenig die fixe Vorgabe der DB, also:
Code
Dim db As New NotesDatabase("Servernamet", "Names.NSF")

Na ja, erste Überlegung:
Code
	dbAddressBooksArray = session.AddressBooks 'db array of all address books
	Forall loop_db In dbAddressBooksArray
		If ( loop_db.IsPublicAddressBook ) Then
			'Public Address Book found !
			Set dbNAB = loop_db
			Exit Forall
		End If
	End Forall			
	
	If (dbNAB Is Nothing) Then
		'we did not find any book
		Error 1001, "A public address book could not be found !"
	End If

Allerdings hab ich da wenig Erfahrung im Bezug auf NAB-Zugriff, also ob das reicht und was ich da noch an ErrorHandling einbauen müsste.
Titel: Re: Gegeben: Rolle -- Gesucht: wer hat alles diese Rolle
Beitrag von: Semeaphoros am 23.12.04 - 00:01:07
Theoretisch ist Deine Ueberlegung zum PubNAB und die Kritik an Ulrichs Code gerechtfertigt und Dein Suchalgorithmus durchaus korrekt. In der Praxis ist es aber so, dass in derart vielen - auch kommerziellen - Applikationen der Filename "names.nsf" hardcodiert drinsteht, dass jemand, der diese Datei anders benennt, rasch in Schwierigkeiten hineinläuft. Ausnahmsweise ist der "nicht ganz saubere Code" von Ulrich demnach unkritisch.
Titel: Re: Gegeben: Rolle -- Gesucht: wer hat alles diese Rolle
Beitrag von: TMC am 23.12.04 - 00:13:24
OK, danke für die Einschätzung, Jens.
So wie ich das interpretiere, sollte ich mit der oben zitierten Überlegung (also dem Loopen durch session.AddressBooks) also nicht falsch liegen - zumindest bei Server-Anbindung.
Wie sieht das lokal aus - da hier nun wirklich die Replik der names.nsf wohl nicht immer so heißt? Ich denke ich muss das mal testen (und vielleicht wieder den Daumen rausnehmen, der diesen Thread als erledigt kennzeichnet -- da sich der Thread nun doch noch weiterentwickelt  :D )
Titel: Re: Gegeben: Rolle -- Gesucht: wer hat alles diese Rolle
Beitrag von: koehlerbv am 23.12.04 - 00:34:29
Matthias, mal so ein Schnellschuss-Codeschnipsel:
Code
NABs = session.AddressBooks
	
	Forall b In NABs
		If Not b Is Nothing Then
			Call b.Open( "", "" )
			
			If b.IsOpen Then
				Set NABview = b.GetView ("($Networks)" )         'this is a view only in public addressbooks!
				If Not (NABview Is Nothing) Then                        'do not process private address books!
					Set NABview = b.GetView ("($NamesFieldLookup)")
					If Not (NABview Is Nothing) Then                      'strange - in a public NAB this view should exist, but ... don't process this case
						Set NABdoc = NABview.GetDocumentByKey (GroupName, True)
						If Not (NABDoc Is Nothing) Then                      'we found a matching document!
							If NABdoc.Type (0) = "Person" Then             'we found a person doc!
								GetNABGroupMembers = NABdoc.Owner
								Exit Function
							End If
							If NABdoc.Type (0) = "Group" Then             'we found a group!
								GetNABGroupMembers = NABdoc.Members
								Exit Function
							End If
						End If
					End If   'of "($NamesFieldLookup) don't exist"
				End If   'of "($Networks) don't exist"
			End If     
			
		End If
	End Forall


Nur ganz fix 'rauskopiert. Dem Algorithmus ist es vollkommen egal, ob das lokal oder auf dem Server läuft.

Morgen ahbe ich bestimmt wieder mehr Zeit  ;)

Bernhard
Titel: Re: Gegeben: Rolle -- Gesucht: wer hat alles diese Rolle
Beitrag von: koehlerbv am 23.12.04 - 00:48:16
Matthias, mal so ein Schnellschuss-Codeschnipsel:
Code
NABs = session.AddressBooks
	
	Forall b In NABs
		If Not b Is Nothing Then
			Call b.Open( "", "" )
			
			If b.IsOpen Then
				Set NABview = b.GetView ("($Networks)" )         'this is a view only in public addressbooks!
				If Not (NABview Is Nothing) Then                        'do not process private address books!
					Set NABview = b.GetView ("($NamesFieldLookup)")
					If Not (NABview Is Nothing) Then                      'strange - in a public NAB this view should exist, but ... don't process this case
						Set NABdoc = NABview.GetDocumentByKey (GroupName, True)
						If Not (NABDoc Is Nothing) Then                      'we found a matching document!
							If NABdoc.Type (0) = "Person" Then             'we found a person doc!
								GetNABGroupMembers = NABdoc.Owner
								Exit Function
							End If
							If NABdoc.Type (0) = "Group" Then             'we found a group!
								GetNABGroupMembers = NABdoc.Members
								Exit Function
							End If
						End If
					End If   'of "($NamesFieldLookup) don't exist"
				End If   'of "($Networks) don't exist"
			End If     
			
		End If
	End Forall


Nur ganz fix 'rauskopiert. Dem Algorithmus ist es vollkommen egal, ob das lokal oder auf dem Server läuft.

Morgen habe ich bestimmt wieder mehr Zeit  ;)

Bernhard