在调用PowerShell脚本时捕获输出/错误

时间:2017-02-27 10:59:18

标签: powershell puppet powershell-v3.0

我正在尝试从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调用脚本时捕获上述错误以避免以后出现意外?

1 个答案:

答案 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
)