Windows-Server-2008

為什麼從計劃任務執行時 powershell -command“Restart-Service Tomcat6”會失敗?

  • October 2, 2012

當我嘗試執行任務時,我在計劃任務歷史記錄中收到以下錯誤:

Task Scheduler successfully completed task "\Restart Tomcat" ,
instance "{264b4620-5f3b-6c5f-a6cb-1625a7fa57de}" ,
action "C:\Windows\System32\WindowsPowerShell\v1.0\powershell.EXE"
with return code 1.

定時任務配置如下:

  • 名稱:重啟Tomcat

  • 使用者:DOMAIN\tomcat.restarter

  • 觸發器:啟用每日凌晨 2 點

  • 操作:啟動程序

    • 程序/腳本:powershell
    • 論據:-Command "Restart-Service Tomcat6"

當我使用DOMAIN\tomcat.restarter啟動命令提示符時:

runas /user:DOMAIN\tomcat.restart cmd

並執行:

powershell -Command "Restart-Service Tomcat6"

然後echo %errorlevel%列印0並重新啟動Tomcat。這表明 Tomcat6 服務上的 SDDL 足以滿足此目的,並且DOMAIN\tomcat.restarter可以重新啟動它。

如果我將計劃任務參數更改為-Command "'hello world'" > '%TEMP%\Temp.log'我進入return code 0任務歷史並hello world顯示在C:\Users\tomcat.restarter\AppData\Local\Temp\Temp.log. 這表明作為批處理作業登錄使用者權限對DOMAIN\tomcat.restarter有效,它可以執行 Powershell 並且可以寫入文件。

更新:進一步調查

我在 D:\tomcat\bin 中創建了一個 restart.bat 並將 Program/script 設置為restart.bat,將參數設置為 ,> "%TEMP%\Temp.log" 2>&1並將 Start in 設置為D:\tomcat\bin

restart.bat 列表:

powershell -Command "Restart-Service Tomcat6"

我得到C:\Users\tomcat.restarter\AppData\Local\Temp\Temp.log以下內容我得到以下內容:

D:\tomcat\bin>powershell -Command "Restart-Service Tomcat6" 
Restart-Service : Cannot open Tomcat6 service on computer '.'.
At line:1 char:16
+ Restart-Service <<<<  Tomcat6
   + CategoryInfo          : NotSpecified: (:) [Restart-Service], InvalidOper 
  ationException
   + FullyQualifiedErrorId : System.InvalidOperationException,Microsoft.Power 
  Shell.Commands.RestartServiceCommand

從計劃任務執行時為什麼會powershell -Command "Restart-Service Tomcat6"失敗?

tl;博士

我的 SDDL 不完整。我需要將SW (EnumDeps) 添加到 SDDL 中已添加的LCRPWP權限。

長版

這是我的(損壞的)SDDL 的(淨化的)版本:

D:(A;;CCLCSWRPWPDTLOCRRC;;;SY)(A;;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;BA)(A;;CCLCSWLOCRRC;;;IU)(A;;CCLCSWLOCRRC;;;SU)(A;;LCRPWP;;;S-1-1-11-1111111111-1111111111-1111111111-1111)

問題在於最後一個子句權限:

(A;;LCRPWP;;;S-1-1-11-1111111111-1111111111-1111111111-1111)

SID S-1-1-11-1111111111-1111111111-1111111111-1111對於****DOMAIN\tomcat.restarter 所屬的組DOMAIN\Tomcat Restarters是正確的。這麼多是對的。授予的權限 ( LCRPWP ) 不足以Restart-Service

要使Restart-Service Cmdlet 工作,它需要列舉依賴服務的權限。在 SDDL 中,這是SDDL 字元串中的SW (EnumDeps)。我有允許QueryStat、Start 和 Stop 的 LCRPWP。

對我來說,Tomcat 6 的正確 SDDL 是:

D:(A;;CCLCSWRPWPDTLOCRRC;;;SY)(A;;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;BA)(A;;CCLCSWLOCRRC;;;IU)(A;;CCLCSWLOCRRC;;;SU)(A;;LCSWRPWP;;;S-1-1-11-1111111111-1111111111-1111111111-1111)

奧秘在於為什麼 Powershell 可以從 runas 命令提示符執行Restart-Service,但不能從任務計劃程序執行。

我通過閱讀@splattered bits 對他自己在https://serverfault.com/a/357753/57073上與Restart-Service的類似問題的回答得到了必要的啟示。

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