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

Marion Paul Kenneth Mendoza 2023年1月30日 2022年5月16日
  1. 使用 net 舊版命令獲取使用者的組成員身份
  2. 使用 ADSI 獲得使用者的組成員身份
  3. 使用新物件獲取使用者的組成員身份
  4. 使用 Active Directory 模組獲取使用者的組成員身份
使用 PowerShell 獲取使用者的所有組成員身份

在 Windows PowerShell 中,有多種方法可以獲取特定使用者的組成員身份列表。我們可以使用遺留命令、本機命令或擴充套件在 PowerShell 的指令碼環境中執行。

本文將一一討論所有這些方法,它們的優點和缺點,以及它們是如何正確執行的。

只有當你的計算機或伺服器加入域時,以下命令才能正常執行。使用預設的 WORKGROUP 域將導致異常錯誤。

使用 net 舊版命令獲取使用者的組成員身份

我們可以從作業系統的早期階段就存在的遺留命令開始,我們稱之為 net 命令。net 命令通常在命令提示符下執行,並通過別名與 Windows PowerShell 一起使用。

net 命令通常用於管理本地計算機。儘管如此,我們仍然可以使用該命令通過使用以下語法來獲取特定使用者的成員資格以用於此特定目的。

net user /domain username

使用此方法不僅返回全域性域組,還返回使用者的本地組。

此命令的缺點之一是它不如較新的 Windows PowerShell cmdlet 靈活。此外,匯出時我們不會正確看到長組名(大約 21 個字元),因為它們將被截斷到命令列中。

使用 ADSI 獲得使用者的組成員身份

根據 Microsoft 的說法,ADSI 或 Active Directory 服務介面是用於訪問目錄服務的內建 COM 介面。ADSI 庫中有 [ADSISearcher] 類,我們可以在 Windows PowerShell 中執行它來查詢當前使用者的組成員身份。

([ADSISEARCHER]"samaccountname=$($env:USERNAME)").Findone().Properties.memberof

我們可以通過新增正規表示式來去除不需要的 LDAP 字元 CN="groupname"來改進這一點,這隻會返回使用者的組名。

([ADSISEARCHER]"samaccountname=$($env:USERNAME)").Findone().Properties.memberof -replace '^CN=([^,]+).+$','$1'

此方法不需要任何模組安裝即可執行,因為它是機器內建的。它需要的唯一要求是加入域的機器。執行上面的語法會丟擲錯誤異常。

此語法的唯一缺點是查詢僅適用於當前登入的使用者。這意味著你在登入時執行語法時不能針對不同的使用者。

使用新物件獲取使用者的組成員身份

獲取使用者組成員身份的另一種方法是使用目錄服務並建立一個新物件。在這種方法中,我們也不需要安裝單獨的模組來工作。

此外,此方法可以針對你域內的特定使用者,因為它將查詢你當前在網路中加入的域控制器。

(New-Object System.DirectoryServices.DirectorySearcher("(&(objectCategory=User)(samAccountName=$($env:USERNAME)))")).FindOne().GetDirectoryEntry().memberOf

如果你不想查詢登入使用者,可以將 $env:USERNAME 替換為目標使用者的確切使用者名稱。

$username = "user01"
(New-Object System.DirectoryServices.DirectorySearcher("(&(objectCategory=User)(samAccountName=$($username)))")).FindOne().GetDirectoryEntry().memberOf

此方法將輸出不需要的 LDAP 字元,並像以前的方法一樣輸出整個組織單位 (OU) 搜尋庫。

使用 Active Directory 模組獲取使用者的組成員身份

對於最後一種方法,我們可以認為這是獲取使用者組成員身份的最簡單和最短的方法之一。此方法的唯一條件是安裝 Active Directory 模組以將 AD cmdlet 匯入我們的指令碼環境。

安裝 Active Directory 模組

通常,執行 cmdlet,Install-Module 應該從遠端 CDN 獲取包並將其安裝在你的計算機上。儘管如此,使用 Active Directory 模組,你必須安裝一個先決條件包才能成功。這個先決條件包就是我們所說的遠端伺服器管理工​​具或 RSAT。

要在你的計算機或伺服器上安裝 RSAT,你可以執行下面的 PowerShell 指令碼。

為 Windows 10 安裝 RSAT:

Add-WindowsCapability -Name Rsat.ActiveDirectory.DS-LDS.Tools~~~~0.0.1.0 -Online

安裝 RSAT for Windows Server(2008 到 2016 的多個版本):

Install-WindowsFeature -Name "RSAT-AD-PowerShell" -IncludeAllSubFeature

在你的計算機上安裝 RSAT 功能還將安裝適用於 Windows PowerShell 的 Active Directory 模組。

使用 Get-ADPrincipalGroupMembership Cmdlet

安裝 Active Directory 模組後,你現在可以使用以下語法匯入 Active Directory 模組。

Import-Module -Name ActiveDirectory

匯入 Active Directory 模組後,你現在可以執行 AD cmdlet,我們將使用這些特定的擴充套件 cmdlet 來獲取使用者組成員身份的列表。

要獲取使用者的組成員身份,我們將使用 cmdlet Get-ADPrincipalGroupMembership。此 cmdlet 將返回使用者、計算機、組或服務帳戶的所有 AD 組。此外,由於我們可以針對使用者和組物件,此 cmdlet 還將返回巢狀的組成員身份。

執行以下語法以獲取使用者的組成員身份。確保已匯入活動目錄模組。

Get-ADPrincipalGroupMembership username | select name

管道 name 屬性將輸出所有使用者組成員身份。

輸出:

name
----
Domain Users
Domain Computers
Workstation Admins
Company Users
Company Developers
AutomatedProcessingTeam
Marion Paul Kenneth Mendoza avatar Marion Paul Kenneth Mendoza avatar

Marion specializes in anything Microsoft-related and always tries to work and apply code in an IT infrastructure.

LinkedIn