使用 powerhshell 作為非管理員服務帳戶的服務計劃重啟
在我被擊落之前,我知道如何安排任務、使用 powershell 重新啟動服務或授予非管理員帳戶重新啟動服務的權限。那不是問題。然而,問題是所有這三個任務的組合。
我有一個需要處理網路文件夾上的文件的 Windows 服務。因此,它使用實際上只是一個普通域帳戶的“服務帳戶”登錄。此域帳戶不是管理員,但有權訪問該文件夾。該服務執行良好並且可以正常工作。
但是,有時其中一個文件中的錯誤會阻止其他文件被處理。通常需要一段時間才能有人注意到並且有一些積壓。
因此,我在 powershell 中創建了一個監控腳本,用於輪詢這些錯誤文件的網路文件夾。如果找到,則將文件移動到臨時文件夾以供查看,並且需要重新啟動服務。
我通過組策略授予服務帳戶權限以啟動和停止服務。
當我使用服務帳戶登錄到伺服器時,我可以使用服務 MMC 手動重新啟動服務。我還能夠執行 powershell 腳本,它完全按照它應該做的事情:輪詢文件夾、移動文件並重新啟動服務。偉大的!
在下一階段,我創建了一個每 10 分鐘執行一次的計劃任務。該任務使用與服務相同的服務帳戶來執行 powershell 腳本。選中“以最高權限執行”框。就像我說的,powershell 腳本需要訪問網路驅動器,所以我不能以本地伺服器管理員的身份執行它,我不想使用域管理員憑據來完成這樣的瑣碎任務。(我盡量實現最小特權原則。)
我使用本地安全策略 MMC 在本地伺服器上授予服務帳戶“作為批處理作業登錄”權限。
現在對於我無法弄清楚的部分:在計劃的時間,計劃的任務成功完成並且正在執行 powershell 腳本。該腳本輪詢文件夾並移動錯誤文件。唯一不起作用的是重新啟動服務……?!同樣,以同一使用者的身份手動執行腳本可以完美執行。
我在事件查看器中看不到太多東西,但是我的腳本上的日誌記錄了這個錯誤:
TerminatingError(Stop-Service):“無法在電腦 ‘.’ 上打開服務控制管理器。此操作可能需要其他權限。”
我用來重啟服務的命令是:
Stop-Service -Verbose -DisplayName $($service[1]) ... Start-Service -Verbose -DisplayName $($service[1])
(我在 2008 R2 域上使用 windows server 2012 R2 和 powershell 版本 4。)
更新: 我都嘗試使用 subinacl 為使用者設置服務權限(如此處所述)並手動設置 SDDL 字元串(如此處所述),所以我的控制標誌看起來像這樣 (A;;CCLCSWRPWPDTLOCRRC;;;S-1- X-XX-XXXXXXXXXX-XXXXXXXX-XXXXXXXXX-XXXX)。我還嘗試在 GPO 中將服務權限設置為完全控制。這些都沒有解決問題。它一定是我仍然忽略的某個地方的權限問題,因為當我使用作為伺服器上的本地管理員的域帳戶安排任務時,它工作得很好。
另一個問題的回答者也解決了我的問題。
我做的步驟是:
enable-psremoting
在管理員 powershell 提示符下的伺服器上Set-PSSessionConfiguration -Name Microsoft.PowerShell -ShowSecurityDescriptorUI
在管理員 powershell 提示符下的伺服器上- 添加了具有完全權限的服務帳戶(或安全組)
sc sdshow scmanager
在管理員命令提示符下的伺服器上- 複製 SDDL 輸出
- 在 S: 部分之前添加
(A;;KA;;;SID_OF_USER_OR_SECURITY_GROUP)
到 SDDLsc sdset scmanager THE_MODIFIED_SDDL
我的看起來像這樣:sc sdset scmanager D:(A;;CC;;;AU)(A;;CCLCRPRC;;;IU)(A;;CCLCRPRC;;;SU)(A;;CCLCRPWPRC;;;SY)(A;;KA;;;BA)(A;;CC;;;AC)(A;;KA;;;S-1-X-XX-XXXXXXXXXX-XXXXXXXX-XXXXXXXXX-XXXX)S:(AU;FA;KA;;;WD)(AU;OIIOFA;GA;;;WD)
- 更改我的 powershell 腳本,使其使用
Start-Service
CmdLet 而不是Set-Service
(Set-Service 不起作用)。看起來很簡單,結果卻比原本應該的要復雜得多……