[英]Restarting service remotely as non-admin?
我们托管(在 Server 2019 上)一些其他人知道的服务器应用程序,并通过 web 接口或客户端应用程序配置内部设置。 有时,应用程序的管理器需要停止或重新启动服务,因为它挂起或者他们进行了需要重新启动的设置更改。 我想给他们一个脚本,让他们自己做,而不是等我。 这些用户无法登录服务器。
作为工作站的系统管理员,这些类型的 PoSh 行可以工作:
invoke-command -ComputerName $server -ScriptBlock { stop-Service 'XYZservice' }
Get-Service -ComputerName $Server -Name $Service | start-service
我已授予用户对服务的“启动/停止”权限,他们(而不是其他用户)可以通过以下方式获取服务的状态:
Get-Service -ComputerName $Server -Name $Service
但是,如果我的非特权用户尝试实际启动/停止服务,我们会得到:
invoke-command -ComputerName $server -ScriptBlock { stop-Service 'XYZservice' }
[server.domain.edu] Connecting to remote server server.domain.edu failed with the following error
message : Access is denied. For more information, see the about_Remote_Troubleshooting Help topic.
和:
Get-Service -ComputerName $Server -Name $Service | start-service
start-service : Service 'XYZservice' cannot be started due to the following error: Cannot open XYZservice service on
computer 'server.domain.edu'.
同样地:
(Get-WmiObject Win32_Service -filter "name='XYZservice'" -ComputerName $Server).StopService()
Get-WmiObject : Access is denied. (Exception from HRESULT: 0x80070005 (E_ACCESSDENIED))
还有其他一些 PowerShell 技巧可以让它工作吗? 如果只允许查看状态,“开始/停止”权限有什么用?
谢谢。
@Lee_Dailey 指导我找到最优秀的解决方案。 遵循这些出色的说明以及此处提供的更多信息,我能够完全按照我的需要进行操作。
具体来说,我在.psrc
文件中包含了这一行:
VisibleCmdlets = @{ Name = 'Start-Service'; Parameters = @{ Name = 'Name'; ValidateSet = 'XYZservice' }},
@{ Name = 'Restart-Service'; Parameters = @{ Name = 'Name'; ValidateSet = 'XYZservice' }},
@{ Name = 'Stop-Service'; Parameters = @{ Name = 'Name'; ValidateSet = 'XYZservice' }}
然后我的非特权用户可以这样做:
$sesh = new-pssession -ComputerName $Server -ConfigurationName $ConfigName
$cmdString = "restart-service $service"
$scriptBlock = [Scriptblock]::Create($cmdString)
invoke-command -session $sesh -ScriptBlock $scriptblock
remove-pssession $sesh
服务器上没有其他内容(相关的启动/停止命令除外)。
这种 JEA 能力应该得到更广泛的记录。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.