错误 0xC004F074“无法联系任何密钥管理服务 (KMS)”

适用于:✔️ Windows VM

本文介绍如何解决在 Azure Microsoft中尝试激活 Windows 虚拟机(VM)时发生的0xC004F074错误。

先决条件

现象

尝试激活 Azure Windows VM 时,在 Windows 脚本主机中遇到以下错误消息:

错误:0xC004F074 软件许可服务报告计算机无法激活。 无法联系任何密钥管理服务(KMS)。 有关其他信息,请参阅应用程序事件日志。

原因

VM 无法连接到 KMS 服务进行激活。 如果 Azure KMS 用于激活(默认选择),激活请求必须源自 Azure 公共 IP 地址。 此连接失败的可能原因包括:

  • 强制隧道,其中所有流量都通过 Azure ExpressRoute 或网络虚拟设备在 Azure 外部路由(通常路由到本地环境)

  • 网络虚拟设备或标准内部负载均衡器阻止的流量

调查

若要确定问题的具体原因,请按照以下部分中的三部分过程进行操作。

第 1 部分:配置相应的 KMS 客户端安装密钥

注意

在 Azure 虚拟桌面中运行Windows 10 企业版多会话(也称为虚拟桌面Windows 10 企业版)的 VM 不需要此部分。

若要确定 VM 是否正在运行多会话版本,请运行以下软件许可证管理器脚本命令:

slmgr.vbs /dlv

如果输出包含 Name: Windows(R), ServerRdsh edition 字符串,则 VM 正在运行多会话版本,可以跳过此部分的其余部分。

注意

如果部署Windows 10 企业版多会话 VM,然后将产品密钥更新到另一个版本,则无法将 VM 还原为Windows 10 企业版多会话。 相反,必须重新部署 VM。 有关详细信息,请参阅 是否可以将 Windows VM 升级到 Windows 企业版多会话?

对于从自定义映像创建的 VM,必须为 VM 配置相应的 KMS 客户端安装密钥。 执行以下步骤:

  1. 在提升的命令提示符窗口中,运行以下软件许可证管理器脚本命令:

    cscript c:\windows\system32\slmgr.vbs /dlv
    
  2. Description检查输出中的值,以确定 VM 是从零售(RETAIL通道)还是卷(VOLUME_KMSCLIENT)许可证媒体创建的。

  3. 如果上一个命令输出指示 RETAIL 通道,请运行以下软件许可证管理器脚本命令。 第一个命令设置 所用 Windows Server 版本的 KMS 客户端设置密钥 ,第二个命令强制进行另一次激活尝试。

    cscript c:\windows\system32\slmgr.vbs /ipk <kms-client-setup-key>
    cscript c:\windows\system32\slmgr.vbs /ato
    

    例如,如果你使用的是 Windows Server 2016 Datacenter,则第一个命令将如下所示:

    cscript c:\windows\system32\slmgr.vbs /ipk CB7KF-BWN84-R7R2Y-793K2-8XDDG
    

第 2 部分:检查 VM 是否位于标准 SKU 内部负载均衡器后面

按照以下步骤检查 VM 是否位于默认阻止出站 Internet 流量的标准 SKU 内部负载均衡器后面:

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

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

  3. 在 VM 的菜单窗格中,找到 网络”标题,然后选择“ 负载均衡”。 如果看到一条消息指出 “不显示负载均衡资源”,则 VM 不在任何负载均衡器后面。 在这种情况下,可以转到 第 3 部分:验证 VM 与 Azure KMS 服务之间的连接。

  4. 如果看到负载均衡器资源,请选择负载均衡器的名称以转到负载均衡器的 “概述 ”页。

  5. 在负载均衡器的菜单窗格中,选择“ 属性”。

  6. “属性”页上,找到 SKU负载均衡类型的,然后查看下表以了解结论。

    SKU负载均衡类型的值 结束语
    SKU 值为 “标准”, 负载均衡类型 值为 “专用”。 VM 位于标准 SKU 内部负载均衡器后面,默认情况下会阻止出站 Internet 流量。 若要启用出站连接,请参阅 解决方案 2:(对于标准内部负载均衡器),请使用 NAT 网关或标准公共负载均衡器
    SKU 值不是标准值,负载均衡类型值为 Public VM 不在标准 SKU 内部负载均衡器后面,默认情况下不会阻止出站 Internet 流量。 继续执行 第 3 部分:验证 VM 与 Azure KMS 服务之间的连接。

