additionalUnattendContent 内容被 Azure 虚拟机 REST 拒绝 API

additionalUnattendContent content being rejected by Azure Virtual Machines REST API

我正在编写云编排工具和 Azure REST API(资源管理器)之间的接口,但我 运行 遇到了测试 Windows additionalUnattendContent 功能的问题让 Unattend.xml 注射工作。

为什么 API 服务不接受下面的代码?该文档将 additionalUnattendContent 的示例显示为 KV 对对象,但我发现(通过搜索实际的 ARM 规范)它实际上是一个对象列表。它还指定内容部分应采用 base64 编码且大小不超过 4KiB,并包含功能或设置的根元素(不完全确定这是什么意思)。我已经对我认为有效的 XML 组件进行了编码,但它会引发错误(代码和错误如下所述)。我已经使用 API 版本 2016-03-30 和 2015-05-01-preview 进行了尝试,结果相同。

这是我对 API 服务的请求的 osProfile 摘录。

"osProfile": {
  "adminUsername": "winuxadmin",
  "computername": "vm331d4bwx",
  "windowsConfiguration": {
    "additionalUnattendContent": [{
      "content": "PFN5bmNocm9ub3VzQ29tbWFuZCB3Y206YWN0aW9uPSJhZGQiPjxDb21tYW5kTGluZT4lU3lzdGVtUm9vdCVcc3lzdGVtMzJcbmV0c2ggYWR2ZmlyZXdhbGwgYWRkIHJ1bGUgbmFtZT0iV2luUk0gSFRUUCA1OTg1IiBwcm90b2NvbD0iVENQIiBkaXI9ImluIiBsb2NhbHBvcnQ9IjU5ODUiIGFjdGlvbj0iYWxsb3ciPC9Db21tYW5kTGluZT48T3JkZXI+MTwvT3JkZXI+PERlc2NyaXB0aW9uPk9wZW4gV2luUk0gSFRUUCBwb3J0PC9EZXNjcmlwdGlvbj48L1N5bmNocm9ub3VzQ29tbWFuZD4=",
      "componentName": "Microsoft-Windows-Shell-Setup",
      "settingName": "FirstLogonCommands",
      "passName": "oobeSystem"
    }],
    "winRM": {
      "listeners": [{
        "protocol": "http",
        "certificateUrl": null
      }]
    },
    "provisionVMAgent": true
  },
  "adminPassword": "MyW1nP@ssw0rd"
},

base64 XML additionalUnattendContent[0].content 解码为这个(note: 我也做了同样的测试但内容 XML 包装在根设置节点 - <FirstLogonCommands>...</FirstLogonCommands> - 但结果是相同的)。这里实际的 Windows 命令并不是很重要,更可能需要一个 WinRM 命令来允许未加密的连接,但问题实际上与命令无关 -

<SynchronousCommand wcm:action="add">
  <CommandLine>%SystemRoot%\system32\netsh advfirewall add rule name="WinRM HTTP 5985" protocol="TCP" dir="in" localport="5985" action="allow"</CommandLine>
  <Order>1</Order>
  <Description>Enable QuickEdit mode</Description>
</SynchronousCommand>

一旦我意识到官方文档关于 additionalUnattendContent 的格式是错误的(它应该是一个对象列表而不仅仅是一个对象),我就能够从 API服务 -

statusCode:BadRequest serviceRequestId:<req-id> statusMessage:
{
  "error": 
  {
    "code": "InvalidParameter",
    "target": "windowsConfiguration.additionalUnattendContent.content",
    "message": "The value of parameter windowsConfiguration.additionalUnattendContent.content is invalid."
  }
}

我的经验是:

  • 它是一个数组
  • 不应该是base64编码
  • 带冒号的属性会导致奇怪的错误(例如 wcm:action=...)

这是一个工作示例:

"additionalUnattendContent": [
  {
    "passName": "oobesystem",
    "componentName": "Microsoft-Windows-Shell-Setup",
    "settingName": "FirstLogonCommands",
    "content": "<FirstLogonCommands><SynchronousCommand><CommandLine>shutdown /r /t 0 /c \"initial reboot\"</CommandLine><Description>reboot</Description><Order>1</Order></SynchronousCommand></FirstLogonCommands>"
  }
]

以下是关于该主题的讨论: https://github.com/Azure/azure-quickstart-templates/issues/1407