Benutzerinformationen auslesen

  • Hi Leute,

    ich muss Benutzerangabenauslesen und frage mich wieso dieses Script nicht funktioniert:

    [autoit]


    ; Generated by AutoIt Scriptomatic

    [/autoit][autoit][/autoit][autoit]

    $wbemFlagReturnImmediately = 0x10
    $wbemFlagForwardOnly = 0x20
    $colItems = ""
    $strComputer = "localhost"
    $strUser = "Domain\User"

    [/autoit][autoit][/autoit][autoit][/autoit][autoit]

    $Output=""
    $Output = $Output & "Computer: " & $strComputer & @CRLF
    $Output = $Output & "==========================================" & @CRLF
    $objWMIService = ObjGet("winmgmts:\\" & $strComputer & "\root\CIMV2")
    ;$colItems = $objWMIService.ExecQuery("SELECT * FROM Win32_UserAccount", "WQL", _
    ; $wbemFlagReturnImmediately + $wbemFlagForwardOnly)

    [/autoit][autoit][/autoit][autoit][/autoit][autoit]

    ;Meine Änderung------------------------------------------------------------------------------------------
    $colItems = $objWMIService.ExecQuery("Select * from Win32_UserAccount WHERE Caption = '" _
    & $strUser, "WQL", _
    $wbemFlagReturnImmediately + $wbemFlagForwardOnly)
    ;--------------------------------------------------------------------------------------------------------

    [/autoit][autoit][/autoit][autoit]

    If IsObj($colItems) then
    For $objItem In $colItems
    $Output = $Output & "AccountType: " & $objItem.AccountType & @CRLF
    $Output = $Output & "Caption: " & $objItem.Caption & @CRLF
    $Output = $Output & "Description: " & $objItem.Description & @CRLF
    $Output = $Output & "Disabled: " & $objItem.Disabled & @CRLF
    $Output = $Output & "Domain: " & $objItem.Domain & @CRLF
    $Output = $Output & "FullName: " & $objItem.FullName & @CRLF
    $Output = $Output & "InstallDate: " & WMIDateStringToDate($objItem.InstallDate) & @CRLF
    $Output = $Output & "LocalAccount: " & $objItem.LocalAccount & @CRLF
    $Output = $Output & "Lockout: " & $objItem.Lockout & @CRLF
    $Output = $Output & "Name: " & $objItem.Name & @CRLF
    $Output = $Output & "PasswordChangeable: " & $objItem.PasswordChangeable & @CRLF
    $Output = $Output & "PasswordExpires: " & $objItem.PasswordExpires & @CRLF
    $Output = $Output & "PasswordRequired: " & $objItem.PasswordRequired & @CRLF
    $Output = $Output & "SID: " & $objItem.SID & @CRLF
    $Output = $Output & "SIDType: " & $objItem.SIDType & @CRLF
    $Output = $Output & "Status: " & $objItem.Status & @CRLF
    if Msgbox(1,"WMI Output",$Output) = 2 then ExitLoop
    $Output=""
    Next
    Else
    Msgbox(0,"WMI Output","No WMI Objects Found for class: " & "Win32_UserAccount" )
    Endif

    [/autoit][autoit][/autoit][autoit][/autoit][autoit]

    Func WMIDateStringToDate($dtmDate)

    [/autoit][autoit][/autoit][autoit]

    Return (StringMid($dtmDate, 5, 2) & "/" & _
    StringMid($dtmDate, 7, 2) & "/" & StringLeft($dtmDate, 4) _
    & " " & StringMid($dtmDate, 9, 2) & ":" & StringMid($dtmDate, 11, 2) & ":" & StringMid($dtmDate,13, 2))
    EndFunc

    [/autoit]

    Einmal editiert, zuletzt von ichrootdunix (12. September 2007 um 09:01)

  • Ich will das von srciptomatic erstelle script verwenden um von einem Benutzer weitere Informationen zu erhalten.

    @Username zeigt ja nur den Loginnamen an.

    Jemand eine Idee ?

    mfg

  • Also soweit ich das durch einiges hin- und hertesten mitbekommen habe ist dein Script an sich voll funktionsfähig.

    Wenn du z.B. deine "SQL-Abfrage" auskommentierst und die etwas weiter oben rein nimmst. Funktioniert alles.
    Das gleiche gilt, wenn du den kompletten "WHERE"-Teil deiner Abfrage rausnimmst. Allerdings zeigt er natürlich dann alle Userkonten an.

    Fazit: Irgendwas an deiner SQL-Abfrage im WHERE-Bereich stimmt nicht, so dass die Abrage ein leeres Ergebnis ergibt.

    Leider bin ich nicht der übermäßige SQL-Profi, so dass ich dir nicht sagen kann was genau da falsch ist. Habe da auch ein bischen mit mit den " und ' rumgespielt hat aber nix gebracht. Wie gesagt bin kein Profi ;)

    Ach ja: Natürlich habe ich im oberen Bereich der Variable $strUser einen Wert zugeteilt, der für meine Domain passt und auch einen User eingetragen, der existiert. (Nicht dass jmd. auf die Idee kommt, dass bei mir natürlich kein Benutzer "Domain/user" in der Abfrage gefunden wird :tongue:

  • Ja davon bin ich ausgegangen. Müsste aber eigentlich so stimmen.

    Mein Ziel ist halt zu einem ausgelesenen Benutzer X den Vor und Nachnamen zu lesen.

    Hoffe jemand kann meinen SQL Abfrage korigieren. Aber vielleicht ist es woanders noch ein Logic Fehler drin. Kenn mich mit WSH nicht wirklich aus.

    Naja bin für jede Antwort dankbar.

    mfg

  • Hmmm der SQL-Profi bin ich zwar nicht, aber habs anderes hingekriegt.

    Da allerdings alle User mittels der Abfrage ausgelesen werden, kann ich bei großen Umgebungen mit vielen Usern keine Garantie auf Dauer der Abfrage und Speicherbedarf geben ;)

    Aber hier mal das abgewandelte funktionsfähige Script

    Spoiler anzeigen


    ; Generated by AutoIt Scriptomatic

    $wbemFlagReturnImmediately = 0x10
    $wbemFlagForwardOnly = 0x20
    $colItems = ""
    $strComputer = "localhost"
    $strUser = "Domain\User"


    $Output=""
    $Output = $Output & "Computer: " & $strComputer & @CRLF
    $Output = $Output & "==========================================" & @CRLF
    $objWMIService = ObjGet("winmgmts:\\" & $strComputer & "\root\CIMV2")
    ;$colItems = $objWMIService.ExecQuery("SELECT * FROM Win32_UserAccount", "WQL", _
    ; $wbemFlagReturnImmediately + $wbemFlagForwardOnly)


    ;Meine Änderung------------------------------------------------------------------------------------------
    $colItems = $objWMIService.ExecQuery("Select * FROM Win32_UserAccount", "WQL", $wbemFlagReturnImmediately + $wbemFlagForwardOnly)
    ;--------------------------------------------------------------------------------------------------------


    If IsObj($colItems) then
    For $objItem In $colItems
    if $objItem.Caption = $strUser then
    $Output = $Output & "AccountType: " & $objItem.AccountType & @CRLF
    $Output = $Output & "Caption: " & $objItem.Caption & @CRLF
    $Output = $Output & "Description: " & $objItem.Description & @CRLF
    $Output = $Output & "Disabled: " & $objItem.Disabled & @CRLF
    $Output = $Output & "Domain: " & $objItem.Domain & @CRLF
    $Output = $Output & "FullName: " & $objItem.FullName & @CRLF
    $Output = $Output & "InstallDate: " & WMIDateStringToDate($objItem.InstallDate) & @CRLF
    $Output = $Output & "LocalAccount: " & $objItem.LocalAccount & @CRLF
    $Output = $Output & "Lockout: " & $objItem.Lockout & @CRLF
    $Output = $Output & "Name: " & $objItem.Name & @CRLF
    $Output = $Output & "PasswordChangeable: " & $objItem.PasswordChangeable & @CRLF
    $Output = $Output & "PasswordExpires: " & $objItem.PasswordExpires & @CRLF
    $Output = $Output & "PasswordRequired: " & $objItem.PasswordRequired & @CRLF
    $Output = $Output & "SID: " & $objItem.SID & @CRLF
    $Output = $Output & "SIDType: " & $objItem.SIDType & @CRLF
    $Output = $Output & "Status: " & $objItem.Status & @CRLF
    if Msgbox(1,"WMI Output",$Output) = 2 then ExitLoop
    $Output=""
    endif
    Next
    Else
    Msgbox(0,"WMI Output","No WMI Objects Found for class: " & "Win32_UserAccount" )
    Endif


    Func WMIDateStringToDate($dtmDate)

    Return (StringMid($dtmDate, 5, 2) & "/" & _
    StringMid($dtmDate, 7, 2) & "/" & StringLeft($dtmDate, 4) _
    & " " & StringMid($dtmDate, 9, 2) & ":" & StringMid($dtmDate, 11, 2) & ":" & StringMid($dtmDate,13, 2))
    EndFunc

    Nun noch zur Erklärung:

    Ich habe die Abfrage einfach ohne WHERE realisiert, so dass alle Datensätze eingelesen werden.

    Damit nur der gewünschte User angezeigt wird habe ich weiter unten mittels einer If-Anweisung, die die Variable $objItem.Caption mit dem gesuchten User abgleicht die Ausgabe eingeschränkt.

    Grüße

  • Naja kann ich wegen performancegründen in meiner Umgebung nicht verwenden.

    Am liebsten würd ich es auch nur lokal ausführen damit es schneller geht im Starmenü steht ja auch der Namen drin. Also muss es auch irgendwo auf meinem Rechner liegen.

    Ich schau mal in der Registry nach! *edit Negativ!

    mfg

    Einmal editiert, zuletzt von ichrootdunix (12. September 2007 um 11:09)

  • Also wenn du nur den derzeit angemeldeten Benutzer suchst ist das einfach.

    Gib mal in der Console (cmd) den Befehl "set" ein. Es werden dir alle derzeit gesetzen Systemvariablen angezeigt.

    Unter anderem gibts da eine "USERNAME"-Variable. Die führt den derzeitigen Benutzer.

  • Da seh ich aber nur dir LoginNamen nicht den wirklichen Namen.

    grüße

    Ps. Wo sind dann unsere Superprofis?

  • Schließ doch mal in deiner SQL-Abfrage die Anführungszeichen:

    [autoit]

    $colItems = $objWMIService.ExecQuery("Select * from Win32_UserAccount WHERE Caption = '" _
    & $strUser & "'", "WQL", _
    $wbemFlagReturnImmediately + $wbemFlagForwardOnly)

    [/autoit]

    oder folgendes sollte (zum Ausprobieren) sicher gehen:

    [autoit]


    $strUser = "name"

    [/autoit][autoit][/autoit][autoit]

    $colItems = $objWMIService.ExecQuery("SELECT * FROM Win32_UserAccount WHERE Caption LIKE '%" & $strUser & "'", "WQL", $wbemFlagReturnImmediately + $wbemFlagForwardOnly)

    [/autoit]


    Grüße
    Stilgar

  • Hi,

    ich habs auch mal eben probiert. Ich würde sagen es liegt daran, dass die Spalte der Tabelle nicht Caption heißt. Weiß allerdings auch nicht, wie man das herausfinden kann: Hier nochmal das Skript mit geschlossenen Anführungszeichen:

    Spoiler anzeigen
    [autoit]

    Global Const $WBEM_FLAG_RETURN_IMMEDIATELY = 0x10
    Global Const $WBEM_FLAG_FORWARD_ONLY = 0x20

    [/autoit] [autoit][/autoit] [autoit]

    Local $strComputer = "localhost"
    Local $strUser = "MyHostname\Administrator"
    Local $s_output = "Computer: " & $strComputer & @CRLF & "==========================================" & @CRLF
    Local $objWMIService = ObjGet("winmgmts:\\" & $strComputer & "\root\CIMV2")
    ;~ $colItems = $objWMIService.ExecQuery("SELECT * FROM Win32_UserAccount", "WQL", $WBEM_FLAG_RETURN_IMMEDIATELY + $WBEM_FLAG_FORWARD_ONLY)
    Local $colItems = $objWMIService.ExecQuery ("SELECT * FROM Win32_UserAccount WHERE Caption='" & $strUser & "'", _
    "WQL", $WBEM_FLAG_RETURN_IMMEDIATELY + $WBEM_FLAG_FORWARD_ONLY)

    [/autoit] [autoit][/autoit] [autoit]

    If IsObj($colItems) Then
    For $objItem In $colItems
    $s_output &= "AccountType: " & $objItem.AccountType & @CRLF
    $s_output &= "Caption: " & $objItem.Caption & @CRLF
    $s_output &= "Description: " & $objItem.Description & @CRLF
    $s_output &= "Disabled: " & $objItem.Disabled & @CRLF
    $s_output &= "Domain: " & $objItem.Domain & @CRLF
    $s_output &= "FullName: " & $objItem.FullName & @CRLF
    $s_output &= "InstallDate: " & WMIDateStringToDate($objItem.InstallDate) & @CRLF
    $s_output &= "LocalAccount: " & $objItem.LocalAccount & @CRLF
    $s_output &= "Lockout: " & $objItem.Lockout & @CRLF
    $s_output &= "Name: " & $objItem.Name & @CRLF
    $s_output &= "PasswordChangeable: " & $objItem.PasswordChangeable & @CRLF
    $s_output &= "PasswordExpires: " & $objItem.PasswordExpires & @CRLF
    $s_output &= "PasswordRequired: " & $objItem.PasswordRequired & @CRLF
    $s_output &= "SID: " & $objItem.SID & @CRLF
    $s_output &= "SIDType: " & $objItem.SIDType & @CRLF
    $s_output &= "Status: " & $objItem.Status & @CRLF
    If MsgBox(1, "WMI Output", $s_output) = 2 Then ExitLoop
    $s_output = ""
    Next
    Else
    MsgBox(0, "WMI Output", "No WMI Objects Found for class: " & "Win32_UserAccount")
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    Func WMIDateStringToDate($dtmDate)
    Return (StringMid($dtmDate, 5, 2) & "/" & StringMid($dtmDate, 7, 2) & "/" & _
    StringLeft($dtmDate, 4) & " " & StringMid($dtmDate, 9, 2) & ":" & _
    StringMid($dtmDate, 11, 2) & ":" & StringMid($dtmDate, 13, 2))
    EndFunc ;==>WMIDateStringToDate

    [/autoit]
  • Die Spalte muß schon Caption heißen, denn die Abfrage mit LIKE funktioniert damit und $objItem.Caption würde sonst auch nichts zurückliefern, was eher daraufhin deutet das was mit dem Namen nicht stimmt.

    Bei mir sieht das Ergebnis dann so wie im Bild aus.
    Wobei in Caption die beiden führenden Backslashes nicht enthalten sind. Komischerweise klappt die direkte Abfrage mit WHERE auch dann nicht, wenn ich diese weglasse.

  • [autoit]


    $strUser = "name"

    $colItems = $objWMIService.ExecQuery("SELECT * FROM Win32_UserAccount WHERE Caption LIKE '%" & $strUser & "'", "WQL", $wbemFlagReturnImmediately + $wbemFlagForwardOnly)

    [/autoit]

    Also das funktioniert jetzt ist aber nicht wirklich prakikabel weil es einfach zu lange dauert. Es wird ja das ganze AD durchsucht.

    Gibt es nicht eventuell die möglichkeit das irgendwie lokal rauszufinden oder das suchen lokal einzuschränken.

    Hab schon in der Registry gesucht aber find nichts gutes. Hab ich was übersehen.

    Im Startmenü wird ja auch der volle Name angezeigt das muss ich doch irgendwie abgreifen können.

    Grüße

  • Stilgar. hast Recht. Man greift ja direkt auf die Spalten zu. Wir haben den Wald vor lauter Bäumen nicht gesehen.
    Backslashes müssen in SQL doch escaped werden, also:

    [autoit]

    Local $strUser = "MyHostname\\Administrator"

    [/autoit]


    dann klappts auch mit dem =.

    Ist natürlich trotzdem langsam!

  • Hi,
    da ich WMI-Abfragen mit Where noch nicht gemacht habe, war es für mich ein Vergnügen, das mal auszuprobieren..
    ..hat natürlich nicht geklappt, egal sei's drum..
    Ich habe dann statt 'Caption=' mal 'Name=' probiert und siehe da es funzt..
    Dank teh_hahn kann ich nun nochmal Caption probieren, doch ich wollte nur kurz mitteilen, daß es eben auch mit Name geht, denn dieser wird ja durch die USERName-Variable geliefert ;)
    Gruß
    ytwinky

    (Ich) benutze stets die aktuelle (Beta) und SciTE..