第 3 部分:验证 VM 与 Azure KMS 服务之间的连接

  1. 请确保 VM 已配置为使用正确的 Azure KMS 服务器。 为此,请运行以下软件许可证管理器脚本命令:

    Invoke-Expression "$env:windir\system32\cscript.exe $env:windir\system32\slmgr.vbs /skms azkms.core.windows.net:1688"
    

    此命令应返回以下文本:

    密钥管理服务计算机名称已成功设置为 azkms.core.windows.net:1688。

  2. 确保 VM 中的防火墙不会阻止端口 1688 上的 KMS 终结点的出站网络流量。 为此,请应用以下选项之一:

    • 通过在 PowerShell 中运行 Test-NetConnection cmdlet 来检查连接性:

      Test-NetConnection azkms.core.windows.net -port 1688
      

      如果允许连接尝试,则 cmdlet 在输出文本中显示“TcpTestSucceeded: True”。

    • 通过运行 PsPing 工具检查连接:

      .\psping.exe azkms.core.windows.net:1688
      

      在命令输出中,第二到最后一行应类似于以下文本:

      Sent = 4, Received = 4, Lost = 0 (0% loss)

      如果 Lost 大于 0(零),则 VM 没有连接到 KMS 服务器。 在这种情况下,如果 VM 位于虚拟网络中并指定了自定义 DNS 服务器,则必须确保 DNS 服务器可以解析 azkms.core.windows.net 域名。 如果无法,请将 DNS 服务器更改为可以解析 azkms.core.windows.net的 DNS 服务器。

      注意

      如果从虚拟网络中删除所有 DNS 服务器,VM 将使用 Azure 的内部 DNS 服务。 此服务可以解析 kms.core.windows.net

  3. 使用 Azure 网络观察程序下一跃点测试来验证下一跃点类型是否为从受影响的 VM 到特定目标的 Internet。 若要应用下一跃点测试,请执行以下步骤:

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

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

    3. 在 VM 的菜单窗格中,找到 “帮助 ”标题,然后选择“ 连接故障排除”。

    4. 在 VM 的“连接故障排除”页上,指定以下字段值。

      字段
      目标类型 手动指定
      URI、FQDN 或 IP 地址 20.118.99.22440.83.235.53 (对于 azkms.core.windows.net),或适用于你的区域的相应 KMS 终结点的 IP
      目标端口 1688
      源端口 1688
      诊断测试 下一跃点
    5. 选择“运行诊断测试”按钮。

    6. 诊断测试完成后,查看 按钮下方显示的“结果 ”框。 “下一跃点”(源)测试应具有“成功”状态,“详细信息”值应包括文本中的“下一跃点类型:Internet”。 如果下一跃点类型为 Internet,请针对每个剩余 IP 重复下一跃点测试。 但是,如果下一跃点类型显示为 VirtualApplianceVirtualNetworkGateway 或 Internet 以外的任何内容,则可能会发生以下情况之一:

      • 存在默认路由,该路由在将流量发送到 Azure KMS 终结点之前将流量路由到 Azure 外部。

      • 流量被阻止沿路径的某个位置。

      对于这些方案,请参阅 解决方案 1:(对于强制隧道),使用 Azure 自定义路由将激活流量路由到 Azure KMS 服务器

  4. 验证连接 azkms.core.windows.net 是否成功后,请在提升的 Windows PowerShell 提示符处运行以下命令。 此命令尝试多次激活 Windows VM:

    1..12 | ForEach-Object {
        Invoke-Expression "$env:windir\system32\cscript.exe $env:windir\system32\slmgr.vbs /ato";
        Start-Sleep 5
    }
    

    如果激活尝试成功,该命令将显示类似于以下文本的消息:

    正在激活 Windows(R)、服务器数据中心版(<kms-client-product-key>) ...产品已成功激活。

解决方案 1:(对于强制隧道),使用 Azure 自定义路由将激活流量路由到 Azure KMS 服务器

如果原因是在 Azure 外部路由流量的强制隧道方案,请与网络管理员协作来确定正确的操作过程。 强制隧道方案中 Windows 激活的“解决方案”部分中介绍了一种可能的解决方案。 如果解决方案与组织的策略一致,请应用此解决方案。

解决方案 2:(对于标准内部负载均衡器)使用 NAT 网关或标准公共负载均衡器

如果标准内部负载均衡器阻止流量,可通过两种不同的方法来解决问题,如出站连接使用源网络地址转换(SNAT)中所述

建议在生产部署中使用 Azure 虚拟网络 NAT 配置进行出站连接。 有关 Azure NAT 网关的详细信息,请参阅什么是 Azure NAT 网关?

但是,如果要求阻止所有 Internet 流量,请确保在必须激活的 VM 子网上使用网络安全组 (NSG) 规则拒绝出站 Internet 访问。 请注意,由于平台内部规则,端口 1688 上的 KMS IP 的操作系统激活流量仍然处于启用状态。

联系我们寻求帮助

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