[Azure]避開 Windows Server 2016 Azure VM 無法安裝中文語言套件的問題

目前最新版本的 Windows Server 2016 Azure VM 無法安裝中文語言套件,透過 PowerShell 來測試和避開

先說結論好了「 目前最新版本 Windows Server 2016 Azure VM (2021/05) 無法安裝中文語言套件,因此我們需要透過 PowerShell 或 CLI 選擇舊版本的 Image,才可以使用中文語言套件」

話說這件事情的開始,本來是朋友詢問有關於如何比較經濟的來建立備援的環境,因此在了解他們的需求之後,建議他們可以使用 Azure VM 來使用,因此請他們可以先參考之前所寫的一篇文章「透過 PowerShell 快速大量的建立 VM」。本來想說應該萬無一失,但沒有想到朋友反映說 Windows Server 2016 沒有辦法安裝中文套件,因為他們的系統需要在繁體中文的環境下來執行,導致無法來使用 ?! 當下聽到的時候,會想說是不是朋友不會安裝,還是臨時無法下載到語言包導致問題,因此就想說協助一下,用 lpksetup 來安裝,這下應該沒有問題吧,但事情總不能如人願:(

一開始當我執行 lpksetup 來安裝,看起來都還蠻順利的

在等了 10 多分鐘之後,沒有想到居然會出現「失敗」!!! 

另外從系統的事件檢視器也可以看到如下的錯誤訊息,並沒有太多幫助知道哪裡出問題。而從上面的 Keyword 去找相關的資料,所找到的相關文章也都沒有任何幫助


因為之前已經安裝上百個以上的 VM ,都沒有類似的情況,因此想說寫一個 Script 來建立測試環境,看看是不是因為新版本的 Image 所導致的問題,因此我先用以下的語法透過 Cloud Shell 的介面來查詢看看,可以使用的 Windows Server 2016 的影像檔有哪些

Get-AzVMImage -Location "EastAsia" -PublisherName "MicrosoftWindowsServer" -Offer "windowsserver" -Skus "2016-Datacenter" | Format-Table -Property Offer,Skus,Version

從下圖中可以看出來有不少,特別是今年似乎每個月就有一個新的影像檔案出來,因此我決定拿最後面四個來測試

因此我改了一下之前建立的 PowerShell 語法,改成以下的方式,這樣子我就可以建立好四個不同版本的 VM

$resourceGroup = "LPTest" 	# 資源群組
$location = "EastAsia"      # 區域
$name = "LPLab"             # VM 名稱
$vmadmin = "vmadmin"        # Admin 帳號
$pwd='Pa$$w5rd3939889'| ConvertTo-SecureString -Force -AsPlainText # Admin 密碼

$Version = "14393.4225.2102030345","14393.4283.2103051830","14393.4350.2104091630","14393.4402.2105052108"

$cred=New-Object PSCredential($vmadmin,$pwd)

# 建立資源群組
New-AzResourceGroup -ResourceGroupName $resourceGroup -Location $location

# 建立可允許連線規格
$rdpRule = New-AzNetworkSecurityRuleConfig -Name rdp-rule -Description "Allow RDP" `
   -Access Allow -Protocol Tcp -Direction Inbound -Priority 100 `
   -SourceAddressPrefix Internet -SourcePortRange * `
   -DestinationAddressPrefix * -DestinationPortRange 3389

# 建立網路安全群組
$nsg = New-AzNetworkSecurityGroup -ResourceGroupName $resourceGroup  `
  -Location $location -Name $resourceGroup"-nsg" -SecurityRules $rdpRule

# 建立子網路
$subnet = New-AzVirtualNetworkSubnetConfig -Name $resourceGroup"-vmSubnet" `
    -AddressPrefix "10.0.1.0/25" -NetworkSecurityGroup $nsg -WarningAction SilentlyContinue

# 建立虛擬網路網路
$vnet = New-AzVirtualNetwork -Name $resourceGroup"-vnet" -ResourceGroupName $resourceGroup `
    -Location $location -AddressPrefix "10.0.1.0/24" -Subnet $subnet `
    -WarningAction SilentlyContinue


for($i = 1; $i -le $Version.count ; $i++)  
{
  
  $vmname = $name + ([string]$i).PadLeft(2,'0')

  # 產生公用 IP , 網域名稱要用小寫
  $pip = New-AzPublicIpAddress -ResourceGroupName $resourceGroup -Location $location `
    -Name $vmname"-ip" -AllocationMethod Static -DomainNameLabel $vmname.toLower()

  # 產生虛擬網卡
  $nic = New-AzNetworkInterface -ResourceGroupName $resourceGroup -Location $location `
    -Name $vmname"-nic" -SubnetId $vnet.Subnets[0].Id -PublicIpAddressId $pip.Id

  # 建立虛擬機器的相關設定
  $vmConfig = New-AzVMConfig -VMName $vmname"-vm" -VMSize Standard_DS2_V2 
  $vmConfig | Set-AzVMOperatingSystem -Windows -ComputerName $vmname -Credential $cred -TimeZone "Taipei Standard Time" 
  $vmConfig | Set-AzVMSourceImage -PublisherName MicrosoftWindowsServer -Offer WindowsServer -Skus 2016-Datacenter -Version $Version[$i-1]
  $vmConfig | Add-AzVMNetworkInterface -Id $nic.Id 
  $vmConfig | Set-AzVMBootDiagnostic -Disable 
  $vmConfig | Set-AzVMOSDisk -Name $vmname"-osdisk" -Caching ReadWrite -StorageAccountType "Standard_LRS" -CreateOption FromImage 

  # 建立虛擬機器並放置到背景執行
  New-AzVM -ResourceGroupName $resourceGroup -Location $location -VM $vmConfig -AsJob
}
Get-Job

以上我整理一下建立好的 VM,並且透過 Winver 取得相關資訊,並且測試安裝中文語言包的狀況

名稱LPLab01LPLab02LPLab03LPLab04
影像檔版本14393.4225.210203034514393.4283.210305183014393.4350.210409163014393.4402.2105052108
WinverVersion 1607Version 1607Version 1607Version 1607
OS Build14393.422514393.428314393.435014393.4402
中文語言包成功成功失敗失敗

從上表中可以看出來,在 2021/04 之後所使用的影像檔,安裝中文語言包是失敗的,因此如果您有需要使用中文的話,建議可以改用 Windows 10 或者是 Windows Server 2019 的影像檔,但如果要用 Windows Server 2016 的話,建議可以改用 14393.4283.2103051830 這一個版本的,只是您可能無法透過 Azure Portal 的介面去找到那個影像檔來安裝,就需要自己手動修改我前面的範例,用 PowerShell 來建立 VM ,這樣就可以順利安裝了。


2021/05/31 看來這個問題遇到的還不少人,剛好在測試其他的問題的時候 , 有看到網路上一個朋友 icka's Home 也遇到這個問題 ( 網址 ) , 透過他的方式進入到 Guest VM 裡面 , 利用 system internals 的工具程式 movefile , 將 C:\Windows\System32\config\TxR 的目錄下的檔案都清除 , 就可以順利安裝上 Language Pack 了,如果有朋友遇到類似問題 , 可以參考他的文章 , 就可以順利解決了。