2

我一直在测试最近发布的 Azure 托管服务标识 (MSI),并使用此处文档中描述的 ARM 模板方法成功为我们的应用服务创建了一个 MSI:如何在应用中使用 Azure 托管服务标识(公共预览版)服务和 Azure 函数

但是,我想授予对其他资源(例如密钥保管库)的托管标识的访问权限。我已经能够通过门户做到这一点,但需要能够在 PowerShell 中编写脚本,以便与我们的持续部署构建集成。

我已通过执行 Set-AzureRmKeyVaultAccessPolicy cmdlet 使用 PowerShell 成功创建了访问权限。但是,我只能使用硬编码的对象 ID 来执行此操作,在创建 MSI 后从门户手动复制和粘贴。

我的问题是,如何在 PowerShell 中获取对 MSI 对象 ID 的引用,以便我可以授予对其他资源的访问权限?我能找到的唯一示例(例如这个)仅指虚拟机而不是应用服务。

4

4 回答 4

2

你可以使用Get-AzureADServicePrincipal.

$web=Get-AzureADServicePrincipal -SearchString "<name>"
$web.ObjectId

默认情况下,该名称是您的 Web 应用程序名称。

更新:

对于 OP 的场景,我们可以使用模板来获取对 Azure MSI 的引用。

于 2017-09-22T02:46:12.230 回答
1

使用最新的 AzureRM 模块 (6.13.1)

$AppProp = Get-AzureRmWebApp -ResourceGroupName $resourceGroupName -Name $name

写输出$AppProp.Identity

此身份属性提供有关 MSI 的所有必需详细信息。

Type        : SystemAssigned

TenantId    : c764619f-8856-4a9f-a81e-eeb0c3f93592

PrincipalId : 3d317dfe-5589-4aae-94a4-51f1776979a7
于 2019-06-13T13:01:33.817 回答
1

因为您使用 ARM 部署了资源,所以我想添加这个答案,因为您只能使用 ARM:

  1. 为您的密钥保管库启用 ARM 模板部署:

    {
      "type": "Microsoft.KeyVault/vaults",   
      "name": "[parameters('keyVaultName')]",       
      ...
      "properties": {
        "enabledForTemplateDeployment": true,
        ...
      }
    }
    
  2. 创建系统标识:

    {
      "type": "Microsoft.Web/sites",
      "name": "[parameters('functionAppName')]",       
      ...
      "identity": {
        "type": "SystemAssigned"
      }
      ...
    }
    
  3. 创建访问策略:

    {
      "apiVersion": "2018-02-14",
      "type": "Microsoft.KeyVault/vaults/accessPolicies",
      "name": "[concat(parameters('keyVaultName'), '/add')]",
      "properties": {
        "accessPolicies": [
          {
            "tenantId": "[parameters('tenantId')]",
            "objectId": "[reference(resourceId('Microsoft.Web/sites', parameters('functionAppName')), '2018-02-01', 'Full').identity.principalId]",
            "permissions": {
              "secrets": [ "get" ]
            }
          }
        ]
      },
      "dependsOn": [
        "[resourceId('Microsoft.KeyVault/vaults', parameters('keyVaultName'))]",
        "[resourceId('Microsoft.Web/sites', parameters('functionAppName'))]"
      ]
    }
    
于 2019-01-13T23:32:46.533 回答
0

如果要使用 Azure RM PowerShell Commandlet,则可以使用:

$(Get-AzureRmADServicePrincipal -SearchString $Name | where {$_.DisplayName -eq $Name}).Id

where 部分是为了确保您拥有特定的 SP 而不是以相同名称开头的多个结果。

编辑:即使以上也可能导致多个值。一个更好的解决方案是像这样进一步过滤:

Get-AzureRmADServicePrincipal -SearchString $Name | where {($_.DisplayName -eq $Name) -and ($_.ServicePrincipalNames -match "https://identity.azure.net")}
于 2018-06-13T13:00:18.387 回答