= user()
:description: Gibt ein ECMUserAttributes-Objekt für einen einzelnen Benutzer zurück (mng.GetUserAttributes). Enthält Login, E-Mail, Ablaufdatum und weitere Profilfelder.
:keywords: user, mng.GetUserAttributes, ECMUserAttributes, Login, E-Mail, Profilfelder
:page-tags: api, security

Gibt die detaillierten Attribute eines einzelnen Benutzerkontos anhand des Benutzernamens zurück.
Im Gegensatz zu `users()` liefert diese Methode vollständige Kontoinformationen inkl.
Login-Statistik, Passwort-Ablauf und MFA-Konfiguration.

== Signatur

[tabs]
====
Sync::
+
[source,python]
----
ecm.security.user(username: str) -> ECMUserAttributes | None
----

Async::
+
[source,python]
----
await ecm.security.user(username: str) -> ECMUserAttributes | None
----
====

== Parameter

[cols="1,1,3"]
|===
|Parameter |Standard |Beschreibung

|`username`
|—
|Interner Benutzername (z.B. `"ROOT"`). Nicht die GUID.
|===

== Rückgabewert

`ECMUserAttributes`-Instanz, oder `None` wenn der Benutzer nicht gefunden wurde.

=== ECMUserAttributes-Felder

[cols="1,1,3"]
|===
|Feld |Typ |Beschreibung

|`id`
|`int`
|Numerische Benutzer-ID.

|`username`
|`str`
|Kurzer interner Benutzername.

|`login_name`
|`str`
|Anmeldename für die Authentifizierung.

|`display_name`
|`str`
|Vollständiger Anzeigename.

|`email`
|`str`
|E-Mail-Adresse.

|`guid`
|`str`
|Globally Unique Identifier des Benutzerkontos.

|`profile_id`
|`int`
|Profil-ID: `-1` = kein Profil.

|`locked`
|`bool`
|`True` wenn das Konto gesperrt ist.

|`remark`
|`str`
|Optionale Bemerkung.

|`account_type`
|`int`
|Kontotyp-Kennung.

|`flags`
|`int`
|Bit-Feld mit Benutzer-Flags.

|`lang_id`
|`int`
|Sprach-ID des Benutzers. `0` = Server-Standard.

|`login_count`
|`int`
|Anzahl der bisherigen Anmeldungen.

|`login_station`
|`str`
|Name der Station der letzten Anmeldung.

|`login_time`
|`datetime \| None`
|Zeitpunkt der letzten Anmeldung. `None` wenn noch nie angemeldet.

|`last_modified`
|`datetime \| None`
|Zeitpunkt der letzten Kontoänderung.

|`mfa_flag`
|`int`
|Multi-Faktor-Authentifizierungs-Flag.

|`never_expire`
|`bool`
|`True` wenn das Konto unabhängig von `valid_to` nie abläuft.

|`change_pwd`
|`bool`
|`True` wenn der Benutzer beim nächsten Login sein Passwort ändern muss.

|`pwd_changed`
|`datetime \| None`
|Zeitpunkt der letzten Passwortänderung. `None` wenn noch nie geändert.

|`server_id`
|`int`
|ID des Home-Servers dieses Kontos.

|`station`
|`str`
|Standard-Stationsname des Benutzers.

|`supervisor_id`
|`int`
|Benutzer-ID des Vorgesetzten. `-1` wenn kein Vorgesetzter zugewiesen.

|`valid_from`
|`datetime \| None`
|Gültig-ab-Datum.

|`valid_to`
|`datetime \| None`
|Gültig-bis-Datum.
|===

== Beispiele

=== Benutzer laden und Attribute ausgeben

[tabs]
====
Sync::
+
[source,python]
----
user = ecm.security.user("john")
if user:
    print(user.display_name, user.email, user.guid)
    print(f"Letzte Anmeldung: {user.login_time}")
    print(f"Anmeldezähler: {user.login_count}")
    if user.locked:
        print("Konto ist gesperrt")
----

Async::
+
[source,python]
----
user = await ecm.security.user("john")
if user:
    print(user.display_name, user.email, user.guid)
    print(f"Letzte Anmeldung: {user.login_time}")
----
====

=== GUID für user_groups() ermitteln

[tabs]
====
Sync::
+
[source,python]
----
user = ecm.security.user("john")
if user:
    groups = ecm.security.user_groups(user.guid)
    print([g.name for g in groups])
----

Async::
+
[source,python]
----
user = await ecm.security.user("john")
if user:
    groups = await ecm.security.user_groups(user.guid)
    print([g.name for g in groups])
----
====

== Siehe auch

* xref:api/security/users.adoc[users()] — Alle Benutzerkonten abrufen
* xref:api/security/roles.adoc[roles()] — Systemrollen eines Benutzers
* xref:api/security/user_groups.adoc[user_groups()] — Gruppen eines Benutzers
