为什么从计划任务运行powershell命令“Restart-Service Tomcat6”失败?

当我尝试运行一个任务时,我在计划任务历史logging中出现以下错误:

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. 

计划的任务configuration如下:

  • 名称: 重新启动Tomcat
  • 用户: DOMAIN \ tomcat.restarter
  • 触发器: 每日2AM启用
  • 操作: 启动程序
    • 程序/脚本: 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'我在任务历史logging中得到return code 0 ,并且在C:\Users\tomcat.restarter\AppData\Local\Temp\Temp.log 。 这表明作为批处理作业login用户权限是有效的DOMAIN \ tomcat.restarter ,它可以运行Powershell,它可以写入文件。

更新:进一步调查

我在D:\ tomcat \ bin中创build了一个restart.bat,并将程序/脚本设置为restart.bat ,参数为> "%TEMP%\Temp.log" 2>&1然后启动到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-1111DOMAIN \ tomcat.restarter所属的组DOMAIN \ Tomcat Restarters是正确的。 那是对的。 授予的权限( LCRPWP )不足以用于重新启动服务

要使重新启动服务 Cmdlet能够正常工作,需要枚举依赖服务。 在SDDL中,这是SDDLstring中的SW (EnumDeps)。 我有LCRPWP允许QueryStat,启动和停止。

对于我来说,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 ,但不能从Task Scheduler运行。

我从阅读@splattered位获得必要的启示回答他自己类似的问题与重新启动服务https://serverfault.com/a/357753/57073

命令是否需要提升? 即使您将UAC完全closures,计划的任务也需要具有提升特权的checkbox。

我要添加这个作为评论,但代码处理是可怕的:

你可以添加几行来获取更多信息吗?

 $1 = Get-Service *tomcat* Restart-Service $1 $1 >log.log $error >>log.log 

$ error应该输出在这个会话中生成的所有错误信息。

$ 1只会显示它searchTomcat服务时发现的内容。 以防万一因为什么原因无法看到它。