Microsoft Graph API 是一個服務,允許您在單一的 REST API 端點下讀取、修改和管理幾乎所有 Azure AD 和 Office 365 的方面。在本文中,我們將學習如何將您的 API 轉換為 PowerShell Graph API。
先決條件
如果您想跟隨本文一起進行,請確保您首先滿足以下條件:
- 運行 Windows PowerShell 5.1(這是我測試過的版本。其他版本可能也可以使用,但不能保證)
- 擁有 Azure 租戶
- 使用具有全域管理員權限或應用程式註冊權限的帳戶在 Azure 中進行身份驗證,並使用全域管理員接受您的應用程式註冊請求。
為 Microsoft Graph API 創建應用程式身份
要訪問 Microsoft Graph API,您首先需要一個身份來獲取 OAuth 權杖。這主要是通過在 Azure Portal 中創建應用程式身份來完成的。您可以通過 Azure Portal 創建應用程式身份。操作如下:
- 前往 Azure Portal,然後轉到 Azure Active Directory。
- 在左側菜單的 管理 下,點擊 應用程式註冊,然後點擊 新註冊 按鈕。

- 輸入應用程式的名稱,然後點擊 註冊。
- 複製應用程式 ID GUID,以便稍後使用。

為 Microsoft Graph API 創建密鑰
您可以使用两种主要方法对Graph API进行身份验证:AppId/Secret和基于证书的身份验证。连接到PowerShell的Graph API时,您需要进行身份验证。
让我们来介绍如何使用这两种方法进行身份验证。
AppId/Secret
应用程序ID/密钥就像普通的用户名/密码一样。应用程序ID由GUID组成,而密码只是一个随机字符串。
要创建一个密钥-点击左侧菜单中的

输入密钥的描述,并选择它何时过期。现在只需要请求权限,以便您可以访问所需的数据。
证书
有可能创建自签名证书并将其公钥上传到Azure。这是首选且更安全的身份验证方式。
首先,您需要生成一个自签名证书。幸运的是,使用PowerShell可以轻松完成这个过程。
現在,通過點擊左側菜單中的證書和密鑰,然後按下上傳證書,將自簽名證書上傳到您的Azure應用程序中,上傳到$CerOutputPath
。

添加應用程序的權限
為應用程序分配適當的權限非常重要-不僅對您的應用程序的功能而言,對於安全性也是如此。您可以在文檔中找到有關此和(幾乎)Microsoft Graph API 中的所有其他信息。
一旦我設置好了,我就會收集我的租戶中的所有安全事件。為了被允許這樣做,我需要至少具備SecurityEvents.Read.All的權限。有了這個權限,我可以收集並對不可能的旅行事件、通過VPN/TOR連接的用戶等進行操作。
要將SecurityEvents.Read.All添加到應用程序中,請點擊API權限,然後選擇添加權限。這將顯示出不僅是Graph API,還有許多其他應用程序在Azure上。一旦您知道如何連接到Microsoft Graph API,大多數這些應用程序都很容易連接。
點擊Microsoft Graph > 應用程序權限 > 安全事件,並選中SecurityEvents.Read.All。然後按下添加權限按鈕。
您是否看到該權限的需要管理員同意列被設置為是?這意味著租戶管理員需要在將權限添加到應用程序之前進行批准。

如果您是全局管理員,請按下為的管理員授予同意,或者請求全局管理員批准。與管理員設置讀/寫權限相比,向用戶請求權限而不是向管理員請求權限是OAuth身份驗證的重要部分。但這使我們能夠繞過Microsoft Graph中的大多數權限。
您可能已經在Facebook或Google上看到過這個提示:“您允許應用程序X訪問您的個人資料嗎?”

現在您已經準備好了,讓我們登錄並獲取一些數據!
獲取存取權杖(應用程式識別碼和密鑰)
為此,我們需要向 Microsoft Graph OAuth 端點發送請求以獲取存取權杖。在該請求的主體中,我們需要提供:
client_id
– 您的應用程式識別碼 – 網址編碼client_secret
– 您的應用程式密鑰 – 網址編碼scope
– 指定您要存取的網址的網址編碼grant_type
– 您正在使用的驗證方法
端點的 URL 為 https://login.microsoftonline.com/<tenantname>/oauth2/v2.0/token。您可以使用以下程式碼片段使用 PowerShell 和 Graph API 請求存取權杖。
獲取存取權杖(使用憑證)
使用憑證進行 Microsoft Graph API 的身分驗證與正常的 AppId/Secret 流程略有不同。若要使用憑證獲取存取權杖,您需要:
- 創建一個Java Web Token(JWT)標頭。
- 創建一個JWT有效負載。
- 使用之前創建的自簽名憑證對JWT標頭和有效負載進行簽名。這將創建一個自製的訪問權杖,用於請求Microsoft Graph訪問權杖。
- 創建一個包含以下內容的請求主體:
client_id=<應用程序ID>
client_assertion=<JWT>
client_assertion_type=urn:ietf:params:oauth:client-assertion-type:jwt-bearer
scope=<URL編碼的範圍>
grant_type=client_credentials
- 使用主體進行POST請求到oauth端點,其標頭中包含
Authorization=<JWT>
。
在Microsoft的文檔中並不明顯,但這是實現此操作的PowerShell腳本:
理解请求访问令牌的输出
一旦通过应用程序ID/密钥或证书获得访问令牌,您应该看到一个具有四个属性的对象。
token_type
– 令牌类型expires_in
– 访问令牌的有效秒数ext_expires_in
– 与expires_in
类似,但用于处理令牌服务中断的情况access_token
– 我们需要的令牌
接下来,您将使用token_type
和access_token
创建一个标头,并开始使用PowerShell向Microsoft Graph API发出请求。
向Microsoft Powershell Graph API发出请求
现在开始向API发出一些请求。
按照我们的示例,您首先需要获取列出安全警报的URL。请记住使用Microsoft Graph API文档查看所需内容。
在这种情况下,您需要一个带有Authorization=Bearer <access_token>
的标头,并向Graph API Alerts端点发送GET请求。以下是使用PowerShell执行此操作的方法。
如果您在$SecurityAlerts
变量中有任何安全警报,则应该看起来像这样:
檢查單個安全警報的JSON如下所示:
了解和管理API輸出分頁
Microsoft Graph API對返回的項目數量有限制。這個限制是每個函數的,假設限制為1000個項目。這意味著在您的請求中最多只能獲取1000個項目。
當達到這個限制時,它將使用分頁來提供其餘的項目。它通過將@odata.nextLink
屬性添加到您的請求的答案中來實現此目的。@odata.nextLink
包含一個URL,您可以調用該URL以獲取您的請求的下一頁。
通過檢查此屬性並使用循環,您可以遍歷所有項目:
結論
在學會如何對Graph API進行身份驗證之後,從中收集數據就變得相當容易。這是一個功能強大的服務,但使用它的人數遠遠不足。
幸運的是,已經有許多模塊可用來利用Microsoft Graph API,但為了滿足自己的需求,您可能需要為其創建自己的模塊。使用本文中所學的技巧,您應該可以很好地開展工作。
有關在Office 365中控制訪客訪問權限的更多信息,我在我的博客上寫了一篇詳細的文章,我鼓勵您去查看一下。