可是如果我們希望通過Powershell腳本批量管理在國内Azure公有雲上的虛拟機該如何操作呢這裡把我用于示範的腳本和大家分享一下。
來到Azure虛拟機中檢視配置的Powershell已經啟用了基于https的通路并且配置了通路證書的指紋就是"雲服務"配置的證書指紋是以想通過Powershell遠端通路雲中的Windows 伺服器虛拟機則需要再通路用戶端安裝相應的證書檔案到本地受信任證書清單 CurrentUser\My下面腳本中就是将該證書安裝到遠端管理客戶機的該位置。
(*注意* 這裡的腳本沒有做"雲服務"下的虛拟機作業系統判斷因為示範環境中所有虛拟機均為Windows Server 2012 R2的虛拟機。)
示範腳本遠端執行腳本Invoke-command 的scriptblock中主要用于在Azure虛拟機中添加配置使用者體驗服務可以根據需要進行修改,另外如果需要互動式的環境也可以通過Enter-PSSession URI連接配接虛拟機的URI管理。
實際示範中需要指定參數訂閱名稱雲服務名稱 Remote-configAzVM.ps -Subscriptionname "訂閱名"-Servicename "雲服務名"
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
<code>Param</code>
<code>(</code>
<code> </code><code>[</code><code>Parameter</code><code>(</code><code>Mandatory</code><code>=</code><code>$false</code><code>,</code><code>Position</code><code>=0)]</code>
<code> </code><code>[String]</code><code>$SubscriptionName</code><code>,</code>
<code> </code><code>[</code><code>Parameter</code><code>(</code><code>Mandatory</code><code>=</code><code>$false</code><code>)]</code>
<code> </code><code>[String]</code><code>$Servicename</code><code>,</code>
<code> </code><code>[</code><code>Parameter</code><code>(</code><code>Mandatory</code><code>=</code><code>$false</code><code>)]</code>
<code> </code><code>[String]</code><code>$Path</code> <code>= (</code><code>Get-Location</code><code>)</code>
<code>)</code>
<code> </code>
<code># Elevate to admin</code>
<code>Write-Host</code> <code>"Checking for elevation... "</code> <code>-NoNewline</code>
<code>$CurrentUser</code> <code>= </code><code>New-Object</code> <code>Security.Principal.WindowsPrincipal $(</code><code>[Security.Principal.WindowsIdentity]</code><code>::GetCurrent())</code>
<code>if</code> <code>((</code><code>$CurrentUser</code><code>.IsInRole(</code><code>[Security.Principal.WindowsBuiltinRole]</code><code>::Administrator)) </code><code>-eq</code><code>$false</code><code>) {</code>
<code> </code><code>$ArgumentList</code><code>= </code><code>"-noprofile-noexit -file `"{0}`" -Path `"$Path`""</code>
<code> </code><code>If($DeploymentOnly) {$ArgumentList = $ArgumentList +"</code> <code>-DeploymentOnly</code><code>"}</code>
<code> </code><code>Write-Host"</code><code>elevating</code><code>"</code>
<code> </code><code>Start-Processpowershell.exe -VerbRunAs -ArgumentList($ArgumentList -f($myinvocation.MyCommand.Definition))</code>
<code> </code><code>Exit</code>
<code>}</code>
<code>Select-AzureSubscription -SubscriptionName $SubscriptionName -Current</code>
<code>$Validate = $true</code>
<code># Check Current PS Version</code>
<code>If ($PSVersionTable.PSVersion.Major -lt 4) {Write-Error "</code><code>Only Supports PowerShell Version 4 or Higher!</code><code>";$Validate =$false} </code>
<code>if ($Validate)</code>
<code>{</code>
<code>function Install-WinRmCertificate($ServiceName, $VMName)</code>
<code> </code><code>$vm= Get-AzureVM-ServiceName $ServiceName-Name $VMName</code>
<code> </code><code>$winRmCertificateThumbprint= $vm.VM.DefaultWinRMCertificateThumbprint</code>
<code> </code>
<code> </code><code>$winRmCertificate= Get-AzureCertificate-ServiceName $ServiceName`</code>
<code> </code><code>-Thumbprint$winRmCertificateThumbprint -ThumbprintAlgorithm sha1</code>
<code> </code><code>$installedCert= Get-Item Cert:\CurrentUser\My\$winRmCertificateThumbprint-ErrorAction SilentlyContinue</code>
<code> </code><code>if($installedCert -eq$null)</code>
<code> </code><code>{</code>
<code> </code><code>$certBytes= [System.Convert]::FromBase64String($winRmCertificate.Data)</code>
<code> </code><code>$x509Cert= New-ObjectSystem.Security.Cryptography.X509Certificates.X509Certificate</code>
<code> </code><code>$x509Cert.Import($certBytes)</code>
<code> </code>
<code> </code><code>$store= New-ObjectSystem.Security.Cryptography.X509Certificates.X509Store"</code><code>Root</code><code>","</code><code>LocalMachine</code><code>"</code>
<code> </code><code>$store.Open("</code><code>ReadWrite")</code>
<code> </code><code>$store</code><code>.Add(</code><code>$x509Cert</code><code>)</code>
<code> </code><code>$store</code><code>.Close()</code>
<code> </code><code>}</code>
<code>$VMnames</code> <code>= (</code><code>Get-AzureVM</code> <code>-ServiceName </code><code>$ServiceName</code><code>).HostName</code>
<code>foreach</code> <code>(</code><code>$VMname</code> <code>in</code> <code>$VMnames</code><code>)</code>
<code> </code><code>Install-WinRmCertificate-ServiceName </code><code>$ServiceName</code><code>-VMName </code><code>$VMname</code>
<code> </code><code>$VMwinRmUri</code><code>= </code><code>Get-AzureWinRMUri</code><code>-ServiceName </code><code>$ServiceName</code><code>-Name </code><code>$VMname</code>
<code> </code><code>$credential</code><code>= </code><code>Get-Credential</code>
<code> </code><code>Start-Job</code><code>-ScriptBlock{</code>
<code> </code><code>Invoke-Command</code> <code>-URI </code><code>$VMwinRmUri</code> <code>-Credential </code><code>$credential</code> <code>-ScriptBlock {</code>
<code> </code><code>Install-WindowsFeature -nameDesktop-Experience `</code>
<code> </code><code>-IncludeAllSubFeature -</code><code>Restart-Force</code><code>}} </code>
本文轉自 翟老貓 51CTO部落格,原文連結:http://blog.51cto.com/3387405/1586497,如需轉載請自行聯系原作者