【问题标题】:How to remote to the computer itself with powershell如何使用 powershell 远程连接到计算机本身
【发布时间】:2015-05-11 06:42:12
【问题描述】:

现在我需要在远程机器上运行脚本来做一些部署工作:

Invoke-Command -ComputerName $hostName -Credential $cred -ScriptBlock $scriptBlock

如果 $hostName 是调用此命令的计算机,它会报告:

message : Access is denied. For more information, see the about_Remote_Troubleshooting Help topic.
+ CategoryInfo          : OpenError: (myMachineName:String) [], PSRemotingTransportException
+ FullyQualifiedErrorId : AccessDenied,PSSessionStateBroken

无论是远程机器还是本地机器,我都想以统一的方式运行命令。

更新: 我正在使用 Azure 中的机器。此命令有效:

Invoke-Command -ComputerName XXX -Credential $cred -ScriptBlock $scriptBlock

但这个不是:

Invoke-Command -ComputerName XXX.cloudapp.net -Credential $cred -ScriptBlock $scriptBlock

有人可以帮忙吗?

【问题讨论】:

  • 编写一个将包装Invoke-Command 的辅助命令行开关,检查目标计算机,如果是本地计算机,也许不要传递-ComputerName 参数?
  • 也许我错过了一些东西,但我可以使用带有计算机名称的 invoke-command 作为调用此命令的计算机。我正在使用 3.0 版。
  • 谢谢 n0rd 和 CB。我在 Azure 中使用 vm,并且已经更新了问题。

标签: powershell azure remoting


【解决方案1】:

通过localhost 作为计算机名称:

Invoke-Command -ComputerName <b>localhost</b> -Credential $cred -ScriptBlock $scriptBlock

正如@CB 所述,使用计算机的主机名也应该有效。在问题的 cmets 中:

Invoke-Command -ComputerName $env:COMPUTERNAME -Credential $cred `
  -ScriptBlock $scriptBlock

如果您在其他地方需要 FQDN,并且只想删除 Invoke-Command 语句的域部分,您可以像这样删除它:

Invoke-Command -ComputerName ($hostname -replace '\..*') -Credential $cred `
  -ScriptBlock $scriptBlock

要根据给定的主机名是否是本地主机的名称来处理目标计算机名称,您可以执行以下操作:

$server = if (($hostname -replace '\..*') -eq $env:COMPUTERNAME) {
            'localhost'
          } else {
            $hostname
          }

Invoke-Command -ComputerName $server -Credential $cred -ScriptBlock $scriptBlock

请注意,无论哪种方式,都必须在本地计算机上启用 WinRM 才能正常工作。

【讨论】:

  • 谢谢,但是这样调用者需要先判断它是否是本地主机,就像这样: if(is local machine) {invoke-command -computername localhost} else {invoke-command -computername $hostName} 最好有统一的方式。
  • @TanJinfu 你可以只使用主机名而不是 FQDN 吗? $hostname的值是多少,从哪里来的?
  • $hostName 类似于 'XXX.cloudapp.net',但如果不使用 FQDN,则无法远程访问其他 Azure VM。
  • 感谢 Ansgar 的回答,但我必须远程连接几台机器,包括当前机器本身。所以如果传入不同的计算机名,我必须判断机器是否是当前机器(比如 X),就像这样: if(current machine is X){invoke-command -computerName localhost} else {invoke-command -computerName Y.cloudapp.net}。想知道为什么不能使用 FQDN 来远程自己。
  • 更新伪代码:if($hostName is X){invoke-command -computerName localhost} else {invoke-command -computerName $hostName}。
猜你喜欢
  • 2021-06-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-12
相关资源
最近更新 更多