Powershell Script per psexec remote starten

  • Moin,

    ich hab ein kleine Problem ... ich versuche einen Button zu bauen mit dem ich ein PS1-script auf einer anderen Maschine Remote starten kann .... eigentlich kein problem das ist ein einzeiler:

    psexec \\172.16.1.16 -i 0 -u meinedomäne\meinadmin -p meinpw powershell.exe "V:\copy.ps1"

    Nur im verbund mit dem Button haut mir AutoIT immer einen Fehler um die Ohren sobald ich das Script aufrufe ... dauerd beschwert sich das über

    Line 192 (File "Pfad"):

    ShellExecuteWait ("psexec","\\172.16.1.16 -i 0 -u meinedomäne\meinadmin -p meinpw powershell.exe "V:\copy.ps1"")

    ShellExecuteWait (("psexec","\\172.16.1.16 -i 0 -u meinedomäne\meinadmin -p meinpw powershell.exe "V^ERROR

    Error: Missing separator character after keyword.


    was solln das müsste das nicht automatisch als zu übergebender Code erkannt werden da in Klammern und in Gänsefüßchen ?? ?(

  • Hi,

    probier mal:

    $cmd = "\\172.16.1.16 -i 0 -u meinedomäne\meinadmin -p meinpw powershell.exe """ & "V:\copy.ps1"""

    ShellExecuteWait ("psexec", $cmd)

    ;-))

    Stefan

  • Also, wenn der Befehl psexec \\172.16.1.16 -i 0 -u meinedomäne\meinadmin -p meinpw powershell.exe "V:\copy.ps1" heißt (kenn mich damit nit aus), dann musst du das so machen:

    [autoit]

    ShellExecuteWait ("psexec",'\\172.16.1.16 -i 0 -u meinedomäne\meinadmin -p meinpw powershell.exe "V:\copy.ps1"')

    [/autoit]

    Also einfach am Anfang und Ende des zweiten Parameters 'einfache' statt "doppelten" Anführungszeichen nehmen. Sonst denkt AutoIt, der Parameter wär schon bei "V: zu Ende.

  • Danke der Tipp von Arkaneus funktioniert soweit ... nur führt der den Befehl nicht aus ...

    Es startet genau wie es soll eine Dosbox und ich kann sehen wie PSexec die Powershell startet. Aber wenn ich dann auf meinem Zielrechner nachschaue ob er das Script ausgeführt hat ist essig ... den Befehl für PSexec direkt aus der Batch zu starten funktioniert aber ... ich bin grad verwirrt ...

    Edit: ich hab inzwischen rausgefunden, dass der einen der Parameter von Psexec als auszuführende Datei interpretiert


    ShellExecuteWait("psexec", '\\172.16.1.16 -i 0 -u meinedomäne\meinadmin -p meinpw powershell.exe "V:\copy.ps1"')

    wenn ich das also alles anwerfe, dann versucht PSexec seltsamerweise 0 auf 172.16.1.16 zu starten was natürlich nicht klappt ...

    Wenn ich das aber umstelle im Code öffnet sich nur die Powershell ohne den Befehl zum starten des Scripts in V:\copy.ps1 zu übernehmen...

    Einmal editiert, zuletzt von LVierling (11. Juni 2009 um 12:59)

  • aber da ich vor kurzem das gleiche problem hatte - und eine lösung fand wollte ich sie hier teilen:

    ich habe mir mit einem kleinen trick geholfen (bei mir ging es um ps-scripte für exchange 2010)

    zur info - remotepowershell für mehrere benutzer freischalten um sie von autoit aus zu steuern halte ich für "ungut"

    1. erstellt euch eine batchdatei, die das script fehlerfrei auf dem entsprechenden system startet.
    (bsp.


    powershell.bat

    @ECHO OFF
    powershell -PSConsoleFile "C:\Program Files\Microsoft\Exchange Server\V14\Bin\exshell.psc1" -command C:\OOF\beispiel.ps1
    exit

    2. die batchdatei als geplanten task in der aufgabenplanung wie folgt eintragen:
    Name: powershell-test (für das autoit-beispiel)

    Programm/ Script starten:
    C:\Windows\System32\cmd.exe

    Argumente hinzufügen:
    /C C:\powershell.bat

    das ganze als einmalige aufgabe erstellen und zum test einmal laufen lassen.

    3. und hier kommt erst autoit und psexec ins spiel:
    startet den geplanten task remote:

    [autoit]

    RunAsWait("domain\user", "domain,","kennwort",2,'psexec.exe -e \\10.128.0.61 -u domain\user -p kennwort schtasks /run /tn powershell-test',@SystemDir,@SW_SHOW)

    [/autoit]

    so das wars dann schon ...

    solltet ihr allerdings das powershellscript mit autoit erstellen und dann auf dem server ausführen lassen, so müsst ihr einen weiter kleinen "trick" anwenden
    der server wird in der regel meckern dass die datei nach dem kopieren auf den server noch "verwendet" wird und kann den task nicht ausführen.
    fügt hierzu folgende zeile vor dem oben genannten beispiel ein.

    [autoit]

    RunAsWait("domain\user", "domain,","kennwort",2,'psexec.exe -e \\10.128.0.61 -u domain\user -p kennwort openfiles /disconnect /A ' & ' ' & @UserName,@SystemDir,@SW_SHOW)

    [/autoit]


    mit dem kleinen trick werden die offenen dateien des users geschlossen und der geplante task kann ausgeführt werden.

    ich hab lange rumprobiert, wie ich exchange-ps-scripte über autoit als user remote ausführen kann. und das war die einzige möglichkeit die sauber lief.

    achtung sollten mehrer scripte nacheinander ausgeführt werden so benötigt ihr zwingend eine pause - der server (in meinem fall 2008r2) benötigte für ein größeres script ca 18 sec. ich war faul und hab einfach ein sleep(22000) vor dem 2. ps1-script eingefügt.

    jungs fallt nicht über mich her von wegen "alter thread neu aufgewärmt" aber ich hatte mich damit auseinander setzen müssen und bis jetzt lief diese lösung am einfachsten und vor allem am stabilsten.

    hab hier bis jetzt fleissig gelesen und dachte ich geb mal was zurück.


    gruß stefan

    Einmal editiert, zuletzt von stefanffm76 (11. März 2011 um 21:05)