Powershell

使用 powerhshell 作為非管理員服務帳戶的服務計劃重啟

  • December 30, 2016

在我被擊落之前,我知道如何安排任務、使用 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 中將服務權限設置為完全控制。這些都沒有解決問題。它一定是我仍然忽略的某個地方的權限問題,因為當我使用作為伺服器上的本地管理員的域帳戶安排任務時,它工作得很好。

另一個問題的回答者也解決了我的問題。

我做的步驟是:

  1. enable-psremoting在管理員 powershell 提示符下的伺服器上
  2. Set-PSSessionConfiguration -Name Microsoft.PowerShell -ShowSecurityDescriptorUI在管理員 powershell 提示符下的伺服器上
  3. 添加了具有完全權限的服務帳戶(或安全組)
  4. sc sdshow scmanager在管理員命令提示符下的伺服器上
  5. 複製 SDDL 輸出
  6. 在 S: 部分之前添加(A;;KA;;;SID_OF_USER_OR_SECURITY_GROUP)到 SDDL
  7. sc 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)
  8. 更改我的 powershell 腳本,使其使用Start-ServiceCmdLet 而不是Set-Service(Set-Service 不起作用)。

看起來很簡單,結果卻比原本應該的要復雜得多……

引用自:https://serverfault.com/questions/823198