在我被击落之前,我知道如何安排一项任务,使用powershell重新启动一项服务,或给非pipe理员帐户授予重新启动服务的权限。 这不是问题。 然而问题是所有这三项任务的结合。
我有一个Windows服务需要处理networking文件夹上的文件。 因此,它使用“服务帐户”login,该服务帐户实际上只是普通的域帐户。 此域帐户不是pipe理员,但具有对所述文件夹的访问权限。 该服务运行良好,这是工作。
但是,有时会在其中一个文件中出现错误,导致无法处理其他文件。 通常需要一段时间才能注意到,还有一些积压。
所以,我在PowerShell中创build了一个监视脚本,用来轮询这些错误文件的networking文件夹。 如果find了,文件将被移动到一个临时文件夹进行审查,并且服务需要重新启动。
我通过组策略提供了服务帐户权限来启动和停止服务。
当我用服务帐户login到服务器时,我可以使用服务MMC手动重新启动服务。 我也能够执行PowerShell脚本,它完全是它应该做的:轮询文件夹,移动文件并重新启动服务。 大!
在下一阶段,我创build了一个计划任务,每10分钟运行一次。 该任务使用与服务相同的服务帐户来执行powershell脚本。 选中“执行最高权限”框。 就像我说的,powershell脚本需要访问networking驱动器,所以我不能运行它作为本地服务器pipe理员,我不想使用域pipe理员凭证这样一个琐事的任务。 (我尽量实现最小特权的原则。)
我使用本地安全策略MMC为服务帐户提供了本地服务器上的“作为批处理作业login”权限。
现在对于我无法弄清楚的部分:在计划的时间,计划任务成功完成,并执行PowerShell脚本。 脚本轮询文件夹并移动错误文件。 唯一不起作用的是重新启动服务…?! 再次,手动运行脚本作为相同的用户完美工作。
我在事件查看器中看不到太多内容,但是在我的脚本上logging了这个错误:
TerminatingError(停止服务):“无法在计算机上打开服务控制pipe理器”,此操作可能需要其他权限。
我用来重新启动服务的命令是:
Stop-Service -Verbose -DisplayName $($service[1]) ... Start-Service -Verbose -DisplayName $($service[1])
(我在2008 R2域上使用Windows Server 2012 R2和PowerShell版本4)。
更新:我都尝试使用subinacl设置服务的权限(如此处所述),并手动设置SDDLstring(如此处所述),所以我的控制标志看起来像这样(A; CCLCSWRPWPDTLOCRRC ;;; S-1- X-XX-XXXXXXXXXX-XXXXXXXX-XXXXXXXXX-XXXX)。 我也尝试在GPO中将服务权限设置为完全控制。 这些都没有解决这个问题。 它必须是一个我仍然忽视的特权问题,因为当我使用服务器上的本地pipe理员的域帐户安排任务时,它工作得很好。
另一个问题的解决scheme也解决了我的问题。
我做的步骤是:
enable-psremoting提示符的服务器上enable-psremoting Set-PSSessionConfiguration -Name Microsoft.PowerShell -ShowSecurityDescriptorUI在pipe理Set-PSSessionConfiguration -Name Microsoft.PowerShell -ShowSecurityDescriptorUI提示符的服务器上的Set-PSSessionConfiguration -Name Microsoft.PowerShell -ShowSecurityDescriptorUI sc sdshow scmanager (A;;KA;;;SID_OF_USER_OR_SECURITY_GROUP)到SDDL sc sdset scmanager THE_MODIFIED_SDDL mine是这样的: 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) Start-Service CmdLet而不是Set-Service (Set-Service不起作用)。 看起来像一个简单的事情,方式比本应该更复杂…