问题描述

PowerShell 脚本调用Azure REST API, 但是所有的API都需要进行权限验证。要在请求的Header部分带上Authorization参数,并用来对List Resource Group接口进行授权,然后显示Resource Group的Name,Location,和ID ...

问题解答

第一步:在Azure AD中注册应用,该应用表示执行PowerShell Script的客户端拥有访问Subscription下资源的权限。如无,则会出现 AuthorizationFailed 错误,详见附录一:权限问题

  1. 在浏览器上的新标签页中打开 Azure 门户。

  2. 导航到“应用注册”以在 Active Directory 中注册应用。

  3. 选择“新注册”。 在“注册应用程序”页上,将值设置如下:

    • 将“名称”设置为一个有意义的名称。 例如,powershell-client
    • 将“支持的帐户类型”设置为“仅限此组织目录中的帐户”。
    • 选择“注册” 。
  4. 注册应用程序之后,从“概述”页复制“应用程序(客户端) ID” 和 “ 目录(tenant) ID ”。

  5. 在边侧菜单的“管理”部分下,选择“证书和机密” 。

  6. 在“证书和机密”页中,选择“客户端机密”下的“新建客户端机密”按钮 。

    • 输入“说明”。
    • 为“过期”选择任一选项。
    • 选择“添加” 。
  7. 在离开页面之前复制客户端的“机密 ID”。 稍后脚本中需要用到此值。

第二步:在下面脚本中替换自己的 tenantId, applicationId secret

#===============================================
# 2021-11-14 通过Azure AD中的注册应用获取Access Token
#
# Azure AD App Registrations: https://portal.azure.cn/#blade/Microsoft_AAD_IAM/ActiveDirectoryMenuBlade/RegisteredApps
# 【Azure Developer】使用Postman获取Azure AD中注册应用程序的授权Token,及为Azure REST API设置Authorization: https://www.cnblogs.com/lulight/p/14279338.html
#=============================================== $tenantId='xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx'
$applicationId='xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx'
$secret='-xxxx~xxxxxxxxxxxxxxxxxxxxxxxx' $param = @{
Uri ="https://login.chinacloudapi.cn/$tenantId/oauth2/token";
Method = 'Post';
Body = @{
grant_type = 'client_credentials';
resource = 'https://management.chinacloudapi.cn';
client_id = $applicationId;
client_secret = $secret
}
} Write-Host '调用Token接口 .. ' -ForegroundColor DarkYellow
$result = Invoke-RestMethod @param
$result #===============================================
#
# 使用Token作为Authorization,调用Resource Groups - List: https://docs.microsoft.com/en-us/rest/api/resources/resource-groups/list
#
#=============================================== $subscriptionId = 'xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx'
$token = $result.access_token $param_rgList = @{
Uri = "https://management.chinacloudapi.cn/subscriptions/$subscriptionId/resourcegroups?api-version=2020-06-01";
ContentType = 'application/json';
Method = 'GET'
Headers = @{
Authorization = "Bearer $token";
host = "management.chinacloudapi.cn"
}
} Write-Host '调用 Resource Groups - List 接口 .. ' -ForegroundColor DarkYellow
$rgList = Invoke-RestMethod @param_rgList
$rgList.value | Select-Object name, location, id

执行结果:

附录一:权限问题

错误消息:

Invoke-RestMethod : {"error":{"code":"AuthorizationFailed","message":"The client '0b807bf1-40db-4e0c-888f-380b9b558cf1' with object id '0b807bf1-40db-4e0c-888f-380b9b558cf1' does not have authorization
to perform action 'Microsoft.Resources/subscriptions/resourcegroups/read' over scope '/subscriptions/a9dc7515-7692-4316-9ad4-762f383eec10' or the scope is invalid. If access was recently granted,
please refresh your credentials."}}
At line:49 char:12
+ $rgList = Invoke-RestMethod @param_rgList
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : InvalidOperation: (System.Net.HttpWebRequest:HttpWebRequest) [Invoke-RestMethod], WebException
+ FullyQualifiedErrorId : WebCmdletWebResponseException,Microsoft.PowerShell.Commands.InvokeRestMethodCommand

错误截图:

解决办法:

在门户中进入Subscriptions页面,对注册应用赋予Reader权限即可。

1) 进入Azure Subscriptions页面:https://portal.azure.cn/#blade/Microsoft_Azure_Billing/SubscriptionsBlade

2) 选中订阅,在Access Control(iam)中对第一步中 AAD的注册应用赋予Reader权限。

附录二:PowerShell中URL后携带参数的‘?’需要转义

因为PowerShell的变量名中后不能为符号,如 ? 等,需要添加 ` 作为转义字符(高亮部分),改为 '?。

如:

$apiurl ="https://management.chinacloudapi.cn/.../$CloudServiceName?api-version=2015-06-01"

应修改为:

$apiurl ="https://management.chinacloudapi.cn/.../$CloudServiceName`?api-version=2015-06-01"

参考资料

Resource Groups - Listhttps://docs.microsoft.com/en-us/rest/api/resources/resource-groups/list

Postman获取Azure AD中注册应用程序的授权Token,及为Azure REST API设置Authorizationhttps://www.cnblogs.com/lulight/p/14279338.html

