2017-02-27 47 views
1

我想從Puppet調用PowerShell腳本。問題是,即使在PowerShell腳本在遠程機器出現故障時,仍然顯示成功運行,如下圖所示:調用PowerShell腳本時捕獲輸出/錯誤

注意:/Stage[main]/Main/Node[dev.abc.com]/Exec[Check UAC] /回報:執行我的節點塊的成功

含量site.pp

exec { 'Check UAC': 
    command => '& C:\temp\check_uac.ps1', 
    provider => powershell, 
    logoutput => 'on_failure', 
} 

腳本失敗,當我試圖從PowerShell控制檯指出,執行策略設置爲限制運行。

PS C:\> C:\temp\check_uac.ps1 
C:\temp\check_uac.ps1 : File C:\temp\check_uac.ps1 cannot be loaded because running 
scripts is disabled on this system. For more information, see about_Execution_Policies 
at http://go.microsoft.com/fwlink/?LinkID=135170. 
At line:1 char:1 
+ C:\temp\check_uac.ps1 
+ ~~~~~~~~~~~~~~~~~~~~~ 
    + CategoryInfo   : SecurityError: (:) [], PSSecurityException 
    + FullyQualifiedErrorId : UnauthorizedAccess

如何從Puppet調用腳本時捕獲上述錯誤,以避免後來的意外?

回答

1

您需要設置退出代碼有木偶拿起故障:

exec { 'Check UAC': 
    command => '& C:\temp\check_uac.ps1; exit (1 - [int]$?)', 
    provider => powershell, 
    logoutput => 'on_failure', 
} 

然而,由於powershell provider一般應bypass執行政策,您觀察到的錯誤意味着執行的政策是enforced via group policy

更好的方法是在您的環境中修復執行策略,以便它不會禁止腳本執行,並讓腳本返回退出代碼以指示是否啓用UAC。

如果出於某種模糊的原因,你不能修復的實際問題,要處理的症狀相反,你需要exec PowerShell的直接,就像這樣:

exec { 'Check UAC': 
    command => 'C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe -ExecutionPolicy Bypass -NoProfile -NoLogo -NonInteractive -Command "& {C:\temp\check_uac.ps1; exit (1 - [int]$?)}"', 
    logoutput => 'on_failure', 
} 

powershell提供商不會在這方面的工作場景。


如果你想要的是確定PowerShell腳本的執行是否被限制,我會考慮一個動態的事實,一個更好的辦法來確定信息,例如批處理腳本在%AllUsersProfile%\PuppetLabs\facter\facts.d

@echo off 

for /f "tokens=* delims=" %%p in (
    'powershell -NoProfile -NonInteractive -NoLogo -Command "Get-ExecutionPolicy"' 
) do set "policy=%%p" 

if /i "%policy%"=="restricted" (
    echo ExecutionRestricted=true 
) else (
    echo ExecutionRestricted=false 
) 
+0

我試過你的建議,但問題依然存在。儘管「執行策略」設置爲「Restrcited」,但仍然獲得成功的執行消息。在運行PowerShell腳本之前,我們確實解決了策略問題,但是我錯過了一個實例,那時候我注意到我上面發佈的問題。 – Technext

+0

你的意思是「儘管執行策略設置爲Restricted」?限制意味着禁止執行未簽名的腳本。您至少需要RemoteSigned才能執行本地未簽名的腳本。否則,你需要簽署你想執行的腳本。 –

+0

如果執行策略設置爲Restricted並且從PS命令行運行我的powershell(PS)腳本時出現錯誤,那麼當我試圖從Puppet調用PS腳本時,我應該也會得到同樣的錯誤,但這不會發生。木偶輸出顯示它成功運行,但情況並非如此。 – Technext