HOWTO · PowerShell

使用 PowerShell 獲取使用者的所有組成員身份

比較使用 PowerShell 列出使用者的 Active Directory 群組成員資格的四種方法,包括各自的先決條件與結果範圍。

本頁內容

若要列出使用者的 Active Directory 群組成員資格,可選擇舊版 net 命令、ADSI、DirectorySearcher 或 Active Directory 模組。前三種方法不必安裝該模組即可使用 Windows 目錄服務;若系統已提供該模組,使用其 Cmdlet 是最直接的選項。這些方法都需要連線至網域控制站,且使用的帳戶必須有權讀取目錄。此處的「所有」是指各查詢所傳回的成員資格:目錄的 memberOf 屬性和這些範例會列出直接群組關係,不會完整展開傳遞式成員資格,也不一定會包含使用者的主要群組。

使用 net 舊版命令取得使用者的群組成員資格

執行 net user /domain,向網域查詢目前登入帳戶的資訊。結果包含該帳戶所屬的全域網域群組。若要查詢其他網域帳戶,請提供使用者名稱,例如 net user username /domain。

這是 PowerShell 可直接呼叫的舊版命令列工具,並不是 PowerShell 別名。它的輸出是為了方便閱讀而排版;若需要結構化物件,或要在指令碼中處理群組名稱,請改用 Active Directory 查詢。此命令回報的是網域資訊,不是使用者在本機電腦上的群組成員資格。

使用 ADSI 取得使用者的群組成員資格

ADSI 是 Windows 目錄服務介面,可透過 PowerShell 的 [adsisearcher] 型別使用。此查詢會使用目前登入帳戶的名稱,並以辨別名稱傳回該帳戶的 memberOf 值。在已連線至網域的 PowerShell 工作階段中,執行 $searcher = [adsisearcher]"(samAccountName=$($env:USERNAME))"; $result = $searcher.FindOne(); if ($null -ne $result) { $result.Properties.memberof }。

每個值都會以 LDAP 辨別名稱識別群組,其中包含組織路徑。篩選條件會指定 $env:USERNAME 中的帳戶名稱,因此查詢的是目前登入的帳戶,不是其他使用者。memberOf 表示直接群組關係,不會列出主要群組。此方法不需要另外安裝 PowerShell 模組,但仍須連線至目錄,並有權讀取該帳戶。查詢能否成功取決於環境是否能解析並搜尋 Active Directory;本文未提供網域環境的執行結果,因此無法據此提出相反的說法。
若要從範例辨別名稱中顯示通用名稱部分,可以對傳回的字串套用正規表示式:

$memberOf = @(
    "CN=Finance,OU=Groups,DC=example,DC=com",
    "CN=Engineering,OU=Groups,DC=example,DC=com"
)
$memberOf -replace '^CN=([^,]+).+$', '$1'
Finance
Engineering

此轉換會從提供的每個字串中移除 LDAP 路徑;它不會執行目錄查詢。此正規表示式假設通用名稱中沒有經跳脫的逗號。

使用新物件取得使用者的群組成員資格

DirectorySearcher 提供另一種內建方式,可搜尋指定帳戶。此範例刻意只接受 ASCII 字元的 sAMAccountName:由英文字母、數字、句點、底線或連字號組成,長度最多 20 個字元。建立 LDAP 篩選條件前,請先拒絕其他輸入:if ($username -notmatch '^[A-Za-z0-9._-]{1,20}$') { throw 'Use a valid account name.' }。確認輸入符合條件後,執行 $searcher = New-Object System.DirectoryServices.DirectorySearcher("(&(objectCategory=User)(samAccountName=$username))"); $result = $searcher.FindOne(); if ($null -ne $result) { $result.Properties.memberof }。這組受限字元可避免輸入值加入 LDAP 篩選語法;若你的目錄允許使用此範例字元集以外的帳戶名稱,請改用 LDAP 篩選器跳脫。

傳回值是 LDAP 辨別名稱,而不只是群組名稱。請將 user01 換成目標帳戶的登入名稱。與 ADSI 範例相同,此查詢讀取 memberOf 屬性,因此不會展開巢狀群組成員資格,也不會包含主要群組。它需要存取網域目錄,但不必另外安裝模組。

使用 Active Directory 模組取得使用者的群組成員資格

Active Directory 模組提供用於目錄管理的 Cmdlet。電腦必須已提供此模組;單獨執行 Install-Module 並不會安裝這個 Windows 模組。請依照適用於目前 Windows 版本的 Microsoft 指示安裝 RSAT。本文未證實特定版本的 RSAT 命令或相容性,因此此處不列出這類命令。

安裝 Active Directory 模組

安裝適用的 RSAT 元件後,在 PowerShell 工作階段中執行 Import-Module -Name ActiveDirectory 匯入模組。

若無法使用該模組,匯入命令就無法載入它。安裝步驟會因 Windows 版本而異,請查閱 Microsoft 目前針對該版本的 RSAT 指引,不要直接套用其他版本的命令。

使用 Get-ADPrincipalGroupMembership Cmdlet

將使用者的帳戶名稱傳給 Get-ADPrincipalGroupMembership,再選取群組名稱以簡潔顯示結果:Get-ADPrincipalGroupMembership -Identity "user01" | Select-Object -ExpandProperty Name。

請將 user01 換成目標身分識別。此 Cmdlet 會傳回與該主體關聯之群組的物件;選取 Name 後,顯示的是群組名稱,而非 LDAP 辨別名稱。此命令需要 Active Directory 模組、適當的目錄連線,以及讀取權限。這些範例沒有來自 Windows 網域環境的執行證據,因此不會將依賴網域的輸出或行為描述為已測試。