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.