Tipp: Benutzergruppe des SwitchContextUserName in einem event ermitteln

Um zu prüfen, ob ein bestimmter Benutzer einer bestimmten Benutzergruppe angehört, gibt es für den aktuell eingeloggten Benutzer die RC.SessionData, die alle Informationen über den aktuellen Benutzer zurückliefert.

Schwieriger wird es, wenn die Benutzergruppe des Context-Benutzers ermittelt werden soll. Hierbei können die folgenden Funktionen helfen.

Der initiale Anwendungsfall in folgendem Beispiel ist die Prüfung, ob ein Benutzer in einer bestimmten Benutzergruppe ist:

Dim userName: userName = RC.InputParams.Value("$$$SwitchContextUserName$$$")
Dim userGroup: userGroup = "MYUSERGROUP"

if userHasGroup(userName, userGroup) = False Then
	' Ausgabe in log-Datei: Pfad\Zu\enaio\server\log
	RC.Logger.Error "User " & userName & " not in usergroup " & userGroup
	...
End If
...

Die eigentliche Prüfung, ob eine bestimmte Benutzergruppe in der für diesen Benutzer zugewiesenen Benutzergruppen zu finden ist:

Function userHasGroup(username, group_search)
	Dim userGroups: userGroups = getUserGroupsForUserGuid(username)
	userHasGroup = False

	For Each group In userGroups
		If group = group_search Then
			userHasGroup = True
			Exit For
		End If
	Next
End Function

Die Benutzergruppen an Hand eines Benutzernamens direkt auslesen ist nicht vorgesehen. Es ist aber alternativ möglich, den Benutzer an Hand seiner osguid auszulesen. Hier kann mit dieser Funktion ausgeholfen werden:

Function getUserGroupsForUserGuid(userName)
	Dim userGroups: userGroups = Array()
	Dim JobInputParameter: Set JobInputParameter = RC.NewJobsParams
	Dim JobOutputParameter: Set JobOutputParameter = RC.NewJobsParams

	RC.Logger.Error "USERGUID: " & getUserGUIDByName(userName)

	With JobInputParameter
		.Value("Flags") = 0
		.Value("UserGUID") = getUserGUIDByName(userName)
	End With
	
	RC.Jobs.mng.GetUserGroups jobInputParameter, jobOutputParameter
	
	Dim Result : Set Result = CreateObject("MSXML2.DOMDocument")
	Result.loadXml(jobOutputParameter.Value("GroupList"))
	
	Set nodes = Result.SelectNodes("//AdmInfo/Groups/Group")
	For Each node In nodes
		group = node.selectSingleNode(".//@name").text

		If Len(group) > 0 Then
			ReDim Preserve userGroups(UBound(userGroups) + 1)
			userGroups(UBound(userGroups)) = group
		End If
	Next

	getUserGroupsForUserGuid = userGroups
End Function

Da beim $$$SwitchContextUserName$$$ die osguid nicht direkt zur Verfügung steht, kann die osguid mit dieser Funktion ermittelt werden:

Function getUserGUIDByName(userName)
	Dim userGuid: userGuid = ""
	Dim JobInputParameter: Set JobInputParameter = RC.NewJobsParams
	Dim JobOutputParameter: Set JobOutputParameter = RC.NewJobsParams

	With JobInputParameter
		.Value("Flags") = 0
		.Value("User") = userName
	End With
	
	RC.Jobs.mng.GetUserAttributes jobInputParameter, jobOutputParameter
	
	Dim Result : Set Result = CreateObject("MSXML2.DOMDocument")
	Result.loadXml(jobOutputParameter.Value("XmlInfo"))
	
	Set nodes = Result.SelectNodes("//AdmInfo/Users/User")

	For Each node In nodes
		userGUID = node.selectSingleNode(".//@osguid").text
	Next

	getUserGUIDByName = userGUID
End Function
1 „Gefällt mir“

@wk Vielen Dank für deine Post. :+1:

Ich wollte noch kurz ergänzend dazu schreiben, dass der Kontext Fall immer dann vorkommt, wenn der aufrufende Service über eine Verbindung Anfragen für verschiedene Benutzer ausführt. Dies sind in der Regel Microservices und Dienste wie der AppConnector oder der DMS Service.

Hierfür benötigt der Service die Systemrolle Server: Jobkontext wechseln (ID: 72):
grafik

Beim normalen Aufruf über den Client sind die Daten des RC.SessionData die Richtigen.