2014-07-25 209 views
0

我想從PowerShell腳本配置WinRM。我正在使用下面的代碼從PowerShell執行命令

$WinrmCreate= "winrm create winrm/config/Listener?Address=*+Transport=HTTPS @{Hostname=""$sHostName"";CertificateThumbprint=""$CertificateThumbPrint""}" 
Invoke-Expression $WinrmCreate 

主機名和證書thumprint是上面的變量,他們被驗證出來。詳細輸出顯示

VERBOSE: winrm create winrm/config/Listener?Address=*+Transport=HTTPS @{Hostname="RSNODE1";CertificateThumbprint="6C79C8E6E88779037593E6234DCE6E1A55662F87"} 

然而,「調用表達式」的提供以下錯誤

Invalid use of command line. Type "winrm -? 

有趣的是,如果我複製/粘貼我行的命令的輸出提示它會創建執行聽衆沒有錯誤。 WInrm

研究命令的執行我發現什麼都不能解釋這種行爲。 我唯一的理論是,「winrm」命令本身就是一個腳本,有些是行爲不端。

+0

你的理論是正確的。這是一個cmd腳本,啓動了一個〜3900行的VB腳本:'@cscript // nologo'%〜dpn0.vbs'%*' –

回答

4

散列表例如@{Hostname=...}由PowerShell解釋。如果您在V3或更高嘗試--%簡單的參數解析操作:

$env:Hostname = $sHostName 
$env:CertThumbPrint = $CertificateThumbPrint 
$WinrmCreate= "winrm create --% winrm/config/Listener?Address=*+Transport=HTTPS @{Hostname=`"%HostName%`";CertificateThumbprint=`"%CertThumbPrint%`"}" 
+0

你給了我一個「啊哈!那一刻,我走上了同樣的軌道。最終使用: '$ WinrmCreate =「winrm create winrm/config/Listener?Address = * + Transport = HTTPS @ {Hostname =」「$ sHostName」「; CertificateThumbprint =」「$ CertificateThumbPrint」「}」' '$ WinrmArgs =「create winrm/config/Listener?Address = * + Transport = HTTPS @ {Hostname =」「$ sHostName」「; CertificateThumbprint =」「$ CertificateThumbPrint」「}」 'Start-Process「 「-ArgumentList $ WinrmArgs' – Gomker

0

這是我爲我所做的,證書有FQDN:

$fqdn ="CertificateSubjectName" 

$certificate="CN="+$fqdn 

$CertificateThumbPrint=(Get-ChildItem cert:\LocalMachine\My | Where-Object { $_.Subject -eq $certificate }).thumbprint 

$WinrmCreate= 'winrm create winrm/config/Listener?Address=*+Transport=HTTPS `@`{Hostname=`"`'+$fqdn+'`"`;CertificateThumbprint=`"`'+$CertificateThumbPrint+'`"`}' 

invoke-expression $WinrmCreate