ARM 模板:查找用户对象 ID

ARM Template: Looking up a user object Id

我正在尝试以编程方式将某个用户帐户的对象 ID 插入到 ARM 模板中,如下所示:

"objectId": "[reference(resourceId('Microsoft.AAD/domainServices/user/read','domain','User.Name'),'2019-01-01').Id]",

我已经尝试了许多不同的资源提供者来尝试让它工作。例如:

"objectId": "[reference(resourceId('Microsoft.ManagedIdentity/userAssignedIdentities/read','user@domain.onmicrosoft.com'),'2019-01-01').Id]",

和:

"objectId": "[reference(resourceId('Microsoft.Portal/usersettings/read','user@domain.onmicrosoft.com'),'2018-10-01').Id]"

我查找了用于获取用户列表的 API 调用,看看它是否会提示使用正确的提供商(它没有):

GET https://graph.windows.net/{TenantId}/users?api-version=1.6 HTTP/1.1

我一直在查看 this list of provider operations 但发现了两个问题:

1 我看不到与我想做的事情相关的操作。

2 它没有提供有关需要哪些参数的信息。

所以我想我真的有两个问题:

  1. 如何在ARM模板中动态查询用户的ObjectId?
  2. 我以后如何知道哪些查找函数可用以及哪些参数是必需的?

您无法在 ARM 模板中插入用户对象 ID。

用户帐户由您的Azure AD 租户管理,它不是Azure 资源,ARM 模板是针对您订阅中的Azure 资源。

参考:https://docs.microsoft.com/en-us/azure/azure-resource-manager/resource-group-overview

Azure Resource Manager is the deployment and management service for Azure. It provides a consistent management layer that enables you to create, update, and delete resources in your Azure subscription.

如果您在同一模板中有 VM 并启用了托管身份,您可以尝试使用以下代码

https://docs.microsoft.com/en-us/azure/azure-resource-manager/resource-group-template-functions-resource#remarks-1

{
  "type": "Microsoft.KeyVault/vaults",
  "properties": {
    "tenantId": "[reference(concat('Microsoft.Compute/virtualMachines/', variables('vmName')), '2017-03-30', 'Full').identity.tenantId]",
    "accessPolicies": [
      {
        "tenantId": "[reference(concat('Microsoft.Compute/virtualMachines/', variables('vmName')), '2017-03-30', 'Full').identity.tenantId]",
        "objectId": "[reference(concat('Microsoft.Compute/virtualMachines/', variables('vmName')), '2017-03-30', 'Full').identity.principalId]",
        "permissions": {
          "keys": [
            "all"
          ],
          "secrets": [
            "all"
          ]
        }
      }
    ]

我发现实现此目的的最佳方法是将 ID 作为参数公开,然后在调用 ARM 模板部署时,只需将参数传递到模板中即可。

如何将 ID 放入模板参数中?嗯,我 运行 通过 Azure DevOps CI/CD 我的 ARM 部署,我使用管道任务 AzureAppConfiguration.azure-app-configuration-task.custom-build-release-task.AzureAppConfiguration@1 从我自己的自定义配置设置中提取 ID。

如何将 ID 获取到 Azure 应用程序配置服务中?好吧,当我第一次播种环境时,会有一些初始设置,例如用户和组。然后我 运行 一些脚本将这种 "metadata" 提取到我的 Azure 应用程序配置服务中。

例如

APP_ID=$(az ad sp list --all --query "[?displayName=='name-of-spn'].appId" --output tsv)

az appconfig kv set --name name-of-app-config-store --key name-of-spn-app-id --value ${APP_ID}