Azure 配置 - 无需手动登录

Azure Provisioning - Without manual login

我有一个 Powershell 脚本,它运行以设置 Azure 网络应用程序、数据库等。但在 运行 脚本之前,我必须执行以下操作:

PS C:/> Login-AzureRmAccount

这会弹出一个 GUI,我必须在其中手动添加我的用户、密码和我的双因素身份验证代码。我最终想将该脚本用作 build/deployment 自动化脚本的一部分。

我从几篇关于使用 "service principal" 的文章中收集了以下内容。

我先做:

PS C:\> Add-AzureRmAccount

在这个调用中我必须输入我的用户名、密码和验证码

之后我必须执行以下操作(即使我不完全理解)。

$app = New-AzureRmADApplication -DisplayName "GGReal" -HomePage    "https://www.example.org/ggreal" -IdentifierUris     "https://www.example.org/ggreal" -Password "mysecretpass"

New-AzureRmADServicePrincipal -ApplicationId $app.ApplicationId

这似乎有效:

然后我尝试这个,但失败了。

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

我收到以下错误:

New-AzureRmRoleAssignment : AuthorizationFailed: The client jay@myemail.com' with object id '8ee9a6ec-yyyy-xxxx-xxxx-4ac0883f2a12' does not have authorization to perform action 'Microsoft.Authorization/roleAssignments/write' over scope '/subscriptions/5ba06de5-xxxx-zzzz-yyyy-27f7d2c8bba6'.
At line:1 char:1
+ New-AzureRmRoleAssignment -RoleDefinitionName Reader -ServicePrincipa ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo          : CloseError: (:) [New-AzureRmRoleAssignment], CloudException
+ FullyQualifiedErrorId : Microsoft.Azure.Commands.Resources.NewAzureRoleAssignmentCommand

我需要做什么才能在没有人工干预的情况下启用脚本授权?

嗯,您没有将该角色分配给该服务主体的权限,您需要适当的权限。那些将是:Microsoft.Authorization/roleAssignments/write 和范围 /subscriptions/5ba06de5-xxxx-zzzz-yyyy-27f7d2c8bba6

您可以创建一个新的 Custom Role 并将其分配给您的帐户,或者将订阅管理员之类的东西(不确定它是否是最不可能的方法,但您可以稍后收回)分配给您的帐户。

根据异常,它表明您没有足够的权限。我们可以在 document 之后检查活动目录权限。我们的帐户需要具有 Microsoft.Authorization/*/Write 访问权限才能将 AD 应用分配给角色。这意味着我们的帐户应该分配给 Owner role or User Access Administrator role. If not, please ask your subscription administrator to add you to User Access Administrator role. How to add or change Azure administrator roles please refer to the document.

之后请尝试使用以下代码自动登录 Azure Powershell 脚本。

$azureAplicationId ="Azure AD Application Id"
$azureTenantId= "Your Tenant Id"
$azurePassword = ConvertTo-SecureString "strong password" -AsPlainText -Force
$psCred = New-Object System.Management.Automation.PSCredential($azureAplicationId , $azurePassword)
Add-AzureRmAccount -Credential $psCred -TenantId $azureTenantId  -ServicePrincipal 

我还找到了一些关于创建身份验证和内置角色的相关文档:
https://docs.microsoft.com/en-us/azure/azure-resource-manager/resource-group-authenticate-service-principal
https://docs.microsoft.com/en-us/azure/active-directory/role-based-access-built-in-roles#roles-in-azurel