9

我正在编写一个 powershell 脚本,该脚本将创建一个资源组,将包含的应用程序(在本例中为 Web Api)注册到关联的 AAD。但是,当调用试图分配Reader权限时,它一直失败。

我从 Visual Studio (2015) 中 AzureResourceGroup 模板附带的基本 deploy*.ps1 文件开始。

我正在运行以下代码:

#Requires -Version 3.0
#Requires -Module AzureRM.Resources
#Requires -Module Azure.Storage
Import-Module Azure -ErrorAction SilentlyContinue
Set-StrictMode -Version 3

Login-AzureRmAccount

$tenantWebSite = New-AzureRmADApplication -DisplayName "TheSiteName" -HomePage "http://MySignOnUrl" -IdentifierUris "http://MyIdentifierUrl" -Password "MyClientSecret"

$tenantWebSiteServicePrincipal = New-AzureRmADServicePrincipal -ApplicationId $tenantWebSite.ApplicationId

New-AzureRmRoleAssignment -RoleDefinitionName Reader -ServicePrincipalName $tenantWebSite.ApplicationId 

最后一个命令 ( New-AzureRmRoleAssignment) 继续失败并出现以下错误:

09:58:26 - [ERROR] New-AzureRmRoleAssignment : PrincipalNotFound: Principal 
09:58:26 - [ERROR] 50f3d430c68b485b8c11a63552171550 does not exist in the directory 
09:58:26 - [ERROR] <MyTenantId>.
09:58:26 - [ERROR] At D:\dev_new_2010\cto\src\dev\d.tom.0\deploy\calidos.maat.deploy.azureresource
09:58:26 - [ERROR] group\Scripts\Deploy-AzureResourceGroup.ps1:115 char:1
09:58:26 - [ERROR] + New-AzureRmRoleAssignment -RoleDefinitionName Reader -ServicePrincipa ...
09:58:26 - [ERROR] + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
09:58:26 - [ERROR]     + CategoryInfo          : CloseError: (:) [New-AzureRmRoleAssignment], Clo 
09:58:26 - [ERROR]    udException
09:58:26 - [ERROR]     + FullyQualifiedErrorId : Microsoft.Azure.Commands.Resources.NewAzureRoleA 
09:58:26 - [ERROR]    ssignmentCommand

通常,我使用 Visual Studio 中的部署选项来运行此脚本。当我从Microsoft Azure PowerShell命令窗口运行这个脚本时,我得到了同样的错误。

但是,当我在同一个 powershell 窗口中运行确切的命令时,它可以工作!

New-AzureRmRoleAssignment -RoleDefinitionName Reader -ServicePrincipalName <ApplicationId>

有人知道为什么这会在 ps1 文件中失败吗?我也尝试明确定义范围,但这也没有成功。

4

2 回答 2

8

编辑:

好的,以前的“解决方案”纯属运气......显然,这New-AzureRmADServicePrincipal是异步创建的。该方法确实会立即返回一个对象,但不会立即创建实际的主体......

我通过添加一个Start-Sleep -s 15命令来解决这个问题。

如果这还不够,要么增加它,要么捕获错误并等待几秒钟,然后再试一次。

于 2016-03-09T11:37:19.200 回答
2

我有同样的错误,但路径原因和解决方案不同。这是我的代码:

New-AzureRmRoleAssignment -ObjectId $ServicePrincipal.ApplicationId -RoleDefinitionName $Role -Scope "/subscriptions/$($Subscription.Context.Subscription.Id)"

它总是失败并出现同样的错误:

New-AzureRmRoleAssignment:目录 3141xxxxxxxxxxxxxx736 中不存在主体 7dfxxxxxxxxxxxxx1b1。

等待没有帮助。

通过使用$ServicePrincipal.Id而不是参数解决$ServicePrincipal.ApplicationId了该问题-ObjectId

$ServicePrincipal.ApplicationId示例 5 建议使用https://docs.microsoft.com/en-us/powershell/module/azurerm.resources/new-azurermroleassignment?view=azurermps-5.5.0,这是不正确的。

于 2018-03-16T14:36:42.403 回答