使用 powershell 从远程服务器获取服务状态

Posted

技术标签:

【中文标题】使用 powershell 从远程服务器获取服务状态【英文标题】:Get service status from remote server using powershell 【发布时间】:2014-06-18 17:54:54 【问题描述】:

如何获取需要用户名和密码才能登录的远程计算机的服务状态?

我正在尝试使用以下代码找到解决方案:

$serviceStatus = get-service -ComputerName $machineName -Name $service

get-service 命令的默认语法是:

Parameter Set: Default
Get-Service [[-Name] <String[]> ] [-ComputerName <String[]> ] [-DependentServices] [-Exclude <String[]> ] [-Include <String[]> ] [-RequiredServices] [ <CommonParameters>]

Parameter Set: DisplayName
Get-Service -DisplayName <String[]> [-ComputerName <String[]> ] [-DependentServices] [-Exclude <String[]> ] [-Include <String[]> ] [-RequiredServices] [ <CommonParameters>]

Parameter Set: InputObject
Get-Service [-ComputerName <String[]> ] [-DependentServices] [-Exclude <String[]> ] [-Include <String[]> ] [-InputObject <ServiceController[]> ] [-RequiredServices] [ <CommonParameters>]

这没有用户名和密码的选项。

【问题讨论】:

【参考方案1】:

据我所知,Get-Service doesn't accept a credential parameter。不过,你可以通过WMI:

$cred = get-Credential -credential <your domain user here>
Get-WMIObject Win32_Service -computer $computer -credential $cred

评论后更新:

您可以将凭据作为安全字符串保存到文件中,然后重新加载它以手动创建凭据而无需提示。查看信息here。

【讨论】:

我正在寻找更安静的东西。我希望在 TaskScheduler 中设置脚本,并且每 10 分钟提示每个服务器的密码是不合适的。 :) 有什么方法可以让我在命令本身中设置Domein\Usernamepassword【参考方案2】:

这也有效:

net use \\server\c$ $password /USER:$username
$service = Get-Service $serviceName -ComputerName $server

请注意,密码不应使用安全字符串。

【讨论】:

你是唯一知道这一点的人吗?对于任何询问尝试管理运行 Windows 的远程计算机的人来说,为什么这不是最佳答案? ArtOfWarfare:: 完全同意。花了几个小时研究这个。在远程机器上获取服务的其他方法有效(不同的协议?)。我并不完全清楚它是如何/为什么起作用的。有人可以为我填写详细信息吗?谢谢 哇,我花了大约 2 天的时间试图找到一种在 PowerShell 中对远程计算机进行身份验证的方法,请问,这样的身份验证有多安全?【参考方案3】:

Invoke-Command 可以做到这一点。

$Cred = Get-Credential -Credential "<your domain user here>"
$ScriptBlock = 
    param($Service)
    Get-Service -Name "$Service"

$ServiceStatus = Invoke-Command -ComputerName $MachineName -Credential $Cred -ScriptBlock $ScriptBlock -ArgumentList "$Service"

请注意,为了将变量$Service 传递给脚本块中的Get-Service cmdlet,您必须事先声明脚本块并在param 块中定义$Service 变量。然后,您可以通过-ArgumentList 参数将$Service 参数传递到脚本块中。

Invoke-Command 还支持在多个服务器上运行,方法是为-ComputerName 参数提供以逗号分隔的计算机列表。

【讨论】:

【参考方案4】:

就像莫顿的回答一样,但使用 New-PSDrive 进行共享并删除共享进行整理。

New-PSDrive -Name tempDriveName –PSProvider FileSystem –Root “\\server\c$” -Credential $Cred
$service = Get-Service -Name $serviceName -ComputerName $MachineName 
Remove-PSDrive -Name tempDriveName

【讨论】:

以上是关于使用 powershell 从远程服务器获取服务状态的主要内容,如果未能解决你的问题,请参考以下文章

使用 Powershell 从远程调用 msiexec 中获取结果

如何使用Powershell远程管理Linux服务器

PowerShell 和 TFS |使用本地路径与使用服务器路径的 PowerShell ISE 从 TFS 获取更改集列表

在远程服务器上使用 PowerShell 安装证书

通过 Powershell 在远程机器上更改 IIS 网站的物理路径

如何使用powershell远程连接服务器