為什麼從計劃任務執行時 powershell -command“Restart-Service Tomcat6”會失敗?
當我嘗試執行任務時,我在計劃任務歷史記錄中收到以下錯誤:
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的類似問題的回答得到了必要的啟示。