Windows 啟用浮水印會繼續顯示
適用於: ✔️執行 Windows Server 2022 Datacenter Azure Edition 的 Windows VM
本文件討論如何解決Microsoft Azure 虛擬機上 Windows 啟用浮水印的持續存在。
必要條件
徵兆
當您使用執行 Windows Server 2022 Datacenter Azure Edition 的 Azure 虛擬機 (VM)時,您會遇到下列徵兆:
您會在桌面上看到浮浮浮水印,其中包含下列訊息:
啟動 Windows。 移至 [設定] 以啟動 Windows。
此浮浮水印表示 Windows 啟用狀態不是正版。
當您開啟 [設定] 應用程式並選取 [系統>啟用] 時,[應用程式狀態] 字段表示啟用失敗。
當您開啟提升許可權的命令提示字元視窗並執行下列 slmgr.vbs 大量啟用腳本時,輸出會顯示 金鑰管理服務 (KMS) 啟用成功,但前兩個徵兆仍然存在:
cscript c:\windows\system32\slmgr.vbs /dlv
當您重新啟動或登入 VM 時,會顯示具有下列訊息的彈出視窗:
您的 Windows Server 2022 Datacenter Azure Edition VM 已停用,因為您未在 Azure 或支援的 Azure Stack Hypervisor 上執行,或您尚未在支援的 Azure Stack 上啟用 Azure 權益。 若要啟用 Azure 權益,請移至 Windows Admin Center > 中的叢集設定[啟用 Azure 權益]。
原因 1:Azure 實例元數據服務連線問題
Azure VM 無法建立與 Azure 實例元數據服務 (IMDS) 端點的連線,這對於取得啟用令牌至關重要。
如何判斷 VM 客體 OS 是否可以成功與 IMDS 通訊
根據您的PowerShell版本執行下列PowerShell腳本,以檢查是否從IMDS接收元數據。
PowerShell 6 和更新版本
Invoke-RestMethod -Headers @{"Metadata"="true"} -Method GET -NoProxy -Uri http://169.254.169.254/metadata/attested/document?api-version=2020-09-01 | Format-List * | Out-File "IMDSResponse1.txt"
PowerShell 5 和舊版
$Proxy=New-object System.Net.WebProxy $WebSession=new-object Microsoft.PowerShell.Commands.WebRequestSession $WebSession.Proxy=$Proxy Invoke-RestMethod -Headers @{"Metadata"="true"} -Method GET -Uri "http://169.254.169.254/metadata/instance?api-version=2021-02-01" -WebSession $WebSession
如果您收到成功的回應,您會看到來自 VM 的元數據資訊,例如下列輸出:
compute
-------
@{azEnvironment=AzurePublicCloud; customData=; evictionPolicy=; isHostCompatibilityLayerVm=true; licenseType=; location=eastus; name=testWs2022; offer=WindowsServer; ...
如果沒有,這表示IMDS有線伺服器的連線在某處遭到封鎖,而且必須允許存取它。 IMDS 伺服器的 IP 為 169.254.169.254
。 若要修正連線問題,請移至 解決方案 1:略過 VM 內的 Web Proxy。
原因 2:憑證相關問題
對於啟用程式而言至關重要的中繼憑證已過期。
如需詳細資訊,請參閱 Azure 實例元數據服務證明數據 TLS:重大變更在這裡。
如何判斷是否有任何憑證遺失
執行下列 PowerShell 腳本來檢查是否有遺漏的憑證:
# Get the signature
# Powershell 5.1 does not include -NoProxy
$attestedDoc = Invoke-RestMethod -Headers @{"Metadata"="true"} -Method GET -Uri http://169.254.169.254/metadata/attested/document?api-version=2018-10-01
#$attestedDoc = Invoke-RestMethod -Headers @{"Metadata"="true"} -Method GET -NoProxy -Uri http://169.254.169.254/metadata/attested/document?api-version=2018-10-01
# Decode the signature
$signature = [System.Convert]::FromBase64String($attestedDoc.signature)
# Get certificate chain
$cert = [System.Security.Cryptography.X509Certificates.X509Certificate2]($signature)
$chain = New-Object -TypeName System.Security.Cryptography.X509Certificates.X509Chain
if (-not $chain.Build($cert)) {
# Print the Subject of the issuer
Write-Host $cert.Subject
Write-Host $cert.Thumbprint
Write-Host "------------------------"
Write-Host $cert.Issuer
Write-Host "------------------------"
Write-Host "Certificate not found: '$($cert.Issuer)'" -ForegroundColor Red
Write-Host "Please refer to the following link to download missing certificates:" -ForegroundColor Yellow
Write-Host "https://learn.microsoft.com/en-us/azure/security/fundamentals/azure-ca-details?tabs=certificate-authority-chains" -ForegroundColor Yellow
} else {
# Print the Subject of each certificate in the chain
foreach($element in $chain.ChainElements) {
Write-Host $element.Certificate.Subject
Write-Host $element.Certificate.Thumbprint
Write-Host "------------------------"
}
# Get the content of the signed document
Add-Type -AssemblyName System.Security
$signedCms = New-Object -TypeName System.Security.Cryptography.Pkcs.SignedCms
$signedCms.Decode($signature);
$content = [System.Text.Encoding]::UTF8.GetString($signedCms.ContentInfo.Content)
Write-Host "Attested data: " $content
$json = $content | ConvertFrom-Json
}
如果遺漏任何憑證,您會看到類似下列的輸出:
CN=metadata.azure.com, O=Microsoft Corporation, L=Redmond, S=WA, C=US
3ACCC393D3220E40F09A69AC3251F6F391172C32
------------------------
CN=Microsoft Azure RSA TLS Issuing CA 04, O=Microsoft Corporation, C=US
------------------------
Certificate not found: 'CN=Microsoft Azure RSA TLS Issuing CA 04, O=Microsoft Corporation, C=US'
Please refer to the following link to download missing certificates:
https://learn.microsoft.com/en-us/azure/security/fundamentals/azure-ca-details?tabs=certificate-authority-chains
若要修正憑證問題,請移至 解決方案 2:確定防火牆和 Proxy 已設定為允許憑證下載。
解決方案 1:略過 VM 內的 Web Proxy
IMDS 是 REST API,可在已知且無法路由傳送的 IP 位址 (169.254.169.254
) 取得。 只有下列 URI 才能從 VM 記憶體取 IMDS 端點: http://169.254.169.254/metadata/instance
。 VM 與 IMDS 之間的通訊永遠不會離開主機。 讓您的 HTTP 用戶端在查詢 IMDS 時略過 VM 內的 Web Proxy。 此外,請確定用戶端會以與處理 168.63.129.16 IP 位址相同的方式處理 169.254.169.254
IP 位址。 若要確認此直接網路連線存在,請遵循下列步驟:
注意
168.63.129.16
是Microsoft擁有的虛擬公用IP位址,用於與 Azure 資源通訊。
若要檢視 VM 上的本機路由表,請 執行路由列印 命令:
route print
若要找出 IMDS 目標的路由專案,請移至
Active Routes
輸出的IPv4 Route Table
區段,然後尋找數據169.254.169.254
行中包含Network Destination
IP 位址的數據列。網路目的地 網路遮罩 閘道 介面 計量 0.0.0.0 0.0.0.0 172.16.69.1 172.16.69.7 10 127.0.0.0 255.0.0.0 On-link 127.0.0.1 3:31 127.0.0.1 255.255.255.255 On-link 127.0.0.1 3:31 127.255.255.255 255.255.255.255 On-link 127.0.0.1 3:31 168.63.129.16 255.255.255.255 172.16.69.1 172.16.69.7 11 169.254.169.254 255.255.255.255 172.16.69.1 172.16.69.7 11 ... ... ... ... ... 在範例路由表輸出中,IMDS 目標項目位於最後一個數據列中,而對應的網路介面是
Interface
該數據列內數據行的值。 (在此範例中,網路介面為172.16.69.7
。)若要檢視 VM 的 IP 組態,請 執行 ipconfig 命令:
ipconfig /all
在 ipconfig 命令輸出中,尋找欄位符合 IMDS 專案網路介面值的 IP
IPv4 Address
組態(172.16.69.7
):... Ethernet adapter Ethernet: Connection-specific DNS Suffix . : xic3mnxjiefupcwr1mcs1rjiqa.cx.internal.cloudapp.net Description . . . . . . . . . . . : Microsoft Hyper-V Network Adapter Physical Address. . . . . . . . . : 00-0D-3A-E5-1C-C0 DHCP Enabled. . . . . . . . . . . : Yes Autoconfiguration Enabled . . . . : Yes Link-local IPv6 Address . . . . . : fe80::3166:ce5a:2bd5:a6d1%3(Preferred) IPv4 Address. . . . . . . . . . . : 172.16.69.7(Preferred) Subnet Mask . . . . . . . . . . . : 255.255.255.0 ...
在範例 ipconfig 輸出中,包含 IMDS 專案網路介面值的 IP 組態為
Ethernet adapter Ethernet
。在您找到的IP組態中,複製媒體 存取控制 (MAC) 位址和 VM 使用的主要私人IP位址。 MAC 位址會顯示在
Physical Address
欄位中,而主要私人 IP 位址會顯示在IPv4 Address
欄位中。 在這裡範例中,MAC 位址和主要私人 IP 位址00-0D-3A-E5-1C-C0
分別是 和172.16.69.7
。檢查 Azure 用於 VM 的 MAC 和主要私人 IP 位址是否符合 VM 客體 OS 實際使用的 MAC 位址和主要私人 IP 位址(您在先前步驟中找到的位址)。 若要判斷 Azure 使用什麼做為 MAC 位址,您可以使用 Azure CLI。 若要判斷 Azure 使用什麼作為主要私人 IP 位址,您可以檢查 Azure 入口網站 中的網路組態。
尋找 MAC 位址(在 PowerShell 腳稿中使用 Azure CLI)
執行下列會叫用 Azure CLI 命令的 PowerShell 腳本。 此腳本會 叫用 az vm nic list 命令來收集 VM 上網路介面的名稱。 然後,它會叫 用 az vm nic show 命令來顯示每個網路介面的名稱,不論該網路介面是主要網路介面 (
True
或False
), 以及網路介面的 MAC 位址:注意
在命令中,“nic” 代表網路介面,而不是網路介面卡。
# Placeholder variable definitions $ResourceGroup = "<resource-group-name>" $VmName = "<virtual-machine-name>" # Code $NicNames = az vm nic list --resource-group $ResourceGroup --vm-name $VmName | ConvertFrom-Json | Foreach-Object { $_.id.Split('/')[-1] } foreach($NicName in $NicNames) { az vm nic show --resource-group $ResourceGroup --vm-name $VmName --nic $NicName | ConvertFrom-Json | Format-Table -Property name, primary, macAddress }
name primary macAddress ---- ------- ---------- wintest767 True 00-0D-3A-E5-1C-C0
尋找主要私人IP位址(使用 Azure 入口網站):
在 Azure 入口網站中,搜尋並選取 [虛擬機器]。
在 VM 清單中,選取 VM 的名稱。
在 VM [概觀] 頁面的 [屬性] 索引標籤上,找出 [網络] 標題。
在 [ 私人 IP 位址] 字段中,複製顯示的 IPv4 位址。
如果 Azure 與 VM 客體 OS 之間的 MAC 位址或主要私人 IP 位址不相同,請使用各種 路由 命令來更新路由表,讓主要網路介面和 IP 位址設為目標。
解決方案2:確定防火牆和 Proxy 已設定為允許憑證下載
檢查是否已 安裝 KB 5036909 。 如果沒有,請加以安裝。 您可以從Microsoft更新目錄取得它。
如果您已安裝更新,但仍遇到問題,請確認系統的防火牆和 Proxy 已設定為允許下載憑證。 如需詳細資訊,請參閱 憑證下載和撤銷清單。
或者,您也可以直接從 根和次級證書頒發機構單位鏈結下載並安裝所有憑證。
注意
請務必在安裝精靈中選取存放區位置作為 本機計算機 。
以系統管理員身分開啟命令提示字元、流覽至 c:\windows\system32,然後執行 fclip.exe。
重新啟動 VM 或註銷,然後再次登入。 您會看到首頁上的浮浮顯示,且 [設定>啟用] 畫面中的 [應用程式狀態] 字段會回報成功。
其他相關資訊
與我們連絡,以取得說明
如果您有問題或需要相關協助,請建立支援要求,或詢問 Azure community 支援。 您也可以向 Azure 意見反應社群提交產品意見反應。