继续显示 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 代理。

激活过程至关重要的中间证书已过期。

有关详细信息,请参阅 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 资源通信。

  1. 若要查看 VM 上的本地路由表,请 运行路由打印 命令:

    route print
    
  2. 若要查找 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.)

  3. 若要查看 VM 的 IP 配置,请运行 ipconfig 命令:

    ipconfig /all
    
  4. 在 ipconfig 命令输出中,找到字段与 IMDS 条目的网络接口值匹配的 IP 配置 IPv4 Address172.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

  5. 在找到的 IP 配置中,复制媒体访问控制(MAC)地址和 VM 使用的主要专用 IP 地址。 MAC 地址显示在 Physical Address 字段中,主专用 IP 地址显示在 IPv4 Address 字段中。 在此示例中,MAC 地址和主要专用 IP 地址 00-0D-3A-E5-1C-C0 分别为和 172.16.69.7

  6. 检查 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 门户):

      1. Azure 门户中,搜索并选择“虚拟机”。

      2. 在 VM 列表中,选择 VM 的名称。

      3. 在“VM 概述”页的“属性”选项卡上,找到“网络”标题。

      4. “专用 IP 地址 ”字段中,复制显示的 IPv4 地址。

  7. 如果 Azure 与 VM 来宾 OS 之间的 MAC 地址或主要专用 IP 地址不相同,请使用各种 路由 命令更新路由表,以便将主网络接口和 IP 地址作为目标。

解决方案 2:确保防火墙和代理配置为允许证书下载

  1. 检查是否已 安装 KB 5036909 。 如果没有,请安装它。 可以从Microsoft更新目录获取它

  2. 如果已安装更新但仍遇到此问题,请验证系统的防火墙和代理是否已配置为允许下载证书。 有关详细信息,请参阅 证书下载和吊销列表

    或者,可以直接从 根和从属证书颁发机构链下载并安装所有证书。

    注意

    请确保在安装向导中选择存储位置作为 本地计算机

  3. 以管理员身份打开命令提示符,导航到 c:\windows\system32,并运行 fclip.exe

  4. 重启 VM 或注销,然后再次登录。 你将看到主页上的水印不再显示,“设置激活”>屏幕中的“应用程序状态”字段将报告成功。

详细信息

联系我们寻求帮助

如果你有任何疑问或需要帮助,请创建支持请求联系 Azure 社区支持。 你还可以将产品反馈提交到 Azure 反馈社区