2010-11-24 9 views
6

मैं स्क्रिप्ट के लिए एक आवेदन माइक्रोसॉफ्ट के प्रकट पीढ़ी और संपादन उपकरण (दाना) का उपयोग कर प्रकट के निर्माण PowerShell 2.0 का उपयोग करना चाहते हैं। विशेष रूप से, मैं mage कमांड को गतिशील रूप से निर्दिष्ट पैरामीटर मानों को पारित करने में सक्षम होना चाहता हूं (उदा। Xml या किसी अन्य स्रोत से पढ़ें)।आह्वान दाना PowerShell 2.0 का उपयोग कर और ऑपरेटर आह्वान (अर्थात और)

हालांकि मैं इसे आविष्कार-अभिव्यक्ति का उपयोग करके पूरा कर सकता हूं, लेकिन मैं इसे बचाना पसंद करूंगा, इसे कम सुरक्षित विकल्प के रूप में माना जाता है (यानी "पावरहेल इंजेक्शन हमलों" के लिए कमजोर)।

यहाँ मैं क्या पता है।

यह संदेश "application.exe.manifest सफलतापूर्वक बनाया गया" के साथ सफल होता है:

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

यह संदेश "पहला तर्क निम्न में से एक होना चाहिए के साथ सफल नहीं होता: -नया, -दिनांक, -Sign "(जो एक दाना, नहीं powershell है, त्रुटि संदेश):

$params = "-New Application" 

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

तो यह सफलतापूर्वक द्वारा व्याख्या की है मैं कैसे दाना आदेश के लिए $ पैरामीटर मूल्य पारित कर सकते हैं दाना?

+1

वास्तव में "पावरशेल इंजेक्शन हमले" आते हैं। आप किस प्रकार की पावरशेल प्रशासन स्क्रिप्ट लिख रहे हैं जिसे किसी अन्य व्यवस्थापक द्वारा निष्पादित किया जाएगा। –

उत्तर

6

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

इस तरह अक्सर अनदेखी की है लेकिन यह बहुत आसान है, यह देशी अनुप्रयोगों के लिए जटिल कमांड लाइनों की आसान गतिशील संरचना की अनुमति देता है।

पीएस और हमें पैरामीटर मानों में रिक्त स्थान की परवाह नहीं है, हम पैरामीटर सरणी में मानों का उपयोग करते हैं, कोई अतिरिक्त " आवश्यक नहीं है।

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" 

लेकिन है अगर वहाँ एक जगह है, आप अंदर & उपयोग करने की आवश्यकता:

:

$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"" $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" 

पार्स काफी मुश्किल है: |

संबंधित मुद्दे