Das Notes Forum

Domino 9 und frühere Versionen => ND6: Entwicklung => Thema gestartet von: DannyCrown am 02.12.08 - 08:38:58

Titel: ACL User der Gruppen herausfinden
Beitrag von: DannyCrown am 02.12.08 - 08:38:58
Hallo Forum,

habe mal wieder ein Problem. Habe schon viel hier im Forum gesucht und schon viel ausprobiert aber bis jetzt hat noch nichts zum gewünschten Ergebnis geführt. Habe eine Funktion geschrieben die überprüfen soll, ob eine bestimtme Rolle bei einem User gesetzt ist. Das klappt allerdings nur, wenn der Benutzer als einzelne Person in der ACL drin steht und nicht wenn er in einer Gruppe ist. Hab es schon mit UserGroupNameList der Notessession Klasse probiert, doch diese Property liefert mir nicht das richtige Ergebnis zurück. Vll. kann mir ja jemand weiterhelfen.

Code
Function istRolleGesetzt() As Boolean

	'Aufruf der Fehlerbehandlung
	On Error Goto ErrHandler
	
	'Variablen Dekleration
	Dim session As New NotesSession
	Dim db As NotesDatabase
	Dim acl As NotesACL
	Dim entry As NotesACLEntry
	Dim rückgabewert As Boolean
	
	Set db = session.CurrentDatabase
	Set acl = db.ACL
	
	rückgabewert = False

	'In der Forall Schleife werden alle Rollen des Users durchlaufen.
	'Falls er die Rolle hat wird der Rückgabewert auf True gesetzt
	If Not entry Is Nothing Then		
		Forall r In entry.Roles
			If r = "[RolleA]" Then
				rückgabewert = True
			End If
		End Forall
	End If
	
	istRolleGesetzt= rückgabewert
	
Ende:
	Exit Function	
	
ErrHandler:
	Call OutputError(Err, Erl(), Error())
	Resume Ende
	
End Function
Titel: Re: ACL User der Gruppen herausfinden
Beitrag von: Axel am 02.12.08 - 08:41:46
Das Problem hatte ich auch schon öfters.

