使用PowerShell访问Microsoft Graph

时间:2018-01-31 17:11:35

标签: powershell microsoft-graph

我一直在尝试使用PowerShell访问Microsoft Graph。

首先,我尝试使用authorization flowInvoke-WebRequest以及Invoke-RestMethod这两项工作都没有。

然后我发现this blog显示了如何使用PowerShell和一些Azure模块来完成它。下面是我使用的代码(从该博客直接翻录),但每次我到达Invoke-RestMethod(在do-while循环中)而不是获取查询结果时,我得到一个{{ 1}}:

  

Invoke-RestMethod:远程服务器返回错误:(403)Forbidden。

403 Forbidden error

我可以从图形资源管理器中运行相同的查询(Function GetAuthToken { Param ( [Parameter()] $TenantName ) Import-Module Azure $clientId = "1950a258-227b-4e31-a9cf-717495945fc2" $resourceAppIdURI = "https://graph.microsoft.com" $authority = "https://login.microsoftonline.com/$TenantName" $authContext = New-Object "Microsoft.IdentityModel.Clients.ActiveDirectory.AuthenticationContext" -ArgumentList $authority $Credential = Get-Credential $AADCredentialUser = New-Object "Microsoft.IdentityModel.Clients.ActiveDirectory.UserCredential" -ArgumentList $credential.UserName, $credential.Password $authResult = $authContext.AcquireToken($resourceAppIdURI, $clientId, $AADCredentialUser) Write-Output $authResult } Function GetAllObjectOfType { param ( [Parameter(Mandatory = $true)] $Tenant, [Parameter(Mandatory = $true)] $Type, [Parameter(Mandatory = $false)] $BatchSize = 100, [Parameter(Mandatory = $false)] $Version = 'Beta' ) #------Get the authorization token------# $token = GetAuthToken -TenantName $tenant #------Building Rest Api header with authorization token------# $authHeader = @{ 'Content-Type' = 'application/json' 'Authorization' = $token.CreateAuthorizationHeader() } #------Initial URI Construction------# #$uritest = "https://graph.microsoft.com/v1.0/users/user@contoso.com/mailFolders/Inbox/childFolders" $uritest = "https://graph.microsoft.com/v1.0/me/mailFolders/Inbox" #Join-Path -Path '' $ObjCapture = @() do { $users = Invoke-RestMethod -Uri $uritest -Headers $authHeader -Method Get $FoundUsers = ($Users.value).count write-host "URI" $uri " | Found:" $FoundUsers #------Batched URI Construction------# $uri = $users.'@odata.nextlink' $ObjCapture = $ObjCapture + $users.value }until ($uri -eq $null) $ObjCapture } ),它运行完美,没有错误。

/v1.0/me/mailFolders/Inbox似乎正在工作,因为我得到一个带有过期,刷新令牌等的令牌,而GetAuthToken也会返回正确的$token.CreateAuthorizationHeader()

我以前从未对Microsoft Graph做过任何事情,所以我确定有些事情我做错了,但我不能为我的生活弄清楚是什么。

3 个答案:

答案 0 :(得分:2)

您无法重复该博文中的clientid。您需要通过注册申请来获得自己的clientid。有关如何注册应用的详细信息,请参阅Register your app with the Azure AD v2.0 endpoint

答案 1 :(得分:0)

似乎是在同一来源的follow-up blog post中得到了答复。

  

创建应用后,默认情况下,该应用有权访问仅以下内容的数据:   通过“登录并读取用户”登录帐户的用户   个人资料”委派的权限。如果您尝试执行使用此脚本   AppID / ClientID来查询Azure AD以获取目录中所有用户的列表,   您会收到一条错误消息,指出(403)禁止,因为它没有   足够的权限来执行该活动。

答案 2 :(得分:-1)

我认为它需要AD Azure Premium 2许可证 enter link description here