2010-11-24 12 views
6

Ich möchte Powershell 2.0 verwenden, um die Erstellung eines Anwendungsmanifests mithilfe von Manifest Generation and Editing (Magier) von Microsoft zu erstellen. Insbesondere würde ich gerne in der Lage sein, dynamisch spezifizierte Parameterwerte an den mage-Befehl zu übergeben (z. B. von xml oder einer anderen Quelle gelesen).Rufen Sie Magier mit PowerShell 2.0 auf und rufen Sie den Operator auf (d. H. &)

Obwohl ich dies mit invoke-expression erreichen kann, möchte ich vermeiden, dass es als eine weniger sichere Option betrachtet wird (d. H. Anfällig für "Powershell-Injection-Angriffe").

Hier ist, was ich weiß.

Dies gelingt mit der Meldung „application.exe.manifest erfolgreich erstellt“:

& "C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Bin\NETFX 4.0 Tools\mage.exe" -New Application 

Dies gelingt nicht mit der Meldung „Das erste Argument eine der folgenden sein: -Neu, -Update, -Sign“(das ist ein Magier, nicht Powershell, Fehlermeldung):

$params = "-New Application" 

& "C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Bin\NETFX 4.0 Tools\mage.exe" $params 

Wie kann ich den $ params Wert auf den Magier Befehl übergeben, damit es erfolgreich interpretiert Magier?

+1

Wirklich "PowerShell Injektion Angriffe", komm schon. Welche Art von PowerShell-Verwaltungsskripten schreiben Sie, die von einem anderen Administrator ausgeführt werden? –

Antwort

6

Es mit $params als Array definiert ist einfach, ein Parameter pro Array Artikel:

# define $params as an array 
$params = "-New", "Application" 

# and pass this array in, just as you tried before 
& "C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Bin\NETFX 4.0 Tools\mage.exe" $params 

Ditto mit $params dynamisch in wenigen Schritten aufgebaut:

$params = @() 
... 
$params += '-New' 
... 
$params += 'Application' 
... 
& "C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Bin\NETFX 4.0 Tools\mage.exe" $params 

Auf diese Weise wird oft übersehen, aber Es ist sehr praktisch, es ermöglicht eine einfache dynamische Zusammenstellung komplexer Befehlszeilen für native Anwendungen.

P.S. Und wir müssen uns nicht um Leerzeichen in Parameterwerten kümmern, wir verwenden Werte im Parameter-Array, so wie sie sind, keine zusätzlichen " benötigt.

2

Startprozess

Es gibt mehr Möglichkeiten, wie das zu tun. Zunächst ist über Start-Process:

$p = '-h 3 google.com' 
start-process tracert -arg $p 

neues Fenster öffnet sich. Wenn Sie möchten, den Prozess innerhalb der Konsole laufen, laufen nur mit -NoNewWindow

$p = '-h 3 google.com' 
start-process tracert -arg $p -nonew 

$params = "-New Application" 
start-process "C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Bin\NETFX 4.0 Tools\mage.exe" -arg $params -nonew 

Invoke-Expression

Invoke-Expression auch helfen könnte. Aber es ist schwierig, weil Sie im Pfad zu Ihrer ausführbaren Datei Leerzeichen haben. Dies funktioniert, weil es keinen Platz im Weg ist:

$p = '-h 3 google.com' 
invoke-expression "tracert $p" 

Aber wenn es einen Raum, müssen Sie & innen verwenden:

$params = "-New Application" 
Invoke-Expression "& ""C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Bin\NETFX 4.0 Tools\mage.exe"" $params" 

Beachten Sie, dass "& ""C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Bin\NETFX 4.0 Tools\mage.exe"" $params" dazu erweitert wird:

& "C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Bin\NETFX 4.0 Tools\mage.exe" -New Application 

was Sie wollten. Aber wenn es wieder einen Platz in einem der Parameter gibt, dann wieder ..Sie müssen es angeben:

$file1 = 'c:\test path\file1.txt' 
$file2 = 'c:\test path\file2.txt' 
$params = """$file1"" ""$file2""" 
Invoke-Expression "& someexecutable $params" 

Das Parsen ist ziemlich schwierig: |

Verwandte Themen