小编Vol*_*len的帖子

使用 powerhshell 作为非管理员服务帐户计划重启服务

在我被击落之前,我知道如何安排任务、使用 powershell 重新启动服务或授予非管理员帐户重新启动服务的权限。那不是问题。然而,问题是所有这三个任务的组合。

我有一个 Windows 服务需要处理网络文件夹上的文件。因此,它使用“服务帐户”登录,该帐户实际上只是一个普通的域帐户。此域帐户不是管理员,但具有对该文件夹的访问权限。该服务运行良好,并完成它的工作。

但是,有时某个文件中的错误会阻止处理其他文件。通常需要一段时间才能有人注意到并且有一些积压。

因此,我在 powershell 中创建了一个监控脚本,用于轮询网络文件夹中的这些错误文件。如果找到,文件将移动到临时文件夹以供查看,并且需要重新启动服务。

我通过组策略授予服务帐户权限来启动和停止服务。

在此处输入图片说明

当我使用服务帐户登录到服务器时,我可以使用服务 MMC 手动重新启动服务。我还能够执行 powershell 脚本,它完全按照预期执行:轮询文件夹、移动文件并重新启动服务。伟大的!

在下一阶段,我创建了一个每 10 分钟运行一次的计划任务。该任务使用与服务相同的服务帐户来执行 powershell 脚本。选中“以最高权限执行”框。就像我说的,powershell 脚本需要访问网络驱动器,所以我不能以本地服务器管理员的身份运行它,我不想使用域管理员凭据来执行这样的琐碎任务。(我尽量实现最小特权原则。)

我使用本地安全策略 MMC 在本地服务器上为服务帐户提供了“作为批处理作业登录”的权限。

现在对于我无法弄清楚的部分:在预定时间计划任务成功完成并且正在执行 powershell 脚本。脚本轮询文件夹并移动错误文件。唯一不起作用的是重新启动服务......?!同样,手动运行脚本,因为同一用户工作得很好。

我在事件查看器中看不到太多内容,但是我的脚本上的日志指出了这个错误:

TerminationError(Stop-Service): “无法在计算机 '.' 上打开服务控制管理器。此操作可能需要其他权限。”

我用来重启服务的命令是:

Stop-Service -Verbose -DisplayName $($service[1])
...
Start-Service -Verbose -DisplayName $($service[1])
Run Code Online (Sandbox Code Playgroud)

(我在 2008 R2 域上使用 Windows Server 2012 R2 和 powershell 版本 4。)

更新: 我都试过,可以通过使用SUBINACL用户的服务权限(如描述这里)和手动设置SDDL字符串(如描述在这里),所以我的控制标志是这样的(A ;; CCLCSWRPWPDTLOCRRC ;;; S-1- X-XX-XXXXXXXXXX-XXXXXXXX-XXXXXXXXX-XXXX)。我还尝试在 GPO 中将该服务的权限设置为完全控制。这些都没有解决问题。这一定是我仍然忽略的某个地方的特权问题,因为当我使用服务器上的本地管理员域帐户安排任务时,它工作得很好。

powershell service-accounts scheduled-task service windows-server-2012-r2

12
推荐指数
1
解决办法
2717
查看次数