我正在尝试从Puppet调用PowerShell脚本。问题是即使PowerShell脚本在远程框上失败,它仍然显示成功运行,如下所示:
注意:/ Stage [main] /主/节[dev.abc.com] / Exec [检查UAC] /返回:成功执行
site.pp
中我的节点块的内容:
exec { 'Check UAC':
command => '& C:\temp\check_uac.ps1',
provider => powershell,
logoutput => 'on_failure',
}
当我尝试从PowerShell控制台运行时脚本失败,说明执行策略设置为Restricted。
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调用脚本时捕获上述错误以避免以后出现意外?
答案 0 :(得分:1)
您需要设置退出代码以使Puppet接收失败:
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
)