Problem mit _Security_OpenProcessToken als Systembenutzer

  • Hallo AutoIt.de Community,

    Ich habe folgendes Skript:

    Spoiler anzeigen
    [autoit]

    #include <ProcessConstants.au3>
    #include <StructureConstants.au3>
    #include <SecurityConstants.au3>
    #include <Security.au3>
    #include <WinAPI.au3>

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

    ConsoleWrite(_runAsUser("C:\mein\Ordner\test\application.exe", "C:\mein\Ordner\test\" & @CRLF)

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

    Func _runAsUser($sCommandLine = "", $sProcessDir = "")
    Local $tSTARTUPINFO = DllStructCreate($tagSTARTUPINFO)
    Local $tPROCESS_INFORMATION = DllStructCreate($tagPROCESS_INFORMATION)

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

    Local $hProcess = _WinAPI_OpenProcess($PROCESS_ALL_ACCESS, 0, ProcessExists("explorer.exe"))

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

    If $hProcess Then
    Local $hTokOriginal = _Security__OpenProcessToken($hProcess, $TOKEN_ALL_ACCESS)

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

    _WinAPI_CloseHandle($hProcess)
    If $hTokOriginal Then
    Local $hTokDuplicate = _Security__DuplicateTokenEx($hTokOriginal, $TOKEN_ALL_ACCESS, $SECURITYIMPERSONATION, $TOKENPRIMARY)

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

    _WinAPI_CloseHandle($hTokOriginal)

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

    If $hTokDuplicate Then
    _Security__CreateProcessWithToken($hTokDuplicate, 0, $sCommandLine, 0, $sProcessDir, $tSTARTUPINFO, $tPROCESS_INFORMATION)

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

    _WinAPI_CloseHandle($hTokDuplicate)
    _WinAPI_CloseHandle(DllStructGetData($tPROCESS_INFORMATION, "hProcess"))
    _WinAPI_CloseHandle(DllStructGetData($tPROCESS_INFORMATION, "hThread"))
    Return DllStructGetData($tPROCESS_INFORMATION, "ProcessID")
    EndIf
    EndIf
    EndIf
    EndFunc

    [/autoit]

    Das Skript läuft super (liegt wohl daran, dass ich es der Hilfe entnommen habe :D ). Ich kann eine EXE kompilieren, diese dann als anderer Benutzer ausführen und das Skript wird dennoch als angemeldeter Benutzer ausgeführt. (explorer.exe läuft unter angemeldetem Benutzer.) Also genau was ich will.

    Wenn ich jedoch die gleiche Funktion als Systembenutzer ausführe, (also als Service Services.au3 usw.) gibt die Funktion zwar die PID zurück, jedoch ist der Prozess nicht auffindbar.

    Ich habe es auch schon direkt per DLLCall versucht:

    [autoit]

    DllCall("advapi32.dll", "bool", "CreateProcessWithTokenW", "handle", $hTokDuplicate, "dword", 0, "ptr", 0, "wstr", $sCommandLine, "dword", 0, "ptr", "username_ohne_domain", "wstr", $sDir, "struct*", $tSTARTUPINFO, "struct*", $tPROCESS_INFORMATION)

    [/autoit]

    Ich hoffe ihr könnt mir helfen.

    3 Mal editiert, zuletzt von WATERSTORMms (14. August 2012 um 13:20)