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

[玩转系统] 使用 PowerShell 查找 Entra ID 用户

作者:精品下载站 日期:2024-12-14 04:09:37 浏览:15 分类:玩电脑

使用 PowerShell 查找 Entra ID 用户


使用过滤器来定位邮箱和 Entra ID 用户帐户

PowerShell 脚本通常首先查找一组要处理的 Entra ID 用户帐户或 Exchange 邮箱。经典方法是运行 Get-ExoMailboxGet-MgUser 之类的 cmdlet 来查找所需的对象。然而,当您尝试检索最佳集时,事情可能会变得有点复杂。例如:

  • 仅用户邮箱(不包括共享邮箱和房间邮箱)。
  • 仅许可帐户(重点关注已分配许可证以使用 Microsoft 365 服务的用户帐户)。

第一组很容易找到:

[array]$Mailboxes = Get-ExoMailbox -RecipientTypeDetails UserMailbox -ResultSize Unlimited

第二个是:

[array]$Users = Get-MgUser -Filter "assignedLicenses/`$count ne 0 and userType eq 'Member'" -ConsistencyLevel eventual -CountVariable Records -All -Property Id, displayName, AssignedLicenses

后一个示例的语法更加复杂,因为它使用图形过滤器来查找至少具有一个许可证(计数大于 0)且属于租户成员(非来宾)的帐户。这也是 Microsoft 所说的针对 Entra ID 对象的高级查询,这就是存在一致性级别参数的原因。

问题是共享邮箱和房间邮箱使用的帐户可以拥有许可证。共享邮箱需要许可证才能使用存档或增加邮箱配额,而会议室邮箱在由 Teams Rooms 设备使用时需要许可证。您的脚本可能不一定要处理这些帐户,因为其目的是处理人类而不是房间或设备拥有的帐户。

创建共享邮箱和房间邮箱数组后,可以轻松过滤用户数组以删除不在该数组中的帐户:

[array]$NonUserAccounts = Get-ExoMailbox -RecipientTypeDetails SharedMailbox, RoomMailbox -ResultSize Unlimited | Select-Object UserPrincipalName, ExternalDirectoryObjectId
Write-Host "Removing non-user accounts from set to be processed..."
$Users = $Users | Where-Object {$_.Id -notin $NonUserAccounts.ExternalDirectoryObjectId}

结果是一个包含人类许可用户帐户的数组。我在脚本中使用此技术来创建经理及其直接报告的 HTML 报告。

查找员工的用户帐户

Entra ID 包括员工数据的多个属性。三个重要属性是:

  • EmployeeId:包含组织分配的员工标识符的字符串值。通常这是一个数字。
  • EmployeeHireDate:员工加入组织的日期值。
  • EmployeeType:指示员工类型的字符串值。例如,您可以在此属性中存储“临时”、“永久”和“兼职”等值。

员工属性不是图表返回的默认集的一部分。您可以像平常一样过滤属性,但如果您想查看数据,则必须在图形请求中指定属性。例如,此 Get-MgUser 命令查找 EmployeeId 属性中具有某些值的成员帐户,而不在图表返回的数据中包含该属性的值。与空间的比较是使用图表时需要了解的缺点之一。

[array]$Employees = Get-MgUser -filter "userType eq 'Member' and EmployeeId ge ' '"
$Employees | Format-Table DisplayName, EmployeeId

DisplayName  EmployeeId
-----------  ----------
Rene Artois
Tony Redmond

要查看员工数据,请指定要返回的调用的属性:

[array]$Employees = Get-MgUser -filter "userType eq 'Member' and EmployeeId ge ' '" -Property Id, displayname, userprincipalname, employeeid, employeehiredate, employeetype

$Employees | Format-Table DisplayName, EmployeeId, EmployeeType, EmployeeHireDate

DisplayName  EmployeeId EmployeeType EmployeeHireDate
-----------  ---------- ------------ ----------------
Rene Artois  111888     Permanent    08/03/2018 00:00:00
Tony Redmond 150847     Permanent    01/01/2011 00:00:00

不幸的是,图表不支持根据员工类型或员工雇用日期属性进行过滤(请参阅此页面以供参考)。如果您想根据雇用日期进行过滤,请创建如上所示的员工数组,并使用客户端过滤器。例如,此代码查找过去十年内雇用的员工:

