【Azure 环境】用 PowerShell 调用 AAD Token, 以及调用Azure REST API(如资源组列表)
问题描述
PowerShell 脚本调用Azure REST API, 但是所有的API都需要进行权限验证。要在请求的Header部分带上Authorization参数,并用来对List Resource Group接口进行授权,然后显示Resource Group的Name,Location,和ID ...
问题解答
第一步:在Azure AD中注册应用,该应用表示执行PowerShell Script的客户端拥有访问Subscription下资源的权限。如无,则会出现 AuthorizationFailed 错误,详见附录一:权限问题
在浏览器上的新标签页中打开 Azure 门户。
导航到“应用注册”以在 Active Directory 中注册应用。
选择“新注册”。 在“注册应用程序”页上,将值设置如下:
- 将“名称”设置为一个有意义的名称。 例如,powershell-client
- 将“支持的帐户类型”设置为“仅限此组织目录中的帐户”。
- 选择“注册” 。
注册应用程序之后,从“概述”页复制“应用程序(客户端) ID” 和 “ 目录(tenant) ID ”。
在边侧菜单的“管理”部分下,选择“证书和机密” 。
在“证书和机密”页中,选择“客户端机密”下的“新建客户端机密”按钮 。
- 输入“说明”。
- 为“过期”选择任一选项。
- 选择“添加” 。
在离开页面之前复制客户端的“机密 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 - List:https://docs.microsoft.com/en-us/rest/api/resources/resource-groups/list
Postman获取Azure AD中注册应用程序的授权Token,及为Azure REST API设置Authorization:https://www.cnblogs.com/lulight/p/14279338.html
【Azure 环境】用 PowerShell 调用 AAD Token, 以及调用Azure REST API(如资源组列表)的更多相关文章
- 【Azure 环境】【Azure Developer】使用Python代码获取Azure 中的资源的Metrics定义及数据
问题描述 使用Python SDK来获取Azure上的各种资源的Metrics的名称以及Metrics Data的示例 问题解答 通过 azure-monitor-query ,可以创建一个 metr ...
- 将 Windows VM 移到其他 Azure 订阅或资源组
本文逐步说明如何在资源组或订阅之间移动 Windows VM. 如果最初在个人订阅中创建了 VM,现在想要将其移到公司的订阅以继续工作,则在订阅之间移动 VM 可能很方便. Important 不可在 ...
- 【Azure Developer】Python代码通过AAD认证访问微软Azure密钥保管库(Azure Key Vault)中机密信息(Secret)
关键字说明 什么是 Azure Active Directory?Azure Active Directory(Azure AD, AAD) 是 Microsoft 的基于云的标识和访问管理服务,可帮 ...
- 【Azure 环境】由为存储账号(Storage Account)拒绝分配权限而引出的Azure 蓝图(Blueprint)使用问题
问题描述 当打开Azure存储账号(Storage Account)门户页面时,从 "访问控制(标识和访问管理)" 页面中发现有"拒绝分配"的功能,所以就思考, ...
- ASP.NET 在 Windows Azure 环境中使用基于 SQLServer 的 Session
Session 嘛,占一点儿服务器资源,但是总归比 ViewState 和 Cookie 安全点儿,所以还是要用的. Windows Azure 环境中的 Web 服务器经由负载均衡调度,根本无法保证 ...
- Azure PowerShell (9) 使用PowerShell导出订阅下所有的Azure VM的Public IP和Private IP
<Windows Azure Platform 系列文章目录> 笔者在之前的工作中,有客户提出想一次性查看Azure订阅下的所有Azure VM的Public IP和Private IP. ...
- 如何在Azure环境里做好信息传递可扩展性经验分享
作者 王枫 发布于2014年5月15日 综述 本文介绍建立一个在Azure上使用Azure服务总线, 高吞吐量短信平台的必要步骤.在这篇文章中提出的解决方案是在响应由客户的具体要求,建立一个基于Win ...
- AAD Service Principal获取azure user list (Microsoft Graph API)
本段代码是个通用性很强的sample code,不仅能够操作AAD本身,也能通过Azure Service Principal的授权来访问和控制Azure的订阅资源.(Azure某种程度上能看成是两个 ...
- 【Azure 环境】在Windows系统中 使用Terraform创建中国区Azure资源步骤(入门级)
Terraform(全称:Hashicorp Terraform )是一种开源工具,用于预配和管理云基础结构. 它将基础结构编入描述云资源拓扑的配置文件中. 这些资源包括虚拟机.存储帐户和网络接口等. ...
随机推荐
- windows环境下配置Kafaka
一.安装Zookeeper(Kafaka依赖于zookeeper进行服务注册和管理) 1. 1 下载zookeeper:http://mirror.bit.edu.cn/apache/zookee ...
- 深度学习--GAN学习笔记
生成模型 WGAN Blog GAN 推荐学习网站 生成模型 什么是生成模型? GMM: 用来做聚类,(非监督学习) NB(朴素贝叶斯):(监督学习,可以用来做垃圾邮件分类) Logistics 回归 ...
- SpringBoot碰到的疑问或问题
1.@ResponseBody 和 @RequestBody 的区别 @ResponseBody是作用在方法上的,@ResponseBody 表示该方法的返回结果直接写入 HTTP response ...
- 10.10 Rewrite 实战
将baidu.com跳转到www.baidu.com server { listen 80; server_name baidu.com; rewrite ^/ http://www.baidu.co ...
- SpringBoot 如何进行限流?老鸟们都这么玩的!
大家好,我是飘渺.SpringBoot老鸟系列的文章已经写了四篇,每篇的阅读反响都还不错,那今天继续给大家带来老鸟系列的第五篇,来聊聊在SpringBoot项目中如何对接口进行限流,有哪些常见的限流算 ...
- 每日总结:charcter方法(2021.10.5)
\t 在文中该处插入一个tab键 \b在文中该处插入一个后退键 \n 换行 \r 在文中该处回车 \f 在文中该处插入换页符 方法: isLetter()是否是一个字母 isDigit()是否是一个 ...
- 洛谷4606 SDOI2018战略游戏(圆方树+虚树)
QWQ深受其害 当时在现场是真的绝望...... 现在再重新来看这个题 QWQ 根据题目所说,我们可以发现,对于每一个集合中的节点,我们实际上就是要求两两路径上的割点的数目 考虑到又是关于点双的题目, ...
- java实现责任链模式的小demo
//一个请假请求 public class LeaveRequest { private int leaveDays; private String name; public void leave() ...
- 原生js-无缝滚动
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- 【UE4 C++】碰撞检测与事件绑定
概念 碰撞对象通道与预设 默认提供碰撞对象类型,如 WorldStatic.WorldDynamic等.允许用户自定义 默认提供碰撞预设,如 NoCollision.BloackAll.Overlap ...