Hier eine mögliche Lösung: Prüfung der Zuordnung von Rollen mit Script (http://www.free.dominoserver.de/computer/noteslibrary.nsf/d2d59a3d7fc73a2bc1256a6900638352/c91df359b64b39f1c1256e1600611883!OpenDocument)


Axel
Titel: Re: ACL User der Gruppen herausfinden
Beitrag von: DannyCrown am 02.12.08 - 08:54:34
mh, das hatte ich auch schon hier im Forum, aber diese funktion liefer mir immer true zurück  ???

edit: Es klappt, musste die datenbank nur nochmal schließen. Danke!
Titel: Re: ACL User der Gruppen herausfinden
Beitrag von: klaussal am 02.12.08 - 08:55:43
Code
Function userHasRole (Rolle As String) As Variant
	Dim session As New NotesSession
	Dim db As NotesDatabase
	Dim acl As NotesACL
	Dim aclEntry As NotesACLEntry
	
	Dim eval  As Variant
	Dim varReturn As Variant
	Dim varReturn2 As Variant
	Dim varCompare As String
	Dim Rolle2 As String
	Dim Rolle3 As String
	Dim subString As String
	
	On Error Goto userHasRoleError
	Set db = session.currentDatabase
	
	Rolle2 = Rolle
	Rolle3 = "[" + Rolle + "]"
	
	'eval = Evaluate("@UserRoles")
	eval = Evaluate("@UserNamesList")
	varReturn = Arraygetindex( eval, Rolle2)
	varReturn2 = Arraygetindex(eval, Rolle3)
	If Isnull(varReturn) And Isnull(varReturn2)  Then
		'Messagebox "nix Gefunden"
		userHasRole = False
	Else
		'Messagebox "gefunden"
		userHasRole = True
	End If
	
	Exit Function
	
userHasRoleError:
	userHasRole = False
	Msgbox "Fehler in userHasRole: " & Cstr(Err) & ": " & Error$
	Exit Function
	
End Function
Titel: Re: ACL User der Gruppen herausfinden
Beitrag von: TRO am 02.12.08 - 10:30:06
Warum nicht

roles = notesDatabase.QueryAccessRoles( name$ )

??


Thomas
Titel: Re: ACL User der Gruppen herausfinden
Beitrag von: DAU-in am 02.12.08 - 10:51:43
weil:

Usage
If the name you specify is listed explicitly in the ACL, then QueryAccessRoles returns the roles for that ACL entry and does not check groups.
If the name you specify is not listed explicitly in the ACL, QueryAccess checks to see if the name is a member of a group in the primary address book where the program is running: on a workstation the Personal Address Book; on a server the Domino Directory.


man/frau für explizite Namen nicht die Rollen erhält, die der User über eine Gruppenzugehörigkeit zugeordnet bekommt.

Grüsse

Dau-in
Titel: Re: ACL User der Gruppen herausfinden
Beitrag von: Glombi am 02.12.08 - 11:14:26
@UserNamesList und @UserRoles liefern aber die Werte des angemeldeten Users zurück. Damit kann man nicht prüfen, welcher Rolle ein anderer User hat.

Tipp:
Mit
ret_eval =  Evaluate( |@ExpandNameList(@Dbname;"| & user & |")| )
die Gruppen herausfinden, in denen der User steht. @ExpandNameList dröselt auch Untergruppen auf. Dann über alle Einträge in der ACL iterieren und prüfen, ob das im Array ret_eval  vorkommt.
Falls ja, die zugehörigen Rollen des ACL-Eintrages zur Liste hinzufügen.

Andreas
Titel: Re: ACL User der Gruppen herausfinden
Beitrag von: DannyCrown am 02.12.08 - 11:42:29
mh, hatte ja oben schon geschrieben, dass ich es so gemacht hab, wie Axel gesagt hatte, aber hab gerade mal deine Version ausprobiert, Andreas.

Aber wenn ich ret_eval =  Evaluate( |@ExpandNameList(@Dbname;"| & user & |")| ) eingebe und user hab ich auf session.username gesetzt, gibt er mir auch immer nur diesen session.username zurück. Versteh also nicht so ganz was deine Version überhaupt macht  :-:
Titel: Re: ACL User der Gruppen herausfinden
Beitrag von: DAU-in am 02.12.08 - 11:45:44
Der User ist in Gruppen enthalten?
Titel: Re: ACL User der Gruppen herausfinden
Beitrag von: Glombi am 02.12.08 - 11:47:00
Ja sorry, @ExpandNameList liefert die Namen aller User, die in der Gruppe inkl. aller Untergruppen vorhanden ist.

Also so herum....

Pseudo Code:

forall gruppe in db.ACL
ret_eval =  Evaluate( |@ExpandNameList(@Dbname;"| & gruppe & |")| )

'Hier dann mit ArraygetIndex prüfen, ob der betreffende User in der Gruppe ist: Falls ja, die Rollen der Gruppe zur Liste hinzufügen

end froall


Die Lösung von Axel funktioniert nur für den aktuellen User.

Andreas
Titel: Re: ACL User der Gruppen herausfinden
Beitrag von: BigWim am 02.12.08 - 14:35:53
@Thomas
Zitat
Ja sorry, @ExpandNameList liefert die Namen aller User, die in der Gruppe inkl. aller Untergruppen vorhanden ist.

ich lass mich gern eines besseren belehren, aber in meiner DesignerHilfe (WindowsTitel "... 6.5.1") NotesClient 6.5.4 finde ich nichts über @ExpandNameList. Hatte schon auf eine undokumentierte Formel gehofft, aber auch Fehlanzeige.

@Danny
Du mußt Deine Funktion um einen Funktionsaufruf erweitern, die eine Gruppe in eine Namensliste auflöst.

Ansatzweise mußte ich so etwas auch mal lösen:

Code
Sub Click(Source As Button)
  Dim uiws As New NotesUIWorkspace
  Dim dbAdressbuch As NotesDatabase
  Dim db As NotesDatabase
  Dim doc As NotesDocument
  Dim docMailGruppe As NotesDocument
  Dim docCol As NotesDocumentCollection
  Dim sSearch As String
  Dim NameZugriff As NotesName
  Dim tmpString As String

	
  Set db = uiws.CurrentDatabase.Database
  Set dbAdressbuch = New NotesDatabase (db.Server, "names.nsf")
  Set doc = uiws.CurrentDocument.Document


  If dbAdressbuch Is Nothing Then
    Messagebox "Kann Adressbuch nicht öffnen",16,"keine Anzeige möglich"
    Exit Sub
  End If


  sSearch = {Type = "Group" & ListName = "} + <Name der Gruppe> + {"}
  Print "Suche nach " + sSearch


  Set docCol = dbAdressbuch.Search(sSearch, Nothing, 0)
  If docCol.Count <> 1 Then
    If docCol.Count < 1 Then
      Messagebox "MailGruppe im Adressbuch nicht gefunden",16,"Abbruch"
    Else
      Messagebox Cstr(docCol.Count) + " Dokumente im Adressbuch gefunden",16,"Abbruch"
    End If
    Exit Sub
  End If



  Set docMailGruppe = docCol.GetFirstDocument
' Namensliste aufbauen
  tmpString = ""
  Forall F1String In docMailGruppe.Members
    Set NameZugriff = New NotesName(F1String)
    tmpString = tmpString + NameZugriff.Common + Chr(13)
  End Forall
  Messagebox tmpString, 0,"Mailempfänger"
End Sub
Titel: Re: ACL User der Gruppen herausfinden
Beitrag von: Glombi am 02.12.08 - 14:52:46
@ExpandNameList ist undokumentiert, funktioniert aber mind. aber Version 6.
Titel: Re: ACL User der Gruppen herausfinden
Beitrag von: BigWim am 02.12.08 - 16:45:55
@thomas
Unsere Berechtigungsgruppen fangen mit einem $ bzw. mit einer # an. Damit funktioniert es (noch) nicht - werde mich morgen näher damit beschäftigen. Aber bei Gruppen, der Namen "normal" beginnen, funktioniert es bestens.

Danke für den Hinweis!

Markus