Remotestart

  • Hallo zusammen

    Für ein Projekt wäre es gut, wenn ich auf einem Remotecomputer ein Programm starten könnte.
    Der Benutzer, welcher das Script ausführt, hat lokale Adminrechte auf dem Remotecomputer. (Alles Win7 x64)

    Natürlich könnte ich psexec verwenden. Doch es reizt mich schon, das alles in AutoIt zu lösen.
    Nach einiger Zeit suchen, konnte ich folgendes Script zusammenstellen:

    Spoiler anzeigen
    [autoit]

    ;http://msdn2.microsoft.com/en-us/library/aa389388(VS.85).aspx

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

    MsgBox(0, "", _RemoteStart('C:\Windows\System32\Notepad.exe', "localhost", 1))

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

    Func _RemoteStart($Program, $RemoteComputer, $ShowWindow = 1)
    ;ShowWindow = 1 => Show / 0 => Hide
    Local $oWMIService, $oStartup, $oConfig, $oProcess
    Local $iProcessID, $iReturn
    $oWMIService = ObjGet("winmgmts:{impersonationLevel=impersonate,authenticationLevel=pktPrivacy, (Debug)}!\\" & $RemoteComputer & "\root\cimv2")

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

    $oStartup = $oWMIService.Get("Win32_ProcessStartup")
    $oConfig = $oStartup.SpawnInstance_
    $oConfig.ShowWindow = $ShowWindow

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

    $oProcess = $oWMIService.Get("Win32_Process")
    $iReturn = $oProcess.Create($Program, Default, $oConfig, $iProcessID)

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

    $oWMIService = 0
    $oStartup = 0
    $oConfig = 0
    $oProcess = 0

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

    If $iReturn <> 0 Then
    Return False
    Else
    Return True
    EndIf
    EndFunc ;==>_RemoteStart

    [/autoit]

    Auf dem lokalen Computer läuft es :D
    Doch wenn ich den String localhost auf den Remote-PC umstelle, bekomme ich zwar ein True zurück, doch es wird nichts ausgeführt.

    Kann mir jemand helfen?
    Gruss, Veronesi

  • Hast du auf dem Remote System die entsprechenden Rechte? Das Skript versucht mit den angemeldeten Account auf dem Remote Computer zuzugreifen.

    Gruß,
    UEZ

    Auch am Arsch geht ein Weg vorbei...

    ¯\_(ツ)_/¯

  • Welche Rechte meinst Du?
    Das Script wird bei mir unter einem speziellen Benutzeraccount ausgeführt. Dieser Account ist per GPP bei allen Computern als lokaler Administrator eingetragen.
    Brauche ich sonst noch spezielle Rechte?

    Gruss Veronesi

  • Ich hab's mal getestet und Notepad.exe wird zwar gestartet, aber man bekommt die GUI nicht zu sehen!

    Spoiler anzeigen
    [autoit]


    Func _RemoteStart($Program, $RemoteComputer, $ShowWindow, $usr, $pass)
    ;ShowWindow = 1 => Show / 0 => Hide
    Local $oWMIService, $oStartup, $oConfig, $oProcess
    Local $iProcessID, $iReturn
    Local $objWMILocator = ObjCreate("WbemScripting.SWbemLocator")
    Local $oWMIService = $objWMILocator.ConnectServer($RemoteComputer, "\root\cimv2", $usr, $pass, "", "", 128)
    ;~ $oWMIService = ObjGet("winmgmts:{impersonationLevel=impersonate,authenticationLevel=pktPrivacy, (Debug)}!\\" & $RemoteComputer & "\root\cimv2")

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

    $oStartup = $oWMIService.Get("Win32_ProcessStartup")
    $oConfig = $oStartup.SpawnInstance_
    $oConfig.ShowWindow = $ShowWindow

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

    $oProcess = $oWMIService.Get("Win32_Process")
    $iReturn = $oProcess.Create($Program, Default, $oConfig, $iProcessID)

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

    $oWMIService = 0
    $oStartup = 0
    $oConfig = 0
    $oProcess = 0

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

    If $iReturn <> 0 Then
    Return False
    Else
    Return True
    EndIf
    EndFunc ;==>_RemoteStart

    [/autoit]

    Der Prozess wird unter svchost.exe -> wmiprvse.exe -> notepad.exe aufgehängt.

    Gruß,
    UEZ

    Auch am Arsch geht ein Weg vorbei...

    ¯\_(ツ)_/¯