使用 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
相关文章
在 PowerShell 中安装 NuGet 包
发布时间:2024/03/01 浏览次数:161 分类:编程语言
-
本文将了解发生错误的原因以及安装适用于 PowerShell 的 NuGet 提供程序的分步指南。
在 PowerShell 中 Ping 主机名列表和输出结果到 CSV
发布时间:2024/03/01 浏览次数:53 分类:编程语言
-
本教程将教你 ping 主机名列表并将结果输出到 PowerShell 中的 CSV。
以管理员身份运行 PowerShell 脚本
发布时间:2024/03/01 浏览次数:87 分类:编程语言
-
本文将展示如何在不输入管理员凭据的情况下以管理员权限运行 powershell 脚本。如果代码片段未在提升的 Windows PowerShell 中运行,则以下脚本将自行提升你的脚本。
使用 Windows PowerShell 启动进程
发布时间:2024/03/01 浏览次数:58 分类:编程语言
-
本文将解释 Start-Process cmdlet 是什么以及参数如何与 cmdlet 一起使用。本文还展示了使用 Start-Process cmdlet 的好处
使用 PowerShell 远程处理执行命令
发布时间:2024/03/01 浏览次数:144 分类:编程语言
-
本文将讨论 PowerShell 远程处理的工作原理、几个 PowerShell 远程处理命令,以及我们如何将其投入实际使用。我们还将区分它与许多类似 cmdlet 的优势。
使用 PowerShell 将输出导出到文件
发布时间:2024/03/01 浏览次数:82 分类:编程语言
-
本文将讨论如何将输出数据导出到文件、将数据添加到现有文件以及使用 PowerShell 操作输出。
使用 PowerShell 将 CSV 导出到 Excel
发布时间:2024/03/01 浏览次数:109 分类:编程语言
-
本教程将教你使用 PowerShell 将 CSV 文件导出到 Excel 文件。