当前位置: 首页 > 知识库问答 >
问题:

通过PowerShell访问MS Graph API的权限

韩明德
2023-03-14

我的剧本

$azContext = Get-AzContext
$token = [Microsoft.Azure.Commands.Common.Authentication.AzureSession]::Instance.AuthenticationFactory.Authenticate(
    $azContext.Account,
    $azContext.Environment,
    $azContext.Tenant.Id,
    $null,
    [Microsoft.Azure.Commands.Common.Authentication.ShowDialog]::Never,
    $null,
    "https://graph.microsoft.com"
)

$params = @{
    Method  = "GET"
    Uri     = "https://graph.microsoft.com/beta/reports/credentialUserRegistrationDetails"
    Headers = @{
        Authorization  = "Bearer $($token.AccessToken)"
        "Content-Type" = "application/json"
    }
}
Invoke-RestMethod @params

回应

{
  "error": {
    "code":"Authentication_MSGraphPermissionMissing",
    "message":"Calling principal does not have required MSGraph permissions Reports.Read.All",
    "innerError": {
      "date":"2021-10-19T01:18:36",
       "request-id":"xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
       "client-request-id":"6b8cc3a3-b93b-44bb-b1d4-190c618aa52a"
    }
  }
}

共有1个答案

邹京
2023-03-14

当我使用Graph Explorer时,只要我在修改权限(预览)选项卡上启用reports.read.all,它就能正常工作。

这是因为Microsoft Graph Explorer是Microsoft的企业应用程序,每个Azure广告租户都有,只需通过提供所需的权限登录并使用即可。

但是在编写运行Powershell脚本时,它使用Microsoft Azure Powershell。您可以通过检查JWT token中接收的access_token来验证它。因此,您需要向您的租户中的相同应用程序提供reports.read.allAPI权限,该租户具有appid:1950A258-227B-4E31-A9CF-717495945FC2in Enterprise Application>>权限,并授予管理员同意。

另一种方法是创建应用程序注册,为其创建客户端机密,然后提供reports.read.allAPI权限,并使用以下脚本:

$TenantName = "tenantname.onmicrosoft.com"
$clientID = "d344e3xxx-xxx-xxxx-xxxx-9c861d363244" # app registration clientId
$clientSecret = "fNc7Q~UNHBgv_xxxxxxxxxxxxxxxxxxxxxx-PD"
$Scope = "https://graph.microsoft.com/.default"
 
$Body = @{
    Grant_Type = "client_credentials"
    Scope = $Scope
    client_Id = $clientID
    Client_Secret = $clientSecret
}
$authUri = "https://login.microsoftonline.com/$TenantName/oauth2/v2.0/token"
  
$TokenResponse = Invoke-RestMethod -Uri $authUri -Method POST -Body $Body

$Headers = @{
        "Authorization" = "Bearer $($TokenResponse.access_token)"
        "Content-type"  = "application/json"
    }
$apiUri = "https://graph.microsoft.com/beta/reports/credentialUserRegistrationDetails"
$response = Invoke-RestMethod -Headers $Headers -Uri $apiUri -Method GET
 
$response.value

产出:

注意:在某些租户中,Microsoft Azure PowerShell可能无法从portal中看到,因此在这种情况下,请使用上面的解决方案会更容易。

 类似资料:
  • 我无法访问托管密钥库中的存储帐户密钥。下面是我的代码: 似乎$secret.secretValueText为空/null。如何正确检索存储帐户密钥?这就是出现的错误。

  • 我的Google API有问题。我希望避免通过浏览器检索我的访问授权。我想将代码直接检索到一个变量中。这是我发送的URL:

  • 我有一个Azure Web角色,有2个实例(注意PaaS角色,*不是Azure虚拟机)。我可以通过远程桌面连接到它们,但我不知道如何在Powershell中进行远程处理(Powershell远程处理),因为与Azure虚拟机云服务不同,无法为每个实例定义endpoint和端口,因为每个工作者角色没有单独的地址。 如何通过Powershell远程处理连接到单个PaaS工作者角色实例?我该如何使用:

  • 问题内容: 我有一个页面,该页面向中的URL 发出JSONP ajax请求(使用jQuery的功能)。我以为(阅读:假定),其中的资源可以在服务器端访问该域中设置的任何cookie,但事实并非如此? 专门执行ajax调用以访问特定的cookie,进行一些数据操作并返回以cookie值为键的丰富信息集。原始域无法直接访问cookie值,因此我认为ajax请求将保持我需要的状态。 我会忽略关于Cook

  • 有个关于 oauth2.0 的问题,我有一个 A公司的 app,里面嵌套一个 B公司 h5 页面,其中 h5 页面要用到A公司 app的用户信息,经过 oauth2.0 拿到App 的 access_token 后,理论上他能调用 A公司app 的全部接口(对于A公司后端来说就是一个普通的用户的token),这个可以预防吗,要怎么限制做到颁发给 A公司的 access_token 只能访问特定的接

  • 问题内容: 我正在寻找一种在Java App(使用JDBC)中打开Access MDB文件的方法。 快速的Google搜索建议我为此需要JDBC-ODBC Bridge。 这是否意味着我需要配置要在其上运行应用程序的每个系统,以便为要打开的MDB提供ODBC DSN? 还有一个问题(因为我以前从未使用过ODBC):通信是通过某种套接字(以客户机/服务器方式)还是通过方法/函数调用(例如嵌入Derb