2017-07-06 71 views
2

我正在尝试创建一个Powershell脚本,该脚本将部署到任何正在显示不良更新运行状况的节点,以自动执行一些简单任务,而不必在其中断用户工作日。如果从提升的PS提示符运行,Powershell脚本完美地工作。当通过SCCM将相同的脚本部署到测试机器时,它也可以正常运行,但有一个例外:它不会调用SFC.EXE /SCANNOW从通过SCCM部署的Powershell脚本中运行SFC.EXE

我已经尝试使用:

Start-Process -FilePath "${env:Windir}\System32\SFC.EXE" -ArgumentList '/scannow' -Wait -NoNewWindow 
Start-Process -FilePath "sfc.exe" -ArgumentList '/scannow' -Wait -NoNewWindow 
Start-Process -FilePath "${env:Windir}\System32\SFC.EXE" -ArgumentList '/scannow' -RedirectStandardOutput "C:\SFC-Out.log" -RedirectStandardError "C:\SFC-Err.log" -Wait -NoNewWindow 
& "sfc.exe" "/scannow" 
Invoke-Command -ScriptBlock { sfc.exe /scannow } 

同样,所有的这些例子工作完全从高架PS提示符下运行预期,但是从部署的PowerShell脚本运行时失败。当我用-RedirectStandardOutput,我检查了文件SFC-Out.log并阅读:

“Windows资源保护不能启动修复服务”

我想这是因为SCCM运行在程序/脚本SYSTEM上下文而不是用户上下文(或者甚至是提升的用户上下文,但SYSTEM应该高于高级会话)。

有没有办法做到这一点?对不起格式不好,这是我在这个网站上的第一篇文章。

+0

试着将'ProcessStartInfo.Verb'设置为'RunAs'。您可以使用此选项以管理员权限运行您的过程。不幸的是,你不能一起使用'Verb'和'RedirectStandardOutput',[见](https://stackoverflow.com/a/3596354) –

+0

那不是弹出一个窗口询问凭据吗?我没有使用'RedirectStandardOutput'就好了,无论如何,这是一个故障排除步骤,以找出为什么'SFC'没有启动。 –

+0

您可以将凭证设置为'ProcessStartInfo.Password'和'ProcessStartInfo.UserName',所以它不会要求您提供凭证,但它可以要求您使用管理员权限确认启动过程。如果你想以管理员的身份运行进程但不确认你可以降低UAC权限 –

回答

0

有点晚了,但我遇到了同样的问题。不知道这是否适合您,但原因是配置了SCCM的脚本部署以32位过程运行。该脚本正在部署到64位系统。当我在部署配置中未选中“以32位进程运行”时,SFC在系统帐户的上下文中没有问题地工作。