AzureAD PowerShell New-AzureRmRoleAssignment保持失败

Tom*_*yts 9 powershell azure azure-active-directory azure-resource-manager service-principal

我正在开发一个PowerShell脚本,它将创建一个资源组,将所包含的应用程序(在本例中为Web Api)注册到相关的AAD.但是,在调用尝试分配Reader权限时,它会继续失败.

我从Visual Studio(2015)中的AzureResourceGroup模板附带的基本部署*.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 
Run Code Online (Sandbox Code Playgroud)

最后一个命令(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
Run Code Online (Sandbox Code Playgroud)

通常,我使用visual studio中的deploy选项运行此脚本.当我从Microsoft Azure PowerShell命令窗口运行此脚本时,我得到相同的错误.

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

New-AzureRmRoleAssignment -RoleDefinitionName Reader -ServicePrincipalName <ApplicationId>
Run Code Online (Sandbox Code Playgroud)

有没有人知道为什么这会在ps1文件中失败?我也试图明确定义范围,但这也没有做到.

Tom*_*yts 8

编辑:

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

我通过添加Start-Sleep -s 15命令解决了这个问题.

如果这还不够,可以增加它,或者捕获错误并等待几秒再重试.