2015-05-11 59 views
0

現在我需要使用運行在遠程機器上做了一些部署工作的腳本:如何遠程計算機本身使用PowerShell

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 

任何人可以幫助?

+2

編寫一個可以包裝'Invoke-Command'的輔助命令行,檢查目標計算機,如果它是本地計算機,請不要傳遞'-ComputerName'參數? – n0rd

+1

也許我錯過了一些東西,但我可以使用invoke-command和計算機名稱作爲調用此命令的計算機。我在3.0版本。 –

+0

謝謝你nrd和CB。我在Azure中使用虛擬機,並已更新問題。 –

回答

1

localhost計算機名稱:

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

使用電腦時也應該工作,由@CB提到的主機名。在評論的問題:

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的任必須在本地計算機上啓用此功能才能工作。

+0

謝謝,但這樣調用者需要先告訴它是否是localhost,就像這樣:if(is local machine){invoke-command -computername localhost} else {invoke-command -computername $ hostName}最好是有統一的方式。 –

+0

@TanJinfu你可以使用主機名而不是FQDN嗎? '$ hostname'的價值是什麼,它來自哪裏? –

+0

$ hostName與'XXX.cloudapp.net'類似,但如果不使用FQDN,則無法遠程訪問其他Azure虛擬機。 –

相關問題