Remotedesktop oder nicht...

  • Hallo zusammen,

    ich muss für mein Script unterscheiden können, ob jemand via Remotedesktop oder direkt (Konsole) an einem PC eingeloggt ist. (Alles Win7)
    Dafür wollte ich die Rückgabe des Befehles quser auswerten.

    Wenn ich in einer CMD-Box den Befehl quser eingebe, bekomme ich zurück, ob er an der console oder an einem Remotedesktop (rdp-tcp#0) eingeloggt ist. Das muss ich auswerten.
    Leider funktioniert das nachfolgende einfache Script nicht, weil er sagt, dass er quser nicht findet.

    Diese Datei gibt es aber (C:\Windows\System32) und kann auch über die Konsole (CMD-Box) angeprochen werden.

    Wo liegt der Fehler?
    Gruss Veronesi

    [autoit]

    Global $PID, $Ret = ""
    $PID = Run('"' & @ComSpec & '" /c quser', '', @SW_HIDE, 0x2)

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

    While 1
    $Ret &= StdoutRead($PID)
    If @error Then ExitLoop
    WEnd

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

    MsgBox(0, "", $Ret)

    [/autoit]

    Einmal editiert, zuletzt von veronesi (1. März 2011 um 06:54)

  • Im technet steht:

    Zitat


    To use query user, you must have Full Control permission or Query Information special access permission.


    Quelle

    Wer andern eine Bratwurst brät
    der hat ein Bratwurstbratgerät.

  • Danke für die Antworten!
    Ich habe nun ein #RequireAdmin an den Anfang gestellt.
    Leider keine Änderung!

    Ich bekomme nichts zurück.
    Wenn ich das ganze in einer DOS-Konsole ohne Admin-Rechte!! teste, funktioniert es!

  • Ich bekomme leider ein leerer String! (Siehe Bild)


    Dazu muss ich noch folgendes sagen:
    Wenn ich das ohne #RequireAdmin ausführe, bekomme ich wie gesagt ein leerer String; also nichts!

    Wenn ich es mit #RequireAdmin ausführe passiert gar nichts! Also die UAC Meldung kommt, ich bestätige und dann passiert nichts mehr.
    Das Script beendet dann ohne Fehler, aber ohne etwas anzuzeigen. Wenn ich es dann als EXE kompilliere und ausführe, dann kommt zwar die
    MsgBox am Ende, aber ist auch ohne Inhalt!

  • Seltsam, funktioniert bei mir auch ohne Probleme und auch ohne Adminrechte.

    Versuch es mal so:

    [autoit]

    Global $PID, $Ret = ""
    ;$PID = Run('"' & @ComSpec & '" /c quser', '', @SW_HIDE, 0x2 + 0x4)
    $PID = Run(@WindowsDir & "\system32\quser.exe", '', @SW_HIDE, 0x2 + 0x4)
    While 1
    $Ret &= StdoutRead($PID) & StderrRead($PID)
    If @error Then ExitLoop
    WEnd

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

    MsgBox(0, "", $Ret)

    [/autoit]
  • Hey veronesi

    Könntest du evt dein Os und wen möglichst deine Hardware Infos Angeben? (Hardware is nebensächlich...Das Os (Betriebssystem) ist wichtiger)
    was sicher auch Interessant währe ist der Registry Eintrag von quser, vll könntest du mit dem programm "CCleaner" die werte oder evt möglich andere Fehler Beheben.... Ich Denken / Hoffe dass du dan prog kennst...Ist nur jedem zu Empfehlen wen man weiss wie man es verwendet :D

    Auser natürlich ich Liege Hier mit meinem verdacht total falsch ^^

    Skilkor

  • Hallo zusammen,

    das OS, ist wie im ersten Post geschrieben Windows 7 (x64)
    Registry Eintrag von quser???
    Das ist kein Benutzer, das ist eine Windows Funktion / Programm!

    Da das Script bei anderen Funktioniert, denke ich, dass es an unserer Domäne liegt...
    Obwohl es sehr komisch ist, dass man es lokal in der DOS-Box ausführen kann......

    Wenn jemand noch Ideen hat, dann habe ich ein offenes Ohr!

    PS: Wegen CCleaner: Der (Test-)PC ist frisch installiert und hat momentan nur AutoIt und Virenscanner drauf.....
    Natürlich ist er in der Domäne. Aber sonst nichts!

  • Was mir bei dir noch auffällt ist, dass du da in deinem run Aufruf auch am Anfang ein Anführungszeichen hast. Probier das mal so:

    [autoit]


    Global $PID, $Ret = ""
    ;$PID = Run('"' & @ComSpec & '" /c quser', '', @SW_HIDE, 0x2)
    $PID = Run(@ComSpec & " /c " & 'quser', "", @SW_HIDE, 0x2)

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

    While 1
    $Ret &= StdoutRead($PID)
    If @error Then ExitLoop
    WEnd

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

    MsgBox(0, "", $Ret)

    [/autoit]

    Funktioniert bei mir jedenfalls beides.

  • Zitat

    Das ist kein Benutzer, das ist eine Windows Funktion / Programm!


    Du dürfstes sicher auch wissen das Programme auch Registry Einträge haben :D
    Öffne Einfach einmal "regedit" und suche nach "quser" (Währe eine Möglichkeit) ^^

    Zitat

    PS: Wegen CCleaner: Der (Test-)PC ist frisch installiert und hat momentan nur AutoIt und Virenscanner drauf.....


    Na wen das so ist ^^ Dan wird dir CCLeaner auch nicht bringen, hast recht (Wahr ja au nur ne Idee :D)

    Ansonsten hab ich kA mehr ^^

  • Sorry, klar weiss ich, dass auch Programme (oder gerade die) Registry Einträge haben!
    Es klang einfach so, als meintest Du einen Benutzer.

    In der ganzen Registry gibt es (bei mir) keinen Eintrag quser.

  • AH, na denn Sorry :D Wollte es nicht so zum verständniss bringen ^^
    Also, Ich weiss ja nicht, aber ich finde einen Eintrag in der Registry mit dem namen User.
    Kann mich ja aba auch Irren :P

  • Kann mir eigentlich nur vorstellen, dass dem User Zugriffsrechte auf C:\ fehlen, oder UAC hier eingreift.
    Probier mal die exe ins Scriptdir zu kopieren, prüfe nochmals ob der benutzer Zugriffsrechte auf die Datei hat und ändere dann den run Aufruf:

    [autoit]


    $PID = Run(@ScriptDir & "\quser.exe", "", @SW_HIDE, 0x2)

    [/autoit]

    Ansonsten fällt mir auch nix mehr ein.

  • Ich habe Zugriffstechte auf C:\
    Auch bin ich lokaler Admin. Die UAC habe ich testweise auch mal deaktiviert.
    Leider alles ohne Erfolg.

    Auch wenn ich das Programm in einen neuen Pfad kopiere, nützt das nichts...

  • Versuch es mal über die WMI :)

    Spoiler anzeigen
    [autoit]

    ConsoleWrite(_WinWMI_LogonSession_Get() & @CRLF)

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

    Func _WinWMI_LogonSession_Get(Const $sComputer = "127.0.0.1")
    Local $sOutput = ""
    $oWMI = ObjGet("winmgmts:{impersonationLevel=impersonate}!\\" & $sComputer & "\root\CIMV2")
    If IsObj($oWMI) = 0 Then Return SetError(-1, @error, 0)
    $oList = $oWMI.ExecQuery("SELECT * FROM Win32_LogonSession WHERE LogonType = 2 OR LogonType = 10", "WQL", 0x10 + 0x20)
    If IsObj($oList) = 0 Then Return SetError(-2, @error, 0)
    For $oItem In $oList
    $oList2 = $oWMI.ExecQuery("Associators of {Win32_LogonSession.LogonId=" & $oItem.LogonId & "} Where AssocClass=Win32_LoggedOnUser Role=Dependent")
    For $oItem2 In $oList2
    $sOutput &= "Name:" & @TAB & @TAB & $oItem2.Name & @CRLF
    $sOutput &= "Domain:" & @TAB & @TAB & $oItem2.Domain & @CRLF
    Next
    Switch $oItem.LogonType
    Case 2
    $sOutput &= "Logon type:" & @TAB & "Console" & @CRLF
    Case 10
    $sOutput &= "Logon type:" & @TAB & "Remote" & @CRLF
    EndSwitch
    Next
    Return $sOutput
    EndFunc ;==>_WinWMI_LogonSession_Get

    [/autoit]

    21 is only half the truth.