【Azure 环境】用 PowerShell 调用 AAD Token, 以及调用Azure REST API(如资源组列表)的更多相关文章

  1. 【Azure 环境】【Azure Developer】使用Python代码获取Azure 中的资源的Metrics定义及数据

    问题描述 使用Python SDK来获取Azure上的各种资源的Metrics的名称以及Metrics Data的示例 问题解答 通过 azure-monitor-query ,可以创建一个 metr ...

  2. 将 Windows VM 移到其他 Azure 订阅或资源组

    本文逐步说明如何在资源组或订阅之间移动 Windows VM. 如果最初在个人订阅中创建了 VM,现在想要将其移到公司的订阅以继续工作,则在订阅之间移动 VM 可能很方便. Important 不可在 ...

  3. 【Azure Developer】Python代码通过AAD认证访问微软Azure密钥保管库(Azure Key Vault)中机密信息(Secret)

    关键字说明 什么是 Azure Active Directory?Azure Active Directory(Azure AD, AAD) 是 Microsoft 的基于云的标识和访问管理服务,可帮 ...

  4. 【Azure 环境】由为存储账号(Storage Account)拒绝分配权限而引出的Azure 蓝图(Blueprint)使用问题

    问题描述 当打开Azure存储账号(Storage Account)门户页面时,从 "访问控制(标识和访问管理)" 页面中发现有"拒绝分配"的功能,所以就思考, ...

  5. ASP.NET 在 Windows Azure 环境中使用基于 SQLServer 的 Session

    Session 嘛,占一点儿服务器资源,但是总归比 ViewState 和 Cookie 安全点儿,所以还是要用的. Windows Azure 环境中的 Web 服务器经由负载均衡调度,根本无法保证 ...

  6. Azure PowerShell (9) 使用PowerShell导出订阅下所有的Azure VM的Public IP和Private IP

    <Windows Azure Platform 系列文章目录> 笔者在之前的工作中,有客户提出想一次性查看Azure订阅下的所有Azure VM的Public IP和Private IP. ...

  7. 如何在Azure环境里做好信息传递可扩展性经验分享

    作者 王枫 发布于2014年5月15日 综述 本文介绍建立一个在Azure上使用Azure服务总线, 高吞吐量短信平台的必要步骤.在这篇文章中提出的解决方案是在响应由客户的具体要求,建立一个基于Win ...

  8. AAD Service Principal获取azure user list (Microsoft Graph API)

    本段代码是个通用性很强的sample code,不仅能够操作AAD本身,也能通过Azure Service Principal的授权来访问和控制Azure的订阅资源.(Azure某种程度上能看成是两个 ...

  9. 【Azure 环境】在Windows系统中 使用Terraform创建中国区Azure资源步骤(入门级)

    Terraform(全称:Hashicorp Terraform )是一种开源工具,用于预配和管理云基础结构. 它将基础结构编入描述云资源拓扑的配置文件中. 这些资源包括虚拟机.存储帐户和网络接口等. ...

随机推荐

  1. P5782-[POI2001]和平委员会【2-SAT】

    正题 题目链接:https://www.luogu.com.cn/problem/P5782 题目大意 \(n\)对人,每对之间恰好有一个人出席.\(m\)对仇恨关系表示两个人不能同时出席. 求是否有 ...

  2. PyTorch中的Batch Normalization

    Pytorch中的BatchNorm的API主要有: 1 torch.nn.BatchNorm1d(num_features, 2 3 eps=1e-05, 4 5 momentum=0.1, 6 7 ...

  3. 关于java实体类时间类型的格式化调整问题

    关于java bean在后台\转化为json交给前台时间类型格式调整的方法: 首先要引入fastjson依赖. 在实体类上使用注解: @JsonFormat(pattern = "yyyy- ...

  4. 数值计算:粒子群优化算法(PSO)

    PSO 最近需要用上一点最优化相关的理论,特地去查了些PSO算法相关资料,在此记录下学习笔记,附上程序代码.基础知识参考知乎大佬文章,写得很棒! 传送门 背景 起源:1995年,受到鸟群觅食行为的规律 ...

  5. Linux7安装redis6

    首先下载软件包并解压 cd /opt wget https://download.redis.io/releases/redis-6.2.5.tar.gz tar -zxvf redis-6.2.5. ...

  6. 微信公众号开发之H5页面跳转到指定的小程序

    前言: 最近公司有一个这样的需要,需要从我们在现有的公众号H5页面中加一个跳转到第三方小程序的按钮.之前只知道小程序之间是可以相互跳转的,今天查阅了下微信开发文档原来现在H5网页也支持小程序之间的跳转 ...

  7. ApacheCon 首次亚洲大会火热来袭,SphereEx 邀您共赴年度盛会!

    ApacheCon 是 Apache 软件基金会(ASF)的官方全球系列大会.作为久负盛名的开源盛宴,ApacheCon 在开源界备受关注,也是开源运动早期的知名活动之一. ApacheCon 每年举 ...

  8. Rigidbody钢体移动时抖动问题

    Rigidbody移动时抖动问题 撞墙抖动 Unity中物体移动有非常多的方式: 比如: transform.position += dir*speed*Time.deltaTime; transfo ...

  9. TCP服务器和客户端_Socket编程

    TCP服务器 服务器启动文件 1 import java.io.IOException; 2 import java.net.ServerSocket; 3 import java.net.Socke ...

  10. Mybatis 一级缓存 (20)

    Mybatis中的一级缓存和二级缓存(本博文只是针对一级缓存说明) 概述 ORM框架一般都会有缓存机制,做为其中一员的Mybatis也存在缓存.功能是用以提升查询的效率和服务给数据库带来压力.同样的M ...