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

12
如何获取需要用户名和密码登录的远程计算机的服务状态?
我正在尝试使用以下代码来解决问题: $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>]

该选项不提供用户名和密码。

4个回答

14

这也可以工作:

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

请注意,密码不应该在安全字符串中。


1
你是唯一知道这个的人吗?为什么这不是任何试图管理运行Windows的远程机器的人的首选答案? - ArtOfWarfare
ArtOfWarfare:完全同意。我花了几个小时研究这个问题。其他在远程机器上获取服务的方法可行(不同的协议?)。我并不完全清楚这是如何/为什么起作用的。有人可以为我填补细节吗?谢谢。 - JohnB
哇,我花了大约两天的时间尝试在PowerShell中找到远程计算机身份验证的方法,问题是,这种身份验证方式有多安全? - metablaster

14
据我所知,Get-Service不接受凭据参数。但是,您可以通过WMI来完成此操作:
$cred = get-Credential -credential <your domain user here>
Get-WMIObject Win32_Service -computer $computer -credential $cred

评论后更新:

您可以将凭据保存为安全字符串到文件中,然后重新加载它以手动创建凭据而无需提示。请参见此处的信息。


我正在寻找更加安静的解决方案。我希望将脚本设置在任务计划程序中,每10分钟为每个服务器输入密码是不合适的。 :) 是否有一种方法可以在命令本身中设置“域\用户名”和“密码”。 - debal

0
就像Morton的答案一样,但是使用New-PSDrive来共享和删除共享以整理。
New-PSDrive -Name tempDriveName –PSProvider FileSystem –Root “\\server\c$-Credential $Cred
$service = Get-Service -Name $serviceName -ComputerName $MachineName 
Remove-PSDrive -Name tempDriveName

0

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参数提供逗号分隔的计算机列表来在多个服务器上运行。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接