使用 PowerShell 获取用户的所有组成员身份

Marion Paul Kenneth Mendoza 2023年1月30日
  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