Powershell remote Script zum Client wird ausgeführt aber ohne Fehlermeldung und ohne starten der Anwendung?

2 Antworten

Bei allem darfst Du nicht vergessen, dass PSExec den gesamten angegebenen Befehl an das Remotesystem übergibt. dabei kommt bei Deinem Code:

$chromeScriptBlock = {
  Start-Process -FilePath "C:\Program Files\Google\Chrome\Application\chrome.exe" -WindowStyle Normal
}
C:\Users\Administrator\Desktop\PSTools\psexec.exe \\192.168.56.10 -i 1 -u XX powershell -ArgumentList "-NoProfile -ExecutionPolicy Bypass -Command & {$chromeScriptBlock}"

...folgende Reaktion:

In Zeile:1 Zeichen:59
+ -ArgumentList -NoProfile -ExecutionPolicy Bypass -Command & {
+                                                           ~
Das kaufmännische Und-Zeichen (&) ist nicht zulässig. Der &-Operator ist für eine zukünftige Verwendung reserviert. Verwenden Sie das kaufmännische Und-Zeichen in doppelten Anführungszeichen ("&"), um es als Teil einer Zeichenfolge zu übergeben.
    + CategoryInfo          : ParserError: (:) [], ParentContainsErrorRecordException
    + FullyQualifiedErrorId : AmpersandNotAllowed

(erstmal muss "-Argumentlist" weg, hat dort Garnichts zu suchen)

C:\Users\Administrator\Desktop\PSTools\psexec.exe \\192.168.56.10 -i 1 -u XX powershell -NoProfile -ExecutionPolicy Bypass -Command "& {$chromeScriptBlock}"

Was ist passiert? ...Quotes (Gänsefüßchen) sind (nicht) passiert. diese werden nach jeder Aufrufebene entfernt, sofern sie nicht maskiert sind oder sich innerhalb eines StringLiterals befinden.

Deine ScriptblockVariable wird aufgelöst , eingesetzt und dem Befehl übergeben.

In der neu gestarteten Instanz wird folgendes ausgeführt:

& {Start-Process -FilePath C:\Program Files (x86)\Google\Chrome\Application\chrome.exe -WindowStyle Normal}

...die schönen "Gänsefüßchen" sind futsch, denn sie wurden einfach mit dem Ebenenwechsel entfernt, weil sie nicht maskiert waren. Solange keine Klammern oder Leerzeichen im Pfad sind, kein Problem, aber Deiner hat beides....

x86 : Die Benennung "x86" wurde nicht als Name eines Cmdlet, einer Funktion, einer Skriptdatei oder eines ausführbaren Programms erkannt. Überprüfen Sie die Schreibweise des Namens, oder ob der Pfad korrekt ist (sofern enthalten), und wiederholen Sie den Vorgang.
In Zeile:1 Zeichen:46
+ & {Start-Process -FilePath C:\Program Files (x86)\Google\Chrome\Appli ...
+                       ~~~
  + CategoryInfo     : ObjectNotFound: (x86:String) [], CommandNotFoundException
  + FullyQualifiedErrorId : CommandNotFoundException

ganz leicht zu fixen, wie betrachten "pfad mit Leerzeichen" als literalen String:

'"pfad  mit Leerzeichen"'

...der rest ist pillepalle:

$chromeScriptBlock = {
  Start-Process -FilePath '"C:\Program Files (x86)\Google\Chrome\Application\chrome.exe"' -WindowStyle Normal
}
c:\pfad\psexec.exe powershell -NoExit -NoProfile -ExecutionPolicy Bypass -Command "& {$chromeScriptBlock}"

(-NoExit verhindert einfach das Schließen der Remoteinstanz von Powershell, damit Du auch mal eventuelle Fehler siehst) ...kann weg...

Solch Probleme treten auf, wenn man Code von irgendwo übernimmt ohne die banalsten Regeln der Sprache und die ausgelösten Reaktionen im Betriebssystem zu kennen. Das ungeschützte "Quotes" nach Parameterübergaben entfernt werden ist ist ein uraltes Ding (in nahezu jeder Sprache) ...

Meine eigenen Regeln dazu:

  • vermeide Strings mit aufzulösenden Variablen "blah $var Blub"
  • einen normaler String ist immer literal definieren 'blah & blubb'
  • der format-operator fügt ohne böse Überraschungen Werte in Literale ein. 'blah {0} blub: {1}' -f $var1, 'wert2'

soviel zu den Basics

Mit dem anderen Ding experimentiere ich garnich erst... () einfach die Quoting-Regen beachten, dann geht das wohl auch durch)

Woher ich das weiß:eigene Erfahrung – Ich mach das seit 30 Jahren

Hab gesehen das du Probleme beim Ausführen einer Anwendung auf einer Remote-VM über PowerShell hast.

Hab dir unten ein paar Möglichkeiten hin geschrieben die das vllt fixen könnten.

1. Stell sicher, dass die Benutzerberechtigungen auf der Remote-VM korrekt konfiguriert sind, um die Anwendungen auszuführen.

2. Du verwendest bereits -ExecutionPolicy Bypass, aber stelle sicher, dass die Execution Policy auf der VM wirklich auf “Bypass” gesetzt ist.

3. Stell sicher, dass die Pfade zu den Anwendungen korrekt sind und die Dateien tatsächlich an den angegebenen Speicherorten existieren.

4. Der Parameter -WindowStyle Normal könnte dazu führen, dass das Fenster der Anwendung im Vordergrund angezeigt wird. Versuchs mal ohne diese Parameter.

5. Füg mal eine Verzögerung zwischen dem Starten des Prozesses und dem Ausführen des Skripts auf der Remote-VM hinzu (vllt geht es dann), um sicherzustellen, dass die Anwendung ausreichend Zeit hat, um zu starten.

6. Überprüfe, ob es Verbindungsprobleme zwischen Host (dir) und VM gibt, die das Starten der Anwendung behindern könnten.

7. Prüf mal die Event- oder Protokolldateien auf der Remote-VM, um mögliche Fehlermeldungen oder Warnungen zu identifizieren, die während deinem Ausführungsvorgangs auftreten könnten.

8. Anstelle von PsExec könntest du Invoke-Command verwenden, um das Skript auf der Remote-VM auszuführen, das kann möglicherweise zu besseren Ergebnissen führen.

Aber sonst hab ich auch kein Plan

Liebe Grüße

Woher ich das weiß:Recherche
FlexDoktor 
Fragesteller
 31.08.2023, 04:41
  1. ist gegeben
  2. hab ich gesetzt
  3. hab ich mehrmals überprüft
  4. -WindowStyle hatte ich im nachhinein probiert
  5. das versuche ich mal ebend, aber wohl unwahrscheinlich da die Anwendungen an sich starten
  6. leider auch ausgeschlossen
  7. ich hab ein paar gefunden aber diese sind leider nicht wirklich hilfreich, suche aber noch nach einer Möglichkeit die Ausführung detailliert zu tracken.
  8. hatte ich vorher auch drin, führt leider zum gleichen Ergebnis
1
Erzesel  31.08.2023, 14:55
@FlexDoktor
suche aber noch nach einer Möglichkeit die Ausführung detailliert zu tracken.

Ein "pause" am Ende des Script hält das Fenster offen.

Im Script aufgerufene Powershell-Instanzen hält man mit dem Parameter -NoExit offen.

Gelegentlich ein:

Write-Host  'Wert der Variable $VarName :' $VarName

... zeigt womit man arbeitet, ohne in die Pipline Zielvariable eingespeist zu werden.

0