2010-11-24 9 views
6

Powershell 2.0を使用して、Microsoftのマニフェスト生成と編集ツール(mage)を使用してアプリケーションマニフェストを作成するスクリプトを作成します。具体的には、動的に指定されたパラメータ値をmageコマンドに渡すことができるようにしたいと考えています(たとえば、xmlやその他のソースから読み込み)。Powershell 2.0を使用してMageを呼び出し、演算子(&)を呼び出す

私はinvoke-expressionを使用してこれを実現できますが、これは安全性の低いオプション(「powershell injection attacks」に弱い)とは思われません。

ここに私が知っているものがあります。 、 - 新:これは、最初の引数は、次のいずれかでなければなりません」メッセージで成功しない

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

これは、メッセージ「正常に作成application.exe.manifest」で成功します(魔術師ではなく、PowerShellの、エラーメッセージです)-update、-sign」:それが正常で解釈されるように私は魔法使いコマンドに$ paramsは値を渡すことができますどのように

$params = "-New Application" 

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

魔道師?

+1

本当に "PowerShellインジェクション攻撃"が発生します。どのようなPowerShell管理スクリプトを書いているのですか。他の誰かが管理者によって実行されます。 –

答えて

6

それは、配列として定義$paramsと簡単である配列項目ごとに1つのパラメータ:

# 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 

同上動的にいくつかの手順で構築$paramsと:

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

この方法では、しばしば見過ごされているが、それは非常に便利です、それはネイティブアプリケーションの複雑なコマンドラインの簡単な動的合成を可能にします。

P.S.また、パラメータ値のスペースを気にする必要はありません。パラメータ配列の値をそのまま使用します。余分なものはありません。"が必要です。

2

スタート-プロセス

それを行うにはどのように多くの方法があります。最初はStart-Process経由です。

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

新しいウィンドウがポップアップします。コンソール内でプロセスを実行したい場合は、単に-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でそれを実行するだけでなく助けることができます。しかし、実行可能ファイルへのパスにスペースがあるので、難しいです。パスにスペースがないので、これは、動作します:

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

しかし、スペースがあれば、あなたは内部&を使用する必要があります。"& ""C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Bin\NETFX 4.0 Tools\mage.exe"" $params"はこれに展開され

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

注こと:

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

これはあなたが望むものです。しかし、パラメータの1つに再びスペースがあれば、再び..あなたはそれを引用する必要があります:

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

構文解析は非常に難しいです:

関連する問題