在PowerShell中使用Get-AdGroupMember生成报告

A popular use of PowerShell is working with Active Directory Directory Services (AD). There are so many time-saving things PowerShell can do with AD objects. Using the PowerShell Get-ADGroupMember cmdlet and other cmdlets can save you a ton of time.

Active Directory组是分段用户帐户的好方法。组允许管理员跨多个系统定义资源访问。

在本文中,让我们使用PowerShell获取AD组成员并导出AD组成员。然后,您可以使用此信息生成大量有趣的报告。

Active Directory group

使用ManageEngine ADManager Plus管理和报告Active Directory、Exchange和Microsoft 365。免费试用!

先决条件

如果您想在本文中跟着做,请确保您已准备好以下要求:

学习基础知识

要查询AD组和组成员,您可以使用两个PowerShell cmdlet: Get-AdGroupGet-AdGroupMember

Get-ADGroup 查询域控制器并返回AD组对象。Get-AdGroupMember 查看每个组并返回所有用户帐户、组、联系人和其他存在于该组中的对象。

获取AD组

要使用PowerShell查找AD组,您可以使用Get-ADGroup 命令。没有参数时,Get-ADGroup 将使用Filter 参数查询AD并返回域中的所有 组。Filter 参数是必需的。它存在以根据各种条件限制返回的组。

例如,要查找所有组而不考虑任何条件,可以使用Get-ADGroup 并为Filter 参数指定通配符(星号)。您可以在下面看到一个示例。如果您的域中有数百甚至数千个组,则浏览所有这些组可能需要一些时间。

Get-ADGroup -Filter *

如果您需要找到单个组,可以使用Identity 参数。

Identity 参数是所有Active Directory PowerShell cmdlet中的常见参数。它允许您将查询限制到单个AD对象。例如,如果您需要检查是否存在一个名为HR 的组,可以通过运行下面的命令来查找。

Get-ADGroup -Identity 'HR'

使用Get-AdGroupMember获取AD组成员

使用 PowerShell 列出 AD 组成员需要使用 Get-ADGroupMember cmdlet。此 cmdlet 获取特定组中的用户、组和计算机对象。也许你需要找到 Administrators 组的所有成员。在其最简单的形式中,你只需再次使用 Identity 参数,并指定组名如下。

Get-ADGroupMember -Identity 'Administrators'

请注意,Get-AdGroupMember 仅返回用户、组和计算机的组成员。它不会返回其他 AD 对象,如联系人。

列举组成员中的组成员

你可能知道,AD 组不仅可以包含用户帐户,还可以包含其他组,也称为嵌套。当一个组嵌套在另一个组内时,该组的成员会继承分配给父组的相同权限。

默认情况下,PowerShell 的 Get-AdGroupMember cmdlet 不会返回嵌套组成员。为了解决这个问题,你可以使用 Recursive 参数。例如,你可以使用下面所示的 Recursive 参数查找嵌套在 HR 组内的组成员。

Get-ADGroupMember -Identity 'HR' -Recursive

一次获取多个组/成员

如果您需要一次查询多个不同组或组成员的AD,您也可以使用 PowerShell 的 foreach 循环。foreach 循环对集合中的每个项目运行一个命令或代码。在这种情况下,该集合将是一个组名称列表。

也许您需要找到 HR会计IT 组中的所有成员。为此,您首先需要创建这些组名称的集合或数组。下面的示例将此集合定义为 $groupNames。然后,对该集合中的每个名称运行 Get-ADGroupMember,并将每个组的名称提供给 Identity 参数。

$groupNames = 'HR','Accounting','IT'
foreach ($group in $groupNames) {
    Get-ADGroupMember -Identity $group
}

您也可以使用 ForEach-Object cmdlet 循环遍历组。

使用备用凭据

像许多其他 PowerShell cmdlet 一样,AD 组 cmdlet 具有一个 Credential 参数。默认情况下,每当您运行 AD 组 cmdlet 时,它都会使用您登录的凭据来查询 Active Directory。这种行为要求您必须登录到域加入的计算机上,并以具有权限的 Active Directory 用户身份登录。

但如果您在工作组计算机上,或需要以不同的用户身份进行AD身份验证怎么办?在这种情况下,您可以使用Credential参数。该参数允许您指定用于身份验证的用户名和密码。

例如,也许您的用户帐户没有执行AD任务的权限。您有一个具有附加权限的服务帐户。您可以以标准用户身份登录,但仍然可以使用服务帐户进行身份验证,如下所示。

Get-Credential cmdlet提示输入用户名/密码以创建凭据。然后将此凭据传递给Get-AdGroup cmdlet进行身份验证。

Get-ADGroup -Identity 'HR' -Credential (Get-Credential)

Credential参数在PowerShell中提供身份验证凭据时非常常见。有关更多信息,请阅读使用PowerShell Get-Credential cmdlet和所有凭据相关的事项

使用Get-ADGroup获取组成员?

听起来可能有些违反直觉,但您也可以使用Get-ADGroup cmdlet获取组成员。

事实证明,Get-ADGroup返回每个组的一个名为members的属性。这是一个包含组成员的AD对象集合。

例如,要再次查找HR组中的组成员,而不使用Get-ADGroupMember,您可以执行以下操作:

Get-ADGroup -Identity 'HR' -Properties members

为什么选择这种方法而不是其他方法?主要区别在于members属性包含所有类型的AD对象 – 不仅仅是用户、计算机和其他组。

也许您在各种组织内有联系人。当您运行Get-ADGroupMember时,这些联系人将不会显示出来。但是,如果您告诉Get-ADGroup返回该组中的所有成员,并展开如下所示的集合,您将看到这些联系人。

Get-ADGroup -Identity 'HR' -Properties members | Select-Object -ExpandProperty members

查找特定的AD属性

在上面的基础部分,您只是返回所有组和组成员。对于每个组和组成员返回的信息只是与每种类型的对象关联的AD属性的子集。

也许您想要查看用户帐户的电子邮件地址、最后登录日期或其他相关的AD属性?为此,您需要发挥创意。

也许您能够找到HR组中的所有成员,但需要查看每个用户帐户的电子邮件地址?

$groupMembers = (Get-ADGroup -Identity 'HR' -Properties members).members
$groupMembers | Select-Object -Property Name, @{Name='Member';exp={Get-AdUser -Identity $_.Name -Properties emailAddress,lastlogonDate}}

过滤结果

到目前为止,您已经找到了所有组和组成员,但在日常工作环境中,您很少需要这样做。很可能,您只需要找到每个项目的有限数量。AD组命令有一些方法可以处理这个问题。

Filter参数

如前所述,这两个cmdlet都有Filter参数。此参数允许您以许多不同的方式限制返回的内容,超出了本文的范围。

使用Filter参数,您可以按任何AD属性(如名称、组类型、电子邮件地址、用户上次登录时间等)限制结果。

例如,也许您只想查找安全组。在这种情况下,您会指定一个GroupCategory属性,并设置一个条件以确保只返回Security组。

Get-ADGroup -Filter 'GroupCategory -eq "Security"'

也许您想要找到所有安全组,但它们必须是域本地组。然后,您会添加另一个条件(这次使用-ne运算符),以防止返回任何域本地组。

Get-ADGroup -Filter 'GroupCategory -eq "Security" -and GroupScope -ne "DomainLocal"'

如果您想学习如何创建查询过滤器,请务必查看PowerShell中的Active Directory和LDAP过滤器入门

通过组织单位(OU)限制组结果

也许您在OU中嵌套了各种组。您不一定想找到所有组,而只想找到特定OU中的组。在这种情况下,您可以使用SearchBase参数。

SearchBase参数允许您指定OU的分立名称(DN),以开始搜索其中的组。例如,也许您在域的根目录下有一个名为Locations的OU。在Locations OU中,您已经创建了每个位置OU,如AustinNYCLos Angeles。您只想要在NYC OU中查找组,并且需要限制看到其他位置。

下面显示了一个示例AD OU结构。请注意,其他组存在于Locations OU之外。

company.local
- Locations
  - Austin
  - NYC
    - Group 1
    - Group 2
  - Los Angeles
- Computers
  - Group 3
  - Group 4
- Service Accounts

也许你需要找出所有仅在NYC组织单位中的AD组。为了限制查询,你可以使用SearchBase参数,并提供如下的DN。所有在Locations组织单位内的组都会被返回。

Get-ADGroup -Filter '*' -SearchBase 'OU=Locations,OU=NYC,DC=company,DC=pri'

但现在你需要找出所有所有Locations组织单位下的组。Get-ADGroup只会返回在Locations组织单位本身的组 – 而不会返回子组织单位中的组。

要返回子组织单位中的组,你需要使用SearchScope参数。该参数类似于Recursive参数,因为它也会检查子对象。

例如,要查找Locations组织单位下任何组织单位中的所有组,请指定Subtree2。对于SearchScope的这个值告诉Get-ADGroup递归地查看所有子组、孙子组等组织单位。

Get-ADGroup -Filter '*' -SearchBase 'OU=Locations,DC=company,DC=pri' -SearchScope 2

关于SearchScope参数选项的完整说明,请参考Get-ADGroup文档。

导出AD组和成员

现在你终于知道如何查询并返回所需的组和组成员。所有这些信息都会发送到PowerShell控制台。但现在你需要将这些信息导出到CSV文件或Excel工作表中。

你现在需要做的唯一一件事就是将所有信息发送到一个文件中。

导出到CSV

将AD信息导出为CSV的一种流行格式。PowerShell有一个方便的命令,允许你轻松地从PowerShell输出中创建CSV文件,称为Export-Csv

您可以通过将任何本文涵盖的命令导入Export-Csv来创建CSV文件。使用以下示例,将Get-AdGroup命令返回的所有输出重定向到控制台,而不是CSV文件。

Get-ADGroup -Filter '*' -SearchBase 'OU=Locations,DC=company,DC=pri' -SearchScope 2 | Export-Csv -Path 'departmental_groups.csv' -NoTypeInformation

有关此实用命令的更多信息,请查看Export-Csv:将PowerShell中的CSV文件视为一等公民的方法

您还可以通过Get-AdGroupMember命令轻松导出结果到CSV。

导出到Excel

PowerShell没有将信息导出到Excel的原生方式。但是,您始终可以下载名为ImportExcel的免费社区模块。该模块将类似CSV的导出功能直接提供给Excel工作表。要安装PowerShell模块,请运行Install-Module ImportExcel -Scope CurrentUser

使用上述示例,如果您需要将组导出到Excel工作表而不是CSV文件,则可以使用如下所示的Export-Excel命令。

通过检查NCSC密码列表来查找活动目录中的泄露和不安全密码。

Get-ADGroup -Filter '*' -SearchBase 'OU=Locations,DC=company,DC=pri' -SearchScope 2 | Export-Excel -Path 'departmental_groups.csv'

ImportExcel模块具有丰富的功能,可用于处理Excel。如果您需要更复杂的工作表,它可能有适合您的功能。

有关使用ImportExcel模块的更多信息,请阅读本文。它对其可以处理的一些常见用例进行了很好的介绍。

使用ManageEngine ADManager Plus管理和报告Active Directory、Exchange和Microsoft 365。免费试用!

结论

只需使用两个PowerShell cmdlet,您几乎可以处理AD组的任何操作。本文只是介绍了可用于您的功能的一部分。利用此处收集的知识,跟随文章中的一些链接深入了解更多主题,并看看您能构建什么!

Source:
https://adamtheautomator.com/get-adgroupmember/