2010-11-24 3 views
6

Powershell 2.0을 사용하여 Microsoft의 매니페스트 생성 및 편집 도구 (마법사)를 사용하여 응용 프로그램 매니페스트를 생성하는 스크립트를 작성하고 싶습니다. 특히, 동적으로 지정된 매개 변수 값을 mage 명령에 전달할 수 있기를 원합니다 (예 : xml 또는 다른 소스에서 읽기).Powershell 2.0을 사용하여 마법사를 호출하고 연산자 (예 : &)를 호출하십시오.

나는 이것을 invoke-expression을 사용하여 수행 할 수 있지만 덜 안전한 옵션 (즉, "powershell injection attacks"에 취약)으로 간주되지 않도록하는 것이 좋습니다.

내가 아는 것은 여기에 있습니다.

이 "application.exe.manifest 성공적으로 만들어"라는 메시지와 함께 성공 :

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

이 메시지 "첫 번째 인수는 다음 중 하나 여야으로 성공하지 않습니다 - 새로운, (메이지하지 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 injection attacks"입니다. 어떤 종류의 PowerShell 관리 스크립트가 다른 관리자에 의해 실행되도록 작성하고 있습니다. –

답변

6

그것은 배열로 정의 $params에 쉽다, 배열 항목 당 하나 개의 매개 변수 동적으로 몇 단계에 내장 $params

# 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 += '-New' 
... 
$params += 'Application' 
... 
& "C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Bin\NETFX 4.0 Tools\mage.exe" $params 

가이 방법은 종종 간과 되나 매우 편리합니다. 네이티브 응용 프로그램을위한 복잡한 명령 줄을 쉽게 동적으로 구성 할 수 있습니다.

P. 매개 변수 값의 공백을 신경 쓸 필요가 없으며 매개 변수 배열의 값을 그대로 사용합니다. "이 필요하지 않습니다.

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 

원하는대로 할 수 있습니다. 그러나 매개 변수 중 하나에 다시 공간이 있으면 다시 ..당신은 그것을 인용해야합니다 :

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

구문 분석은 매우 까다 롭습니다 : |

관련 문제