net user in MSG-Box ausgeben

  • Ich möchte gerne von dem Befehl "net user USER /Domain" nur die Zeilen:

    Code
    Letztes Setzen des Kennworts        06.02.2019 09:36:35
    Kennwort läuft ab                   05.08.2019 09:36:35
    Kennwort änderbar                   07.02.2019 09:36:35
    Kennwort erforderlich               Nein

    in einer MSG-Box ausgeben.

    Könnte man dafür den Befehl: IniRead verwenden?

  • Ich möchte gerne von dem Befehl "net user USER /Domain" nur die Zeilen: ... in einer MsgBox ausgeben

    Du könntest den Konsolenstream nehmen, siehe :

    Aus dem Konsolenstream ließen sich die Werte z.B. per RegEx herausfiltern. Allerdings sind die Texte von der jeweiligen Spracheinstellung abhängig.

    Eine andere Möglichkeit wäre eine WMI-Abfrage mit Win32_UserAccount. Diese liefert aber nur einen boolean für z.B 'Kennwort änderbar' (PasswordChangeable). 'Letztes Setzen des Kennworts' ist in dieser Klasse nicht enthalten

    EDIT :

    Folgende UDF von water könnte für Dich interessant sein :

    AD - Active Directory UDF 1.4.11.0

    https://www.autoitscript.com/forum/files/fi…-directory-udf/

    https://www.autoitscript.com/wiki/Active_Di…y_UDF_-_General

    Gruß Musashi

    86598-musashi-c64-png

    "Am Anfang wurde das Universum erschaffen. Das machte viele Leute sehr wütend und wurde allenthalben als Schritt in die falsche Richtung angesehen."

    2 Mal editiert, zuletzt von Musashi (7. Februar 2019 um 17:29)

  • Func _OEMtoChar($sOEM)

    Du sollest den String für die Rückgabe nicht extra in eine neue Variable kopieren, ist völlig unnötig und kostet nur mehr Zeit... besser wäre so:

    Code
    ; Info : statt _OEMtoChar könnte man auch _WinAPI_WideCharToMultiByte verwenden
    Func _OEMtoChar($sOEM)
        Local $aDLLReturn, $sAnsi
        $aDLLReturn = DllCall('user32.dll', 'Int', 'OemToChar', 'str', $sOEM, 'str', '')
        Return @error ? $sOEM : $aDLLReturn[2] ; im Fehlerfall den Originalstring ($sOEM) unkonvertiert zurückgeben
    EndFunc   ;==>_OEMtoChar

    Letztes Setzen des Kennworts... also das Alter des Passworts (PasswordAge)... bekommst du so:

    Einmal editiert, zuletzt von Bitnugger (7. Februar 2019 um 20:20)

  • Hi DerSchatten !

    Hier mal eine Variante des CMD-Konsolenstreams, bei der die Zeilen

    Letztes Setzen des Kennworts 06.02.2019 09:36:35
    Kennwort läuft ab 05.08.2019 09:36:35
    Kennwort änderbar 07.02.2019 09:36:35
    Kennwort erforderlich Nein

    bereits herausgefiltert werden :

    So hast Du die Ausgabezeilen zumindest schon mal in Einzelvariablen. Die kannst Du Dir ja noch 'aufhübschen' ;).

    Das ist aber, wie gesagt, von der jeweiligen Spracheinstellung (ggf. auch Windowsversion :/) abhängig !

    Ein PowerShell Skript in AutoIt auszuführen wäre auch noch eine Möglichkeit - Vielleicht langt Dir aber schon der o.a. Weg.

    Du solltest den String für die Rückgabe nicht extra in eine neue Variable kopieren, ist völlig unnötig und kostet nur mehr Zeit... besser wäre so:

    Stimmt natürlich ! Da hier aber keine Riesenarrays dupliziert werden auch nicht megadramatisch ;).

    DerSchatten :

    Zur Info : @error ? $sOEM : $aDLLReturn[2] nennt man ternären Operator (im Prinzip ein If.. Then .. Else) !

    EDIT :

    Letztes Setzen des Kennworts... also das Alter des Passworts (PasswordAge)... bekommst du so:

    Das hatte ich in der Art als Powershell-Skript schon gesehen.

    Danke für die Umsetzung nach AutoIt - kann man sicher auch allgemein gebrauchen:thumbup:.

    Gruß Musashi

    86598-musashi-c64-png

    "Am Anfang wurde das Universum erschaffen. Das machte viele Leute sehr wütend und wurde allenthalben als Schritt in die falsche Richtung angesehen."

    Einmal editiert, zuletzt von Musashi (7. Februar 2019 um 20:57)

  • $iPID = Run(@COMSPEC & ' /c ' & $sCommand, "", @SW_HIDE, $STDOUT_CHILD + $STDERR_CHILD)
    If Not @error Then

    If Not @error Then

    ...sehr tückisch... funktioniert evt. nicht wie gedacht, denn Run() liefert dir einen Fehlercode, wenn @COMSPEC nicht ausgeführt werden konnte, aber nicht, wenn die Befehle net|find nicht existieren oder an @COMSPEC|net|find Parameter übergeben wurden, die entweden nicht exisiteren oder mit False beantwortet wurden!

    Zur Info: @COMSPEC wird bei Run() & Co nur zur Ausführung interner Befehle der cmd.exe benötigt, für die es keine ausführbare Datei gibt, oder wenn die Ausgabe via Pipe ("|") an einen anderen (internen) Befehl übergeben wird, oder wenn eine Dateiumleitung (">", "<") benötigt wird.

    Hier ein Bsp. mit mehreren Fehlern... Run() gibt aber trotzdem keine Fehlermeldung zurück...

    Ausgabe:

    Code
    @@ Debug line    3   var: $sCommand --> C:\WINDOWS\system32\cmd.exe /ß netz user ghost |findx /I "Letztes Setzen des Kennworts"
    @@ Debug line    9   var: $iPID        --> 13704
    @@ Debug line    11   var: $sSTDOUTText --> Microsoft Windows [Version 10.0.17763.292]
    (c) 2018 Microsoft Corporation. Alle Rechte vorbehalten.
  • If Not @error Then


    ...sehr tückisch... funktioniert evt. nicht wie gedacht, denn Run() liefert dir einen Fehlercode, wenn @COMSPEC nicht ausgeführt werden konnte, aber nicht, wenn die Befehle net|find nicht existieren oder an @COMSPEC|net|find Parameter übergeben wurden, die entweden nicht exisitieren oder mit False beantwortet wurden!

    Ja, die 'Durchgängigkeit' von Fehlercodes bei internen Befehlen der CMD.EXE ist häufiger eine etwas tückische Sache.

    Da ich bei meinem Beispiel die gewünschten Zeilen mittels Pipe ("|find ...") herausfiltere, musste ich aber über @COMSPEC gehen. Run('C:\Windows\System32\net user ... ' würde mit Pipe nicht funktionieren (das hast Du in Deiner Info zu @COMSPEC ja auch beschrieben)

    Aufgrund seiner klaren Ausgangsfrage

    Ich möchte gerne von dem Befehl "net user USER /Domain" nur die Zeilen :

    Letztes Setzen des Kennworts 06.02.2019 09:36:35

    Kennwort läuft ab 05.08.2019 09:36:35

    Kennwort änderbar 07.02.2019 09:36:35

    Kennwort erforderlich Nein

    im einer MsgBox ausgeben

    weiß DerSchatten , welche (sinnvollen) Werte zurückkommen müssen. Daher halte ich das o.a. Risiko im vorliegenden Fall für überschaubar. Die Sprachabhängigkeit würde mich da schon eher stören ;).

    Letztlich ist das Beispiel ja nur ein möglicher Lösungsvorschlag - am Ende kann der TE entscheiden, ob ihm diese Variante ausreicht.

    Gruß Musashi

    86598-musashi-c64-png

    "Am Anfang wurde das Universum erschaffen. Das machte viele Leute sehr wütend und wurde allenthalben als Schritt in die falsche Richtung angesehen."

    Einmal editiert, zuletzt von Musashi (8. Februar 2019 um 08:22)

  • Die Sprachabhängigkeit würde mich da schon eher stören ;) .

    So wäre es auch machbar... ohne @COMSPEC und ohne Sprachabhängigkeit. 8o

  • So wäre es auch machbar... ohne @COMSPEC und ohne Sprachabhängigkeit. 8o

    Hi Bitnugger !

    Ja, das wäre eine Möglichkeit (an diese Variante hatte ich auch mal gedacht).

    DerSchatten (zur Info) :

    Der Konsolenstream wird einem Array (hier : $aRx) zugewiesen. Dabei sorgt das/der Pattern '(.+)\R' dafür, dass als Delimiter die Zeilenumbrüche verwendet werden.

     --> \R = @CRLF oder @CR oder @LF (bzw. \r\n oder \r oder \n)

    Anstatt also nach einem Text (z.B. 'Letztes Setzen des Kennworts') zu suchen, wird der jeweilige Zeilenindex des Arrays genommen (hier 7). Damit wäre die Spracheinstellung des Systems (deutsch, englisch, japanisch usw.) irrelevant. Sollte sich die Reihenfolge der Zeilen aber in den jeweiligen Windowsversionen unterscheiden :/, dann hat man mit Rosinen gehandelt :P.

    Das könnte bei den Texten aber auch so sein, von daher ist die Arrayvariante ggf. 'risikoloser'.

    @All : Das es andere Wege gibt, ist mir und Bitnugger bewusst - hier geht es aber um net user !

    Bitnugger :

    Ich denke, wir warten jetzt erst mal auf ein Feedback von DerSchatten !

    Die Umstellung auf die eine oder andere Variante ist ja nicht sonderlich aufwendig.

    Gruß Musashi

    86598-musashi-c64-png

    "Am Anfang wurde das Universum erschaffen. Das machte viele Leute sehr wütend und wurde allenthalben als Schritt in die falsche Richtung angesehen."

  • hier geht es aber um net user !

    Hm, nun ja, letztendlich holt sich der Befehl net.exe ja auch irgendwo die Informationen her... und genau das macht das Script in Post #3 auch - es liefert alle von ihm gewünschten Informationen, wobei net.exe sie allerdings etwas "appetitlicher" serviert.

    Hier noch eine WMI-Version, bei der die Ausgabe fast identisch mit net.exe ist, wobei ich für "Kennwort änderbar" aber kein Datum, sondern "Ja|Nein" verwende.

    Einmal editiert, zuletzt von Bitnugger (11. Februar 2019 um 18:12)

  • Hm, das funkt irgendwie nicht:

  • Hm, das funkt irgendwie nicht:

    :Glaskugel:

    Einige Leute haben sich hier viel Zeit genommen, um Dir (ausführlich) zu helfen !

    Könntest Du Dir bitte auch die Zeit nehmen, um Deine Fragen/Fehlermeldungen sinnvoll auszugestalten !

    Gruß Musashi

    86598-musashi-c64-png

    "Am Anfang wurde das Universum erschaffen. Das machte viele Leute sehr wütend und wurde allenthalben als Schritt in die falsche Richtung angesehen."

  • Global $sUsername = "luef /domain"

    Das wird so auch nicht funktionieren, da der Username "luef" lautet, nicht "luef /domain".

    Das /domain kann z.B. hier angegeben werden (ungetestet) :

    $sPasswordLastSet = _GetCMDOutput('net user ' & $sUsername & ' /domain |find ... )

    DerSchatten : Edit

    Ist dieses |find eine Option von net user oder von Autoit?

    Das ist ein Kommandozeilenbefehl der CMD.exe, siehe:

    https://ss64.com/nt/

    https://ss64.com/nt/find.html

    Gruß Musashi

    86598-musashi-c64-png

    "Am Anfang wurde das Universum erschaffen. Das machte viele Leute sehr wütend und wurde allenthalben als Schritt in die falsche Richtung angesehen."

    Einmal editiert, zuletzt von Musashi (22. Februar 2019 um 11:35)

  • Leider nein...

    Wenn das ein Teil der cms.exe ist warum bekomme ich dann eine Fehlermeldung wenn ich das im CMD eingebe?

    Code
    C:\>net user luef /domain |find /I "Letztes Setzen des Kennworts"
    find: /I: No such file or directory
    find: Letztes Setzen des Kennworts: No such file or directory
  • Wenn das ein Teil der cms.exe ist warum bekomme ich dann eine Fehlermeldung wenn ich das im CMD eingebe?

    Lokal funktioniert es, siehe :

    /domain kann ich bei mir nicht testen, aber vermutlich eine Pfadsache zur CMD.exe !

    Info :

    /domain - This switch forces net user to execute on the current domain controller instead of the local computer.

    Bemühe halt mal die Suchmaschine Deines Vertrauens.

    Gruß Musashi

    86598-musashi-c64-png

    "Am Anfang wurde das Universum erschaffen. Das machte viele Leute sehr wütend und wurde allenthalben als Schritt in die falsche Richtung angesehen."

  • Ok, es liegt wohl daran das CMD als Administrator gestartet werden muß.

    Damit fällt die Option aber leider aus, da ich das hier im Firmenbetrieb nicht so bereitstellen kann.

    Was mich noch interessieren würde, warum stellt Autoit Umlaute die in einem CMD korrekt ausgegeben werden falsch dar?

    Das "Kennwort änderbar" wird zb. zu einem "Kennwort „nderbar"

    Einmal editiert, zuletzt von DerSchatten (22. Februar 2019 um 13:54)

  • Was mich noch interessieren würde, warum stellt Autoit Umlaute die in einem CMD korrekt ausgegeben werden falsch dar?

    Das "Kennwort änderbar" wird zb. zu einem "Kennwort „nderbar"

    Der CMD-Konsolenstream ist u.U. anders kodiert. Die Darstellung innerhalb von SciTE hängt z.B. von gewissen codepage-Einstellungen ab usw.

    Beispiel (lokal ausführen) :

    Gruß Musashi

    86598-musashi-c64-png

    "Am Anfang wurde das Universum erschaffen. Das machte viele Leute sehr wütend und wurde allenthalben als Schritt in die falsche Richtung angesehen."

  • Wenn das ein Teil der cms.exe ist warum bekomme ich dann eine Fehlermeldung wenn ich das im CMD eingebe?

    Weil du den Parameter /DOMAIN nicht richtig verwendest!

    So ist es richtig:

    Code
    NET USER DerSchatten /DOMAIN MeineDomain.com | find /I "Letztes Setzen des Kennworts"

    Was mich noch interessieren würde, warum stellt Autoit Umlaute die in einem CMD korrekt ausgegeben werden falsch dar?

    Standard-Codepage für die CMD ist OEM 850 und SciTE verwendet für die Output pane die Windows-Default Codepage Windows-1252, aka CP 1252 sowie Westeuropäisch (Western European) oder ANSI.

    Weil hier mit zwei verschieden Codepages hantiert wird, müssen die Zeichen für die Ausgabe entsprechen konvertiert werden, wie es Musashi bereits gezeigt hat.

    https://de.wikipedia.org/wiki/Codepage_850

    https://de.wikipedia.org/wiki/Windows-1252

    2 Mal editiert, zuletzt von Bitnugger (22. Februar 2019 um 17:28)