2017-07-06 144 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在系統帳戶的上下文中沒有問題地工作。