Kurz notiert: Massenbenutzeranlage in enaio® mit Python, ecmind_blue_client & XmlElement

Vielleicht hilft das kleine Beispiel jemand weiter. Hier habe ich die Userdaten zur besseren Darstellung schon als fixe List of Dicts (users), diese könnten natürlich aber auch aus einer CSV-Datei, TOML, XML, … kommen.

from ecmind_blue_client.const import ParamTypes
from ecmind_blue_client.job import Job
from ecmind_blue_client.param import Param 
from ecmind_blue_client.tcp_client import TcpClient
from XmlElement import XmlElement
import random  
import string

client:TcpClient = TcpClient('localhost', 4000, 'UserImport', 'root', 'optimal')

users = [ # beispielhafte Daten zum Import
    {'username' : 'aapfel', 'lastname': 'Apfel', 'firstname': 'Anna', 'mail': 'anna.apfel@test.ch'}, 
    {'username' : 'bbirne', 'lastname': 'Birne', 'firstname': 'Beat', 'mail': 'beat.birne@test.ch'}, 
]

for user in users:
    password = ''.join((random.choice(string.ascii_letters) for x in range(24)))
    username = user['username'].split('@')[0].lower()
    user_info = {
        'Users': {
            'User': {
                '@account_type': 0,
                '@bemerkung': None,
                '@benutzer': username,
                '@flags': 1,
                '@geaendert': 1,
                '@langid': 0,
                '@locked': 0,
                '@logincount': 0,
                '@loginstation': None,
                '@logintime': 0,
                '@name': f'{user["firstname"]} {user["lastname"]}',
                '@osemail': user['mail'],
                '@passwort': TcpClient.encrypt_password(password),
                '@profil': '-1',
                '@server_id': 3,
                '@station': None,
                '@supervisor': 0,
                '@validfrom': None,
                '@validto': None,
            }
        }
    }

    job = Job('mng.CreateUser', Flags=0)
    user_info_xml = XmlElement.from_object('AdmInfo', user_info).to_string()
    job.append(Param('UserInfo', ParamTypes.BASE64 , user_info_xml))

    result = client.execute(job)

    if result.return_code == 0:
        print(username, password)
    else:
        print(user, result.error_message)

Achtung: Die Technik mittels ''.join((random.choice(string.ascii_letters) for x in range(24))) ein Kennwort zu würfeln ist aus kryptografischer Sicht sicherlich nicht state of the art.

1 Like

Hi @rk,

ist dir eine Möglichkeit bekannt, wie man bei der Anlage von Benutzern per API auch die passenden Systemrollen für den Benutzer vergeben kann?
Ich hatte diesen Anwendungsfall vor einiger Zeit und bin leider daran gescheitert und musste letztlich auf einen Benutzer-Gruppen-Import ausweichen. Dort kann man es per

<system-role id="1,2,3,..." />

setzen. In der API-Doku von OS habe ich keine Lösung auf meine Anforderung gefunden…

Ja, leider gibt es DMS.GetUserRoles aber nicht DMS.SetUserRoles

In einem vergleichbaren Fall habe ich, um im Standard zu bleiben, das Gleiche gemacht wie Du und erzeuge automatisiert einen Benutzer-Gruppen-Import-XML. :person_shrugging: