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

时间:2016-03-23 04:32:18

标签: xml api rest azure azure-resource-manager

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

为什么以下代码不被API服务接受?文档显示了作为KV对对象的additionalUnattendContent的示例,但我发现(通过搜索实际的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."
  }
}

1 个答案:

答案 0 :(得分:2)

我的经验是:

  • 是一个数组
  • 它不应该是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