继续显示 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 虚拟机监控程序上运行,或者尚未在受支持的 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 代理。
原因 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:确保防火墙和代理配置为允许证书下载。
解决方案 1:绕过 VM 中的 Web 代理
IMDS 是一个 REST API,可在已知不可路由的 IP 地址 (169.254.169.254
) 中获取。 IMDS 终结点只能通过以下 URI 从 VM 内部访问: http://169.254.169.254/metadata/instance
VM 与 IMDS 之间的通信绝不会离开主机。 让 HTTP 客户端在查询 IMDS 时绕过 VM 中的 Web 代理。 此外,请确保客户端处理 169.254.169.254
IP 地址的方式与处理 168.63.129.16 IP 地址的方式相同。 若要验证此直接网络连接是否存在,请执行以下步骤:
注意
168.63.129.16
是Microsoft拥有的虚拟公共 IP 地址,用于与 Azure 资源通信。
若要查看 VM 上的本地路由表,请 运行路由打印 命令:
route print
若要查找 IMDS 目标的路由条目,请转到
Active Routes
输出部分IPv4 Route Table
,然后查找列中包含169.254.169.254
IP 地址的Network Destination
行。网络目标 网络掩码 网关 Interface 指标 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 331 127.0.0.1 255.255.255.255 On-link 127.0.0.1 331 127.255.255.255 255.255.255.255 On-link 127.0.0.1 331 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 的 MAC 地址和 VM 来宾 OS 实际使用的主要专用 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:确保防火墙和代理配置为允许证书下载
检查是否已 安装 KB 5036909 。 如果没有,请安装它。 可以从Microsoft更新目录获取它。
如果已安装更新但仍遇到此问题,请验证系统的防火墙和代理是否已配置为允许下载证书。 有关详细信息,请参阅 证书下载和吊销列表。
或者,可以直接从 根和从属证书颁发机构链下载并安装所有证书。
注意
请确保在安装向导中选择存储位置作为 本地计算机 。
以管理员身份打开命令提示符,导航到 c:\windows\system32,并运行 fclip.exe。
重启 VM 或注销,然后再次登录。 你将看到主页上的水印不再显示,“设置激活”>屏幕中的“应用程序状态”字段将报告成功。
详细信息
联系我们寻求帮助
如果你有任何疑问或需要帮助,请创建支持请求或联系 Azure 社区支持。 你还可以将产品反馈提交到 Azure 反馈社区。