使用Powerhshell作为非管理员服务帐户的服务计划重新启动


11

在遭到拒绝之前,我知道如何安排任务,使用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中将服务的特权设置为“完全控制”。这些都没有解决问题。它必须我的使用权限问题的地方,我还是远眺,因为当我安排任务与在服务器上的本地管理员的域帐户,它工作得很好。


这可能是一些帮助的serverfault.com/questions/357424/...似乎PowerShell是有关权限非常挑剔,而不是那些显而易见的
Drifter104


@ Drifter104:尽管我使用GPO来设置服务的权限,而不是subinacl,但无论如何我都尝试使用STOE参数进行尝试,但是仍然看到相同的结果。仔细检查了我的GPO设置,它们也启用了“枚举相关服务”选项。
VolrathTheFallen

@ MyronSemack-msemack我尝试像文章中所述手动设置服务的SDDL字符串,但还是没有运气,我认为最终GPO和subinacl会做同样的事情,因为它们似乎可以覆盖彼此。
VolrathTheFallen

1
尝试Set-Service $($service[1]) -status stopped -ComputerName . -Verbose ....代替Stop-ServiceCmdLet怎么样?根据以下答案,Stop-Service和Start-Service显然不可远程:无法在远程计算机上使用Get-Service –ComputerName,并且您的错误消息可能与尝试连接到“远程”本地主机'有关。(<==那里是一个点。)
John aka hot2use

Answers:


3

另一个问题答案也解决了我的问题。

我所做的步骤是:

  1. enable-psremoting 在服务器上的管理Powershell提示中
  2. Set-PSSessionConfiguration -Name Microsoft.PowerShell -ShowSecurityDescriptorUI 在服务器上的管理Powershell提示中
  3. 添加了具有完全权限的服务帐户(或安全组)
  4. sc sdshow scmanager 在服务器上的管理员命令提示符下
  5. 复制SDDL输出
  6. (A;;KA;;;SID_OF_USER_OR_SECURITY_GROUP)在S:部分之前添加到SDDL
  7. sc sdset scmanager THE_MODIFIED_SDDL 我的看起来像这样: 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)
  8. 更改我的powershell脚本,使其使用Start-ServiceCmdLet而不是Set-Service(Set-Service不起作用)。

看起来好像是一种简单的结果,但它本来应该比它复杂。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.