$CheckDate = (Get-Date).AddDays(-3650)
$Employees | Where-Object {$CheckDate -as [datetime] -lt $_.EmployeeHireDate}

虽然此命令会查找员工类型标记为永久的帐户。

$Employees | Where-Object {$_.EmployeeType -eq "Permanent"}

您还需要一个客户端过滤器来使用 PowerShell 中提供的 like、match 和其他比较运算符。评估用户帐户时,图形请求仅限于 eqandorstartswith

查找具有 Exchange 自定义属性的用户帐户

对 Entra ID 使用任何查询都取决于查询属性中的准确数据。我的经验是,填充 Entra ID 中可用的员工属性的 Microsoft 365 租户相对较少。这可能是因为许多组织是混合组织,或者有其他原因不使用员工属性(例如不知道它们是否可用),或者正在使用其他方案。例如,使用 Active Directory 和 Exchange Server 的组织有时会通过在自定义(扩展)属性中存储值来标记“人类”帐户。该属性可能存储员工、临时、顾问和服务帐户等值来指示帐户的用途。此示例查找许可的用户帐户,其中 ExtensionAttribute2 存储“Employee”以标记属于人类的帐户。

[array]$EmployeeAccounts = Get-MgUser -Filter "onPremisesExtensionAttributes/extensionAttribute2 eq 'Employee' and assignedLicenses/`$count ne 0 and userType eq 'Member'" -ConsistencyLevel eventual -CountVariable Records -All

如果您的组织使用 Exchange 自定义属性来存储员工信息,则没有充分的理由改用 Entra ID 属性,除非您想要或需要将 Exchange 属性用于其他目的。切换只需从 Exchange Online 读取属性并将其写入 Entra ID,因此非常简单。下面是一些简单的代码,说明如何从 Exchange Online 获取员工详细信息并将其写入用户的帐户。 EmployeeType 的值取自 CustomAttribute2,而 EmployeeHireDate 的值则来自邮箱的创建日期。

[array]$Mailboxes = Get-ExoMailbox -RecipientTypeDetails UserMailbox -ResultSize Unlimited -Properties CustomAttribute2, WhenCreated
ForEach ($Mbx in $Mailboxes) {
   Update-MgUser -UserId $Mbx.ExternalDirectoryObjectId -EmployeeType $Mbx.CustomAttribute2 -EmployeeHireDate (Get-Date($Mbx.WhenCreated))
}

分割处理

有时,一个组织跨多个帐户,需要很长时间才能获取所有帐户。在这些情况下,您可以通过将帐户划分为方便的组来拆分处理。有的人用部门作为处理依据,有的人用国家作为处理依据。在此示例中,我们根据姓氏获取许可的用户帐户。图 1 显示了结果。

[array]$Surnames = "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "W", "X", "Y", "Z"
ForEach ($S in $Surnames) {
  $Filter = "assignedLicenses/`$count ne 0 and userType eq 'Member' and startsWith(surname,('$S'))"
  [array]$Users = Get-MgUser -Filter $Filter -ConsistencyLevel eventual -CountVariable Records -All
  If ($Users) {
     Write-Host ("{0} users have surname starting with {1}" -f $Users.count, $S)
     Write-Host  "---------------------------------------------"
     $Users | Format-Table DisplayName, Surname
     Write-Host ""
 } Else {
     Write-Host ("No users found with surname starting with {0}" -f $S)
 }
}

[玩转系统] 使用 PowerShell 查找 Entra ID 用户

过渡的一部分

进行有效的调用来查找邮箱和/或用户帐户可能是 PowerShell 脚本的成败的关键。从已弃用的 Azure AD 模块到 Graph API 或 Graph SDK 命令的转换引入了一种新的筛选器格式,该格式更难使用,并且缺乏通过标准 PowerShell 比较运算符提供的一些灵活性。更新脚本以使用图表有时可能具有挑战性,但看待事物的积极方式是它提供了提高代码效率的机会。对于中小型组织来说,这并不重要,但在管理数以万计的帐户或邮箱时,它会产生巨大的差异。

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

取消回复欢迎 发表评论:

关灯