使用Powerhshell作为非管理员服务帐户的服务计划重新启动
在遭到拒绝之前,我知道如何安排任务,使用Powershell重新启动服务或为非管理员帐户提供重新启动服务的权限。那不是问题。但是,问题在于这三个任务的结合。 我有一个Windows服务,需要处理网络文件夹上的文件。因此,它使用实际上只是常规域帐户的“服务帐户”登录。该域帐户不是管理员,但具有对该文件夹的访问权限。该服务运行良好,可以正常工作。 但是,有时其中一个文件出现错误,导致无法处理其他文件。通常需要一段时间才能有人注意到,并且还有一些积压。 因此,我在Powershell中创建了一个监视脚本,该脚本轮询网络文件夹中是否有这些错误文件。如果找到它们,则将文件移动到临时文件夹中进行查看,并且需要重新启动服务。 我通过组策略为服务帐户授予了启动和停止服务的特权。 使用服务帐户登录服务器时,可以使用服务MMC手动重新启动服务。我还能够执行powershell脚本,它确实可以实现预期的功能:轮询文件夹,移动文件并重新启动服务。大! 在下一阶段,我创建了一个计划任务,该任务每10分钟运行一次。该任务使用与服务相同的服务帐户来执行Powershell脚本。选中“以最高特权执行”框。就像我说的那样,PowerShell脚本需要访问网络驱动器,所以我不能以本地服务器管理员身份运行它,并且我不想使用域管理员凭据来执行这样的重要任务。(我尽我所能实现最小特权原则。) 我使用本地安全策略MMC在本地服务器上为服务帐户授予了“作为批处理作业登录”权限。 现在,我无法弄清的部分是:在计划的时间,计划的任务成功完成,并且正在执行Powershell脚本。该脚本轮询文件夹,并且错误文件被移动。唯一不起作用的是重新启动服务...?!同样,以同一用户手动运行脚本也可以正常工作。 我在事件查看器中看不到太多内容,但是在脚本上登录时显示此错误: TerminateError(Stop-Service):“无法在计算机'。'上打开Service Control Manager。此操作可能需要其他特权。” 我用来重新启动服务的命令是: 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中将服务的特权设置为“完全控制”。这些都没有解决问题。它必须我的使用权限问题的地方,我还是远眺,因为当我安排任务与在服务器上的本地管理员的域帐户,它工作得很好。