lokale Windows Benutzer abfragen die 2.te

  • So ich nochmal :)

    ich habe den Code jetzt so angepasst, dass ich einen bestimmten User checken kann.

    Spoiler anzeigen
    [autoit]

    ; Generated by AutoIt Scriptomatic
    $wbemFlagReturnImmediately = 0x10
    $wbemFlagForwardOnly = 0x20
    $colItems = ""
    $strComputer = "localhost"
    $check_local_admin = 0

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

    $objWMIService = ObjGet("winmgmts:\\" & $strComputer & "\root\CIMV2")
    $colItems = $objWMIService.ExecQuery("SELECT * FROM Win32_GroupUser", "WQL", $wbemFlagReturnImmediately + $wbemFlagForwardOnly)

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

    If IsObj($colItems) then
    For $objItem In $colItems
    If StringInStr($objItem.PartComponent,"admin_ntt") Then
    $check_local_admin = 1
    ExitLoop
    EndIF
    Next
    If $check_local_admin = 1 Then
    MsgBox(0,"","User admin_nt existiert bereits!")
    Else
    MsgBox(0,"","User admin_nt existiert noch nicht!")
    EndIf
    Else
    Msgbox(0,"WMI Output","No WMI Objects Found for class: " & "Win32_GroupUser" & @CRLF & "It is not possible to check if the local admin user 'admin_nt exists" )
    Endif

    [/autoit]

    So jetzt mein Problem:
    wenn der User nicht gefunden wird läuft die Sache ca. 15 min!
    Grund:
    nachdem er die lokalen Gruppen abgearbeitet hat macht er mit den Domänen Gruppen weiter und das dauert natürlich.

    Kann ich die Abfrage auf den lokalen PC, bzw. vielleicht sogar auf die beiden lokalen Gruppen "Benutzer" und "Administratoren" beschränken?
    Ich hab leider kein Plan von WMI abfragen.

    Danke nochmals im vorraus

    c ya
    Paddy

    • Offizieller Beitrag

    So OK ?

    Zitat

    Kann ich die Abfrage auf den lokalen PC, bzw. vielleicht sogar auf die beiden lokalen Gruppen "Benutzer" und "Administratoren" beschränken?


    Ist schon auf lokalen PC beschränkt: $strComputer = "localhost"

    Spoiler anzeigen
    [autoit]

    $wbemFlagReturnImmediately = 0x10
    $wbemFlagForwardOnly = 0x20
    $colItems = ""
    $strComputer = "localhost"
    $check_local_admin = 0

    $objWMIService = ObjGet("winmgmts:\\" & $strComputer & "\root\CIMV2")
    $colItems = $objWMIService.ExecQuery("SELECT * FROM Win32_GroupUser", "WQL", $wbemFlagReturnImmediately + $wbemFlagForwardOnly)

    If IsObj($colItems) then
    For $objItem In $colItems
    If ( StringInStr($objItem.GroupComponent,"Administratoren") ) Or _
    ( StringInStr($objItem.GroupComponent,"User") ) Then
    If StringInStr($objItem.PartComponent,"admin_ntt") Then
    $check_local_admin = 1
    ExitLoop
    EndIf
    EndIf
    Next
    If $check_local_admin = 1 Then
    MsgBox(0,"","User admin_nt existiert bereits!")
    Else
    MsgBox(0,"","User admin_nt existiert noch nicht!")
    EndIf
    Else
    Msgbox(0,"WMI Output","No WMI Objects Found for class: " & "Win32_GroupUser" & @CRLF & "It is not possible to check if the local admin user 'admin_nt exists" )
    Endif

    [/autoit]
  • Ich geb dir ja recht das da localhost steht aber das ist dem script irgendiwe egal :tongue:
    Das checkt bei mir alle lokalen Gruppen und anschließend alle Domänen Gruppen ab ohne Witz.

    Da original Script von th.meger gibt ja die Ergebnisse aus. Kannst es ja mal ausprobieren wenn du zufällig in einer Domäne bist.

    Und nun ?(

  • Das Problem liegt glaube ich daran, dass die Einschränkung auf die Gruppen erst in der Schleife passiert.
    Der Befehl

    [autoit]

    $colItems = $objWMIService.ExecQuery("SELECT * FROM Win32_GroupUser", "WQL", $wbemFlagReturnImmediately + $wbemFlagForwardOnly)

    [/autoit]


    füllt meiner Meinung nach die Variable "$colItems" mit einer riesigen Datenmenge (unter anderem auch das aus der Domäne). Die For Next Schleife arbeitet deshalb trotzdem alles ab und deshalb dauerts so lange.
    Sehe ich das richtig?

    Kann man denn nicht schon bei obigem Befehl eine Einschränkung machen? Sieht ja irgendwie aus wie ne SQL Abfrage oder ?(

    c ya
    Paddy

    • Offizieller Beitrag
    Zitat

    MSDN
    Win32_GroupUser-Abfragen werden von WMI verarbeitet, indem einer vollständigen Aufzählung von Win32_GroupUser wie auch einer vollständigen Aufzählung der zu verknüpften die Klassen sein Klassen zuerst durchführt. Obwohl die vorhergehende Abfrage Daten "BUILTIN" auf (lokalen) Gruppenmitgliedschaften nur anfordert, wird eine vollständige Aufzählung, alle Domänen und vertrauenswürdiger Domänen aufgerufen. Diese vollständige Enumeration kann innerhalb weniger Sekunden in einer kleinen Domäne abgeschlossen werden. Diese Enumeration kann jedoch für Abschluss dieser Enumeration in einer großen Domäne, die über mehrere Domänen vertraut, mehrere Stunden in Anspruch nehmen.

    Nun weißt du zumindest warum "localhost" hier nichts begrenzt. Ich schau mal ob man das eingrenzen kann.

  • So ich nochmal.
    Ich hab die Sache jetzt anderst gelöst, brauchst also nicht mehr zu suchen. Trotzdem Danke natürlich.

    Ich habs jetzt über einige Tricks gemacht :rolleyes:

    Aber es funzt.

    Spoiler anzeigen
    [autoit][/autoit] [autoit][/autoit] [autoit]

    #include <Constants.au3>
    $tempdir = @TempDir & "\"
    $localadmin = 0
    $user = "test_lokal"
    $password = "test"
    $pid = Run(@ComSpec & ' /c net user', '','',$STDERR_CHILD + $STDOUT_CHILD)
    While 1
    $line = StdoutRead($pid)
    If @error Then ExitLoop
    If StringInStr($line,$user) Then
    $localadmin = 1
    EndIf

    Wend

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

    If $localadmin = 1 Then
    AutoItSetOption("RunErrorsFatal",0) ;silent error (@error --> 1) on run() failures
    RunAsSet($user,@ComputerName,$password)
    Run(@ComSpec & " /c " & 'set',$tempdir, @SW_HIDE)
    If @error = 0 Then
    MsgBox(0, "",$user & " found with correct password")
    Else
    MsgBox(0, "",$user & " was found, but has a wrong password")
    EndIf
    Else
    MsgBox(0, "",$user & " not found")
    EndIf

    [/autoit]

    c ya
    Paddy