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组成员。然后,您可以使用此信息生成大量有趣的报告。

使用ManageEngine ADManager Plus管理和报告Active Directory、Exchange和Microsoft 365。免费试用!
先决条件
如果您想在本文中跟着做,请确保您已准备好以下要求:
- 在Windows 10上工作,已加入域的计算机
- 以可以读取AD组和用户帐户的用户登录
- 已安装PowerShell Active Directory模块
学习基础知识
要查询AD组和组成员,您可以使用两个PowerShell cmdlet: Get-AdGroup
和 Get-AdGroupMember
。
Get-ADGroup
查询域控制器并返回AD组对象。Get-AdGroupMember
查看每个组并返回所有用户帐户、组、联系人和其他存在于该组中的对象。
获取AD组
要使用PowerShell查找AD组,您可以使用Get-ADGroup
命令。没有参数时,Get-ADGroup
将使用Filter
参数查询AD并返回域中的所有 组。Filter
参数是必需的。它存在以根据各种条件限制返回的组。
例如,要查找所有组而不考虑任何条件,可以使用Get-ADGroup
并为Filter
参数指定通配符(星号)。您可以在下面看到一个示例。如果您的域中有数百甚至数千个组,则浏览所有这些组可能需要一些时间。
如果您需要找到单个组,可以使用Identity
参数。
Identity
参数是所有Active Directory PowerShell cmdlet中的常见参数。它允许您将查询限制到单个AD对象。例如,如果您需要检查是否存在一个名为HR 的组,可以通过运行下面的命令来查找。
使用Get-AdGroupMember获取AD组成员
使用 PowerShell 列出 AD 组成员需要使用 Get-ADGroupMember
cmdlet。此 cmdlet 获取特定组中的用户、组和计算机对象。也许你需要找到 Administrators 组的所有成员。在其最简单的形式中,你只需再次使用 Identity
参数,并指定组名如下。
请注意,
Get-AdGroupMember
仅返回用户、组和计算机的组成员。它不会返回其他 AD 对象,如联系人。
列举组成员中的组成员
你可能知道,AD 组不仅可以包含用户帐户,还可以包含其他组,也称为嵌套。当一个组嵌套在另一个组内时,该组的成员会继承分配给父组的相同权限。
默认情况下,PowerShell 的 Get-AdGroupMember
cmdlet 不会返回嵌套组成员。为了解决这个问题,你可以使用 Recursive
参数。例如,你可以使用下面所示的 Recursive
参数查找嵌套在 HR 组内的组成员。
一次获取多个组/成员
如果您需要一次查询多个不同组或组成员的AD,您也可以使用 PowerShell 的 foreach 循环。foreach 循环对集合中的每个项目运行一个命令或代码。在这种情况下,该集合将是一个组名称列表。
也许您需要找到 HR、会计 和 IT 组中的所有成员。为此,您首先需要创建这些组名称的集合或数组。下面的示例将此集合定义为 $groupNames
。然后,对该集合中的每个名称运行 Get-ADGroupMember
,并将每个组的名称提供给 Identity
参数。
您也可以使用
ForEach-Object
cmdlet 循环遍历组。
使用备用凭据
像许多其他 PowerShell cmdlet 一样,AD 组 cmdlet 具有一个 Credential
参数。默认情况下,每当您运行 AD 组 cmdlet 时,它都会使用您登录的凭据来查询 Active Directory。这种行为要求您必须登录到域加入的计算机上,并以具有权限的 Active Directory 用户身份登录。
但如果您在工作组计算机上,或需要以不同的用户身份进行AD身份验证怎么办?在这种情况下,您可以使用Credential
参数。该参数允许您指定用于身份验证的用户名和密码。
例如,也许您的用户帐户没有执行AD任务的权限。您有一个具有附加权限的服务帐户。您可以以标准用户身份登录,但仍然可以使用服务帐户进行身份验证,如下所示。
Get-Credential
cmdlet提示输入用户名/密码以创建凭据。然后将此凭据传递给Get-AdGroup
cmdlet进行身份验证。
Credential
参数在PowerShell中提供身份验证凭据时非常常见。有关更多信息,请阅读使用PowerShell Get-Credential cmdlet和所有凭据相关的事项。
使用Get-ADGroup获取组成员?
听起来可能有些违反直觉,但您也可以使用Get-ADGroup
cmdlet获取组成员。
事实证明,Get-ADGroup
返回每个组的一个名为members
的属性。这是一个包含组成员的AD对象集合。
例如,要再次查找HR组中的组成员,而不使用Get-ADGroupMember
,您可以执行以下操作:
为什么选择这种方法而不是其他方法?主要区别在于members
属性包含所有类型的AD对象 – 不仅仅是用户、计算机和其他组。
也许您在各种组织内有联系人。当您运行Get-ADGroupMember
时,这些联系人将不会显示出来。但是,如果您告诉Get-ADGroup
返回该组中的所有成员,并展开如下所示的集合,您将看到这些联系人。
查找特定的AD属性
在上面的基础部分,您只是返回所有组和组成员。对于每个组和组成员返回的信息只是与每种类型的对象关联的AD属性的子集。
也许您想要查看用户帐户的电子邮件地址、最后登录日期或其他相关的AD属性?为此,您需要发挥创意。
也许您能够找到HR组中的所有成员,但需要查看每个用户帐户的电子邮件地址?
过滤结果
到目前为止,您已经找到了所有组和组成员,但在日常工作环境中,您很少需要这样做。很可能,您只需要找到每个项目的有限数量。AD组命令有一些方法可以处理这个问题。
Filter
参数
如前所述,这两个cmdlet都有Filter
参数。此参数允许您以许多不同的方式限制返回的内容,超出了本文的范围。
使用Filter
参数,您可以按任何AD属性(如名称、组类型、电子邮件地址、用户上次登录时间等)限制结果。
例如,也许您只想查找安全组。在这种情况下,您会指定一个GroupCategory
属性,并设置一个条件以确保只返回Security
组。
也许您想要找到所有安全组,但它们必须不是域本地组。然后,您会添加另一个条件(这次使用-ne
运算符),以防止返回任何域本地组。
如果您想学习如何创建查询过滤器,请务必查看PowerShell中的Active Directory和LDAP过滤器入门。
通过组织单位(OU)限制组结果
也许您在OU中嵌套了各种组。您不一定想找到所有组,而只想找到特定OU中的组。在这种情况下,您可以使用SearchBase
参数。
SearchBase
参数允许您指定OU的分立名称(DN),以开始搜索其中的组。例如,也许您在域的根目录下有一个名为Locations的OU。在Locations OU中,您已经创建了每个位置OU,如Austin、NYC和Los Angeles。您只想要在NYC OU中查找组,并且需要限制看到其他位置。
下面显示了一个示例AD OU结构。请注意,其他组存在于Locations OU之外。
也许你需要找出所有仅在NYC组织单位中的AD组。为了限制查询,你可以使用SearchBase
参数,并提供如下的DN。所有在Locations组织单位内的组都会被返回。
但现在你需要找出所有在所有在Locations组织单位下的组。Get-ADGroup
只会返回在Locations组织单位本身的组 – 而不会返回子组织单位中的组。
要返回子组织单位中的组,你需要使用SearchScope
参数。该参数类似于Recursive
参数,因为它也会检查子对象。
例如,要查找Locations组织单位下任何组织单位中的所有组,请指定Subtree
或2
。对于SearchScope
的这个值告诉Get-ADGroup
递归地查看所有子组、孙子组等组织单位。
关于SearchScope
参数选项的完整说明,请参考Get-ADGroup
文档。
导出AD组和成员
现在你终于知道如何查询并返回所需的组和组成员。所有这些信息都会发送到PowerShell控制台。但现在你需要将这些信息导出到CSV文件或Excel工作表中。
你现在需要做的唯一一件事就是将所有信息发送到一个文件中。
导出到CSV
将AD信息导出为CSV的一种流行格式。PowerShell有一个方便的命令,允许你轻松地从PowerShell输出中创建CSV文件,称为Export-Csv
。
您可以通过将任何本文涵盖的命令导入Export-Csv
来创建CSV文件。使用以下示例,将Get-AdGroup
命令返回的所有输出重定向到控制台,而不是CSV文件。
有关此实用命令的更多信息,请查看Export-Csv:将PowerShell中的CSV文件视为一等公民的方法。
您还可以通过Get-AdGroupMember
命令轻松导出结果到CSV。
导出到Excel
PowerShell没有将信息导出到Excel的原生方式。但是,您始终可以下载名为ImportExcel的免费社区模块。该模块将类似CSV的导出功能直接提供给Excel工作表。要安装PowerShell模块,请运行Install-Module ImportExcel -Scope CurrentUser
。
使用上述示例,如果您需要将组导出到Excel工作表而不是CSV文件,则可以使用如下所示的Export-Excel
命令。
通过检查NCSC密码列表来查找活动目录中的泄露和不安全密码。
ImportExcel模块具有丰富的功能,可用于处理Excel。如果您需要更复杂的工作表,它可能有适合您的功能。
有关使用ImportExcel模块的更多信息,请阅读本文。它对其可以处理的一些常见用例进行了很好的介绍。
使用ManageEngine ADManager Plus管理和报告Active Directory、Exchange和Microsoft 365。免费试用!
结论
只需使用两个PowerShell cmdlet,您几乎可以处理AD组的任何操作。本文只是介绍了可用于您的功能的一部分。利用此处收集的知识,跟随文章中的一些链接深入了解更多主题,并看看您能构建什么!