当前位置:网站首页 > 更多 > 玩电脑 > 正文

[玩转系统] 使用 Invoke-MgGraphRequest 获取 Azure AD LAPS 密码

作者:精品下载站 日期:2024-12-14 06:49:26 浏览:17 分类:玩电脑

使用 Invoke-MgGraphRequest 获取 Azure AD LAPS 密码


Invoke-MgGraphRequest cmdlet 可用于查看由 Intune 使用 PowerShell 管理的设备的 Azure AD LAPS 密码,这是当前唯一的方法。当然,最新版本的 Windows 10/11 中内置的 LAPS 模块包括 Get-LapsAADPassword cmdlet,但是,该 cmdlet 仅引用由 Microsoft 员工构建并在更新期间与 LAPS 模块一起安装的嵌套 PowerShell 脚本,这正是我将在本教程中向您展示如何执行的操作。

因此,在本教程中,我将向您展示如何使用 Invoke-MgGraphRequest cmdlet 通过 PowerShell 向 Microsoft Graph 发送 GET 请求,并在 Intune 中检索托管设备的 LAPS 密码。

先决条件

要完成此任务,您必须在当前用户或所有用户上下文中的系统上安装 Microsoft Graph PowerShell SDK。无论您安装的是哪个版本的 SDK,但是为了一致性和稳定性,我建议您通过运行以下命令来安装最新的稳定版本:

Install-Module Microsoft.Graph -scope Currentuser -Force

这将在当前用户上下文中强制在您的计算机上安装最新稳定版本的 Microsoft Graph PowerShell 模块,这不需要本地管理员权限。

有关安装和升级 Microsoft Graph PowerShell 模块的更详细教程,请在此处查看我的指南:如何安装 Microsoft Graph PowerShell 模块

使用 Invoke-MgGraphRequest 获取 Azure AD LAPS 密码的目的

Invoke-MgGraphRequest 是一个 PowerShell cmdlet,如果尚无支持该任务的 cmdlet,它允许您发出任何/大多数 Microsoft Graph API 请求。

查看:如何将 Invoke-MgGraphRequest 与 PowerShell 结合使用

还值得注意的是,与微软文档详细介绍了使用 Windows 10/11 4 月更新预装的 LAPS 模块来检索 LAPS 密码不同,无需 4 月更新也可以完成此操作。

在幕后,随 Windows 四月更新预装的 LAPS 模块在其中嵌套了一个名为 Get-LapsAADPassword 的脚本模块。这个嵌套模块使用 Microsoft Graph Invoke-MgGraphRequest 的方式与我将向您展示检索 LAPS 密码的方式相同,它只是内置到一个有用的模块中。通过学习如何使用 Invoke-MgGraphRequest 方法获取 LAPS 密码,您可以构建自己的模块,以便以编程方式方便地访问所需的信息。

权限和身份验证

使用此方法查看 LAPS 密码所需的最低权限是 Device.Read.AllDeviceLocalCredential.Read.All 权限。

Device.Read.All 将允许您使用 Get-MgDevice cmdlet 从设备读取信息。这样,您就可以检索 DeviceId 值,您将需要该值来添加 Invoke-MgGraphRequest 命令的 URI(或简单的网址)来查找您的设备。

DeviceLocalCredential.Read.All 权限允许您读取 Intune 托管设备的 LAPS 密码。

此外,为了使该脚本按预期运行,当您运行 Connect-MgGraph cmdlet 时,您将需要使用全局管理员登录。这是因为连接时,需要将指定的权限委派给 Azure Active Directory 中的 Microsoft Graph 命令行工具应用,这只能由全局管理员完成。

如何使用 Invoke-MgGraphRequest 获取 Azure AD LAPS 密码 - 细分

首先使用 Connect-MgGraph cmdlet 连接到 Microsoft Graph,并指定您希望同意的权限:

Connect-Mggraph -Scope DeviceLocalCredential.Read.All, Device.Read.All

您可以使用 Get-MgContext cmdlet 验证您的会话是否被适当分配了正确的权限:

[玩转系统] 使用 Invoke-MgGraphRequest 获取 Azure AD LAPS 密码

现在已完成,我们需要从 Intune 中的目标设备检索 DeviceId 值,以便我们可以在脚本中进一步重用它。我们使用 Get-MgDevice cmdlet 来执行此操作,这就是需要 Device.Read.All 权限的原因。

$DeviceName = "Win11Desktop02"
$DeviceId = (Get-MgDevice | Where-Object {$_.DisplayName -eq $DeviceName} | Select DeviceId).DeviceId

然后,我们需要生成一个新的、唯一的相关 ID,该 ID 将添加到我们的请求标头中。然后,这将用于识别跨多个服务的请求的上下文。

$correlationID = [System.Guid]::NewGuid()

URI(通用资源标识符)是一个地址路径,它将指定在何处可以找到特定资源,在本例中是在 Microsoft Graph 中。我们的 URI 将包含所需信息类型的路径以及我们需要 LAPS 密码的对象的唯一 DeviceId。

$uri = 'beta/deviceLocalCredentials/' + $DeviceId
$uri = $uri + '?$select=credentials'

现在我们需要构建请求的标头,让我们看看添加到标头中的每一位信息:

  • ocp-client-name - 此标头是执行 API 调用的应用程序的名称。它是可选的,但将有助于识别任何问题(如果有)。
  • ocp-client-version - 同样,此值是可选的,如果您正在管理 PowerShell 脚本/应用程序的版本历史记录,它将有助于调试。
  • Client-request-id - 这也将有助于调试,如果您希望寻求 Microsoft 支持来帮助解决您的问题,则这是必要的。

使用以下代码在 $header 变量中构建标头:

$headers = @{}
$headers.Add('ocp-client-name', 'Get-LapsAADPassword Windows LAPS Cmdlet')
$headers.Add('ocp-client-version', '1.0')
$headers.Add('client-request-id', $correlationID)

现在我们已准备好将请求发送到 Microsoft Graph。使用以下Invoke-MgGraphRequest命令和GET方法来查询图形API,然后我们将响应保存在$Response变量中。

$Response = Invoke-MgGraphRequest -Method GET -Uri $URI -Headers $headers

要检查我们的请求是否返回了预期的信息,请在命令行中输入 $Response$Response.Credentials,输出应如下所示:

[玩转系统] 使用 Invoke-MgGraphRequest 获取 Azure AD LAPS 密码

由于我们的 LAPS 帐户的密码是采用 Base64 编码的,因此我们必须将其解码为纯文本。这可以在我们的 PowerShell 脚本中使用以下命令轻松完成:

$passwordb64 = ($Response.credentials).PasswordBase64
$passwordb64 | %{[Text.Encoding]::UTF8.GetString([Convert]::FromBase64String($_))}

您的输出将如下所示:

[玩转系统] 使用 Invoke-MgGraphRequest 获取 Azure AD LAPS 密码

完整剧本

您可以在下面轻松地将我的代码复制并粘贴到文本编辑器中,更改 $devicename 值并使用 PowerShell 运行脚本来检索设备的圈数密码。

您还可以下载我在 Github 上编写的此脚本的更详细版本,该版本可以作为完整脚本运行,并将设备名称作为参数。

#Connect to Microsoft Graph
Connect-Mggraph -Scope DeviceLocalCredential.Read.All, Device.Read.All

#Define your device name here
$DeviceName = "Win11Desktop02"
#Store the device id value for your target device
$DeviceId = (Get-MgDevice | Where-Object {$_.DisplayName -eq $DeviceName} | Select DeviceId).DeviceId

#Generate a new correlation ID
$correlationID = [System.Guid]::NewGuid()

#Define the URI path
$uri = 'beta/deviceLocalCredentials/' + $DeviceId
$uri = $uri + '?$select=credentials'

#Build the request header
$headers = @{}
$headers.Add('ocp-client-name', 'Get-LapsAADPassword Windows LAPS Cmdlet')
$headers.Add('ocp-client-version', '1.0')
$headers.Add('client-request-id', $correlationID)

#Initation the request to Microsoft Graph for the LAPS password
$Response = Invoke-MgGraphRequest -Method GET -Uri $URI -Headers $headers

#Decode the LAPS password from Base64
$passwordb64 = ($Response.credentials).PasswordBase64
$passwordb64 | %{[Text.Encoding]::UTF8.GetString([Convert]::FromBase64String($_))}

您需要 登录账户 后才能发表评论

取消回复欢迎 发表评论:

关灯