如何从交互式PowerShell会话调用Azure REST API

如何从交互式PowerShell会话调用Azure REST API,azure,powershell,Azure,Powershell,我希望能够从交互式PowerShell会话调用Azure REST API方法。有关于如何使用服务主体执行此操作的说明,但我希望能够使用自己的凭据调用这些方法,而不是切换到不同的集合。这将使我更容易制定出需要在本地调用的方法,也更容易从Azure临时收集信息 我想使用现有PowerShell cmdlet进行的调用的一个示例是 https://management.azure.com/subscriptions/{subscriptionId}/resourceGroups/{resourceG

我希望能够从交互式PowerShell会话调用Azure REST API方法。有关于如何使用服务主体执行此操作的说明,但我希望能够使用自己的凭据调用这些方法,而不是切换到不同的集合。这将使我更容易制定出需要在本地调用的方法,也更容易从Azure临时收集信息

我想使用现有PowerShell cmdlet进行的调用的一个示例是


https://management.azure.com/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.ApiManagement/service/{serviceName}/products/{productId}/策略/策略?api版本=2019-01-01

当您使用登录AzurerAccount或登录AzureAccount登录Azure,然后调用AzureRm或Az cmdlet时,将从Azure获取承载令牌并将其存储在您的上下文对象中。您可以使用Get-AzureRmContext或Get-AzureContext检索上下文对象,并从该对象解析令牌

    $Context = Get-AzContext
    $Cache = $Context.TokenCache
    $CacheItems = $Cache.ReadItems()
    $Token = ($CacheItems | Where-Object { $_.Resource -eq "https://management.core.windows.net/" })
令牌将持续一个小时,如果到期,您需要再次调用Azure cmdlet进行续订(尽管可以通过编程方式进行续订)

这段代码可以封装在如下函数中

function Invoke-AzureRestApi {
    [CmdletBinding()]
    param(
        [Parameter(Mandatory=$true)]
        [String]$Uri
    )

    $Context = Get-AzContext
    $Cache = $Context.TokenCache
    $CacheItems = $Cache.ReadItems()
    $Token = ($CacheItems | Where-Object { $_.Resource -eq "https://management.core.windows.net/" })
    $Headers = @{Authorization = "Bearer $($Token.AccessToken)"}

    Invoke-RestMethod -Method GET -Uri $Uri -Headers $Headers

}

# run an Az or AzureRm cmdlet to get a token prior to calling the function
Invoke-AzureRestApi -Uri https://management.azure.com/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.ApiManagement/service/{serviceName}/products/{productId}/policies/policy?api-version=2019-01-01

# A simpler example to test the function (though this particular example can be more easily achieved with Get-AzResourceGroup)
Invoke-AzureRestApi -Uri https://management.azure.com/subscriptions/{subscriptionId}/resourcegroups?api-version=2019-08-01


您只需使用
Get-AzResource
即可获得相同的结果,而无需处理令牌


您的特定示例调用没有多大意义,它可以替换为
Get-AzResourceGroup

很好,我已经修改了问答,添加了一个更相关的示例。尼克,您知道一种启动登录AzAccount将生成的提示的方法吗?我的意图是在Az模块不可用的情况下根本不使用登录AzaAccount,而是完全使用REST。我尝试使用Invoke WebRequest发布到oAuth端点,但不幸的是,登录表单是非交互式的,我需要一个提示窗口。@Sumesh听起来像是在尝试创建自己的身份验证流(而不是利用现有的PowerShell身份验证流使在本地调试脚本更容易)。您可能希望从文档开始,或者发布一个新问题,其中包含关于您已经实现的内容的更多细节