使用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 命令-let – Get-AdGroupGet-AdGroupMember

Get-ADGroup 查詢域控制器並返回 AD 群組對象。 Get-AdGroupMember 在每個群組中查找並返回存在於該群組中的所有用戶帳戶、群組、聯絡人和其他對象。

獲取 AD 群組

要使用 PowerShell 找到 AD 群組,可以使用 Get-ADGroup cmdlet。如果沒有指定任何參數,Get-ADGroup 將使用 Filter 參數在域中查詢並返回所有群組。 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命令。该命令获取特定组中的用户、组和计算机对象。也许你需要找到Administrators组的所有成员。在最简单的形式中,你只需再次使用Identity参数,并指定组的名称如下:

Get-ADGroupMember -Identity 'Administrators'

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

枚举组成员内的组成员

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

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

Get-ADGroupMember -Identity 'HR' -Recursive

一次获取多个组/成员

如果您需要一次查詢AD中的多個不同組或組成員,您也可以使用PowerShell的foreach循環。foreach循環對集合中的每個項目運行一個命令或代碼for each。在這種情況下,該集合將是一個組名列表。

也許您需要找到HR會計IT組中的所有組成員。為此,首先創建這些組名的集合或數組。下面的示例將此集合定義為$groupNames。然後,對於該集合中的每個名稱,在Identity參數中提供每個組的名稱,運行Get-ADGroupMember

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

您還可以使用ForEach-Object cmdlet循環遍歷組。

使用替代憑據

與許多其他PowerShell命令,AD組命令也具有Credential參數。默認情況下,每次運行AD組命令時,它都使用您的登錄憑據來查詢Active Directory。這種行為要求您必須在一個加入域的計算機上以Active Directory用戶身份登錄。

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

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

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

Get-ADGroup -Identity 'HR' -Credential (Get-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 群組 cmdlet 有幾種處理這個問題的方法。

Filter 參數

如前所述,這兩個 cmdlet 都有 Filter 參數。該參數允許您以許多不同的方式限制返回的內容,超出本文的範圍。

使用Filter參數,您可以通過任何AD屬性(如名稱、組類型、電子郵件地址、上次登錄等)來限制結果。

例如,也許您只想找到安全組。在這種情況下,您需要指定一個GroupCategory屬性並設置條件,以確保只返回安全組。

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,如AustinNYC洛杉磯。您只想找到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 OU中的所有AD组。为了限制查询,你可以使用SearchBase参数提供DN,如下所示。返回Locations OU中的所有组。

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

但是现在你需要找到所有位于Locations OU下的OU中的所有组。Get-ADGroup只返回Locations OU本身的组 – 而不是子OU中的组。

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

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

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

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

导出AD组和成员

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

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

导出到CSV

导出AD信息的一种常用格式是CSV。PowerShell有一个方便的cmdlet,可以让你轻松地从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密码列表进行对比,在您的Active Directory中查找泄露和不安全的密码。

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 命令,你就可以在 AD 群組中做任何事情。本文只是對你可用功能的一個簡要介紹。利用此處收集的知識,跟隨文章中的一些深入主題鏈接,看看你能夠創建什麼!

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