PowerShell的Get-ADGroupMember
cmdlet返回特定组的成员。是否有cmdlet或属性来获取特定用户所属的所有组?
我修正了错误:Get-Member
应为Get-ADGroupMember
。
答案 0 :(得分:225)
Get-ADPrincipalGroupMembership将执行此操作。
Get-ADPrincipalGroupMembership username | select name
name
----
Domain Users
Domain Computers
Workstation Admins
Company Users
Company Developers
AutomatedProcessingTeam
答案 1 :(得分:62)
单行,无需模块,使用当前登录用户:
(New-Object System.DirectoryServices.DirectorySearcher("(&(objectCategory=User)(samAccountName=$($env:username)))")).FindOne().GetDirectoryEntry().memberOf
对此vbs / powershell文章的评价:http://technet.microsoft.com/en-us/library/ff730963.aspx
答案 2 :(得分:37)
Canoas发布的一个更简洁的替代方案,用于获取当前登录用户的组成员资格。
我在这篇博文中遇到过这种方法:http://www.travisrunyard.com/2013/03/26/auto-create-outlook-mapi-user-profiles/
([ADSISEARCHER]"samaccountname=$($env:USERNAME)").Findone().Properties.memberof
一个更好的版本,它使用正则表达式来剥离LDAP guff并仅保留组名称:
([ADSISEARCHER]"samaccountname=$($env:USERNAME)").Findone().Properties.memberof -replace '^CN=([^,]+).+$','$1'
有关使用[ADSISEARCHER]类型加速器的更多详细信息,请参阅脚本专家博客:http://blogs.technet.com/b/heyscriptingguy/archive/2010/08/24/use-the-powershell-adsisearcher-type-accelerator-to-search-active-directory.aspx
答案 3 :(得分:23)
(GET-ADUSER –Identity USERNAME –Properties MemberOf | Select-Object MemberOf).MemberOf
答案 4 :(得分:20)
CMD的老派方式:
net user mst999 /domain
答案 5 :(得分:6)
这应该为您提供当前用户的详细信息。不需要Powershell。
whoami /groups
答案 6 :(得分:5)
获取用户的群组成员资格:
$strUserName = "Primoz"
$strUser = get-qaduser -SamAccountName $strUserName
$strUser.memberof
请参阅 Get Group Membership for a User
但也可以看到Quest的Free PowerShell Commands for Active Directory。
[编辑: Get-ADPrincipalGroupMembership 命令包含在自Windows 2008 R2 v2以来的Powershell中。请参阅kstrauss的回答。]
答案 7 :(得分:4)
Get-Member
是一个用于列出.NET object
成员的cmdlet。这与用户/组成员身份无关。您可以像这样获得当前用户的组成员身份:
PS> [System.Security.Principal.WindowsIdentity]::GetCurrent().Groups |
Format-Table -auto
BinaryLength AccountDomainSid Value
------------ ---------------- -----
28 S-1-5-21-... S-1-5-21-2229937839-1383249143-3977914998-513
12 S-1-1-0
28 S-1-5-21-... S-1-5-21-2229937839-1383249143-3977914998-1010
28 S-1-5-21-... S-1-5-21-2229937839-1383249143-3977914998-1003
16 S-1-5-32-545
...
如果您需要访问任意用户的群组信息,那么@tiagoinu建议使用Quest AD cmdlet是一种更好的方法。
答案 8 :(得分:4)
Get-Member不是用于获取用户的组成员资格。如果要获取本地系统上用户所属的组列表,可以通过以下方式执行此操作:
$query = "ASSOCIATORS OF {Win32_Account.Name='DemoUser1',Domain='DomainName'} WHERE ResultRole=GroupComponent ResultClass=Win32_Account"
Get-WMIObject -Query $query | Select Name
在上面的查询中,将DemoUser1替换为您想要的用户名,将DomainName替换为您的本地计算机名或域名。
答案 9 :(得分:4)
使用:
Get-ADPrincipalGroupMembership username | select name | export-CSV username.csv
这会将命令的输出传递到CSV文件。
答案 10 :(得分:4)
当它是一个简单的单行程序时,不需要长脚本..
QUEST命令
(Get-QADUser -Identity john -IncludedProperties MemberOf | Select-Object MemberOf).MemberOf
MS AD命令
(GET-ADUSER –Identity john –Properties MemberOf | Select-Object MemberOf).MemberOf
我发现MS AD cmd更快但有些人更喜欢Quest更好..
史蒂夫
答案 11 :(得分:3)
这只是一行:
(get-aduser joe.bloggs -properties *).memberof
结束:)
答案 12 :(得分:2)
以下效果很好:
get-aduser $username -Properties memberof | select -expand memberof
如果您有用户列表:
$list = 'administrator','testuser1','testuser2'
$list | `
%{
$user = $_;
get-aduser $user -Properties memberof | `
select -expand memberof | `
%{new-object PSObject -property @{User=$user;Group=$_;}} `
}
答案 13 :(得分:2)
我编写了一个名为Get-ADPrincipalGroupMembershipRecursive的PowerShell函数。它接受用户,计算机,组或服务帐户的DSN。它从帐户的memberOf属性中检索组的初始列表,然后递归检查这些组的成员资格。缩写代码如下。完整source code with comments can be found here。
function Get-ADPrincipalGroupMembershipRecursive( ) {
Param(
[string] $dsn,
[array]$groups = @()
)
$obj = Get-ADObject $dsn -Properties memberOf
foreach( $groupDsn in $obj.memberOf ) {
$tmpGrp = Get-ADObject $groupDsn -Properties memberOf
if( ($groups | where { $_.DistinguishedName -eq $groupDsn }).Count -eq 0 ) {
$groups += $tmpGrp
$groups = Get-ADPrincipalGroupMembershipRecursive $groupDsn $groups
}
}
return $groups
}
# Simple Example of how to use the function
$username = Read-Host -Prompt "Enter a username"
$groups = Get-ADPrincipalGroupMembershipRecursive (Get-ADUser $username).DistinguishedName
$groups | Sort-Object -Property name | Format-Table
答案 14 :(得分:2)
首先,导入activedirectory模块:
import-module activedirectory
然后发出以下命令:
Get-ADGroupMember -Identity $group | foreach-object {
Write-Host $_.SamAccountName
}
这将显示指定组的成员。
答案 15 :(得分:1)
对于本地用户和组(即不在 Active Directory 中),如果您不想、不允许或无法安装 RSAT 和/或 Install-WindowsFeature RSAT-AD-PowerShell
和/或 { {1}} 那么这里有一个纯粹的、预安装的 powershell (5.1+) 方式来做到这一点。
(注意:下面使用的 import-module activedirectory
仅适用于 Powershell v5.1 及更高版本。“...v5.1 于 2016 年 8 月 2 日与 Windows 10 周年更新一起发布,并在 Windows Server 2016 中. ...[F] 或 Windows 7、Windows Server 2008、Windows Server 2008 R2、Windows Server 2012 和 Windows Server 2012 R2 [它] 于 2017 年 1 月 19 日发布。”(wikipedia))< /p>
Get-LocalGroup*
示例输出:
$username = "user002"
Get-LocalGroup | ForEach-Object {
# the usernames are returned in the string form "computername\username"
if (Get-LocalGroupMember -Group $_ | Where-Object name -like "*\$username") {
$_.name
}
}
答案 16 :(得分:1)
Get-QADUser -SamAccountName LoginID | %{$ _。MemberOf} | Get-QADGroup |选择名称
答案 17 :(得分:1)
我无法为特定用户提供以下服务:
Get-ADPrincipalGroupMembership username
它引发了一个我不愿意排除故障的错误。
然而,我确实使用Get-ADUser提出了不同的解决方案。我更喜欢它,因为如果您不知道帐户名称,那么您可以根据用户的实际名称使用通配符来获取帐户名称。只需填写 PartOfUsersName 即可。
#Get the groups that list of users are the member of using a wildcard search
[string]$UserNameLike = "*PartOfUsersName*" #Use * for wildcards here
[array]$AccountNames = $(Get-ADUser -Filter {Name -like $UserNameLike}).SamAccountName
ForEach ($AccountName In $AccountNames) {
Write-Host "`nGETTING GROUPS FOR" $AccountName.ToUpper() ":"
(Get-ADUser -Identity $AccountName -Properties MemberOf|select MemberOf).MemberOf|
Get-ADGroup|select Name|sort name
}
schmeckendeugler和8DH的大型道具让我得到这个解决方案。给你们两个+1。
答案 18 :(得分:1)
如果无法使Get-ADPrincipalGroupMembership正常工作,则可以尝试以该用户身份登录然后使用。
$id = [Security.Principal.WindowsIdentity]::GetCurrent()
$groups = $id.Groups | foreach-object {$_.Translate([Security.Principal.NTAccount])}
$groups | select *
答案 19 :(得分:0)
Get-ADUser -Filter { memberOf -RecursiveMatch "CN=Administrators,CN=Builtin,DC=Fabrikam,DC=com" } -SearchBase "CN=Administrator,CN=Users,DC=Fabrikam,DC=com" -SearchScope Base
## NOTE: The above command will return the user object (Administrator in this case) if it finds a match recursively in memberOf attribute.
答案 20 :(得分:0)
我使用这个简单的oneliner递归搜索用户所属的所有组:
Get-ADPrincipalGroupMembership $UserName | foreach-object { Get-ADPrincipalGroupMembership $_.SamAccountName | select SamAccountName }
要过滤组以找出用户是否是特定组的成员,我可以使用以下方法:
if ( Get-ADPrincipalGroupMembership $UserName | foreach-object { Get-ADPrincipalGroupMembership $_.SamAccountName | select SamAccountName } | where-object {$_.SamAccountName -like "*$Groupname*"} ) { write-host "Found" } else { write-host "not a member of group $Groupname" }
答案 21 :(得分:0)
尽管这里有许多出色的答案,但我个人一直在寻找一个答案,而这个答案是缺失的。一旦弄清楚了,我想应该把它发布出来,以备日后找到,否则它确实可以在某个时候帮助其他人:
Get-ADPrincipalGroupMembership username | Format-Table -auto
呈现此问题的第二种方法是指定您感兴趣的各个列,例如:
Get-ADPrincipalGroupMembership username | select name, GroupScope, GroupCategory
这为用户名所属的所有AD组提供了-而且还以表格的形式显示了每个组的所有默认属性。
这给您的主要好处是您可以一目了然地看到哪些是通讯组列表,哪些是安全组。您可以一目了然地看到哪些是通用的,哪些是DomainLocal的,哪些是全球的。
您为什么还要关心这最后一点?
答案 22 :(得分:0)
研究所有提出的意见给了我一个起点(感谢这样),但给我留下了几个未解决的问题。结果,这就是我的答案。提供的代码段比要求的功能多了一点,但提供了有用的调试信息。
[array] $script:groupsdns = @()
function Get-ADPrincipalGroupMembershipRecursive()
{
Param( [string] $dn, [int] $level = 0, [array] $groups = @() )
#if(($groupsdns | where { $_.DistinguishedName -eq $dn }).Count -ne 0 ) { return $groups } # dependency on next statement
#$groupsdns += (Get-ADObject $dn -Properties MemberOf) # Get-ADObject cannot find an object with identity
if ($script:groupsdns.Contains($dn)) { return $groups }
$script:groupsdns += $dn
$mo = $Null
$mo = Get-ADObject $dn -Properties MemberOf # Get-ADObject cannot find an object with identity
$group = ($dn + " (" + $level.ToString())
if ($mo -eq $Null) { $group += "!" }
$group += ")"
$groups += $group
foreach( $groupdn in $mo.MemberOf )
{
$groups = Get-ADPrincipalGroupMembershipRecursive -dn $groupdn -level ($level+1) -groups $groups
}
if ($level -le 0)
{
$primarygroupdn = (Get-ADUser -Identity $dn -Properties PrimaryGroup).PrimaryGroup
$groups = Get-ADPrincipalGroupMembershipRecursive -dn $primarygroupdn -level ($level+1) -groups $groups
}
return $groups
}
$adusergroups = Get-ADPrincipalGroupMembershipRecursive -dn $aduser.DistinguishedName
$adusergroups | ft -AutoSize | `
Out-File -Width 512 Get-ADPrincipalGroupMembershipRecursive.txt #-Append #-Wrap # | Sort-Object -Property Name
答案 23 :(得分:0)
将此放在此处以备将来参考。我正在进行电子邮件迁移。我需要知道每个用户帐户及其各自的组成员身份,而且我还需要了解每个组及其各自的成员。
我正在使用下面的代码块为每个用户的群组成员资格输出CSV。
Get-ADUser -Filter * |`
ForEach-Object { `
$FileName = $_.SamAccountName + ".csv" ; `
$FileName ; `
Get-ADPrincipalGroupMembership $_ | `
Select-Object -Property SamAccountName, name, GroupScope, GroupCategory | `
Sort-Object -Property SamAccountName | `
Export-Csv -Path $FileName -Encoding ASCII ; `
}
这些团体及其各自成员的出口过程有点令人费解,但以下情况有效。输出文件名包括组的类型。因此,我需要的电子邮件通讯组是/应该是通用和全局通讯组。我应该能够删除或移动我不需要的TXT文件。
Get-ADGroup -Filter * | `
Select-Object -Property Name, DistinguishedName, GroupScope, GroupCategory | `
Sort-Object -Property GroupScope, GroupCategory, Name | `
Export-Csv -Path ADGroupsNew.csv -Encoding ASCII
$MyCSV = Import-Csv -Path .\ADGroupsNew.csv -Encoding ASCII
$MyCSV | `
ForEach-Object { `
$FN = $_.GroupScope + ", " + $_.GroupCategory + ", " + $_.Name + ".txt" ; `
$FN ; `
Get-ADGroupMember -Identity $_.DistinguishedName | `
Out-File -FilePath $FN -Encoding ASCII ; $FN=""; `
}
答案 24 :(得分:0)
如果您没有权限咨询其他成员组但您确实有权咨询组成员,则可以执行以下操作来构建哪个用户可以访问哪些组的地图。
$groups = get-adgroup -Filter * | sort name | select Name
$users = @{}
foreach($group in $groups) {
$groupUsers = @()
$groupUsers = Get-ADGroupMember -Identity $group.Name | Select-Object SamAccountName
$groupUsers | % {
if(!$users.ContainsKey($_.SamAccountName)){
$users[$_.SamAccountName] = @()
}
($users[$_.SamAccountName]) += ($group.Name)
}
}
答案 25 :(得分:0)
使用用户输入和精美的输出格式:
[CmdletBinding(SupportsShouldProcess=$True)]
Param(
[Parameter(Mandatory = $True)]
[String]$UserName
)
Import-Module ActiveDirectory
If ($UserName) {
$UserName = $UserName.ToUpper().Trim()
$Res = (Get-ADPrincipalGroupMembership $UserName | Measure-Object).Count
If ($Res -GT 0) {
Write-Output "`n"
Write-Output "$UserName AD Group Membership:"
Write-Output "==========================================================="
Get-ADPrincipalGroupMembership $UserName | Select-Object -Property Name, GroupScope, GroupCategory | Sort-Object -Property Name | FT -A
}
}
答案 26 :(得分:0)
几乎所有上述解决方案都使用ActiveDirecotry
模块,在大多数情况下默认情况下可能无法使用。
我用下面的方法。有点间接,但服务于我的目的。
列出所有可用的组
Get-WmiObject -Class Win32_Group
然后列出用户所属的组
[System.Security.Principal.WindowsIdentity]::GetCurrent().Groups
然后可以通过SIDs
检查来进行比较。这适用于登录用户。如果我错了,请纠正我。对PowerShell来说是全新的,但必须完成工作承诺。
答案 27 :(得分:0)
要使其递归,您可以使用:
<#
.SYNOPSIS
Get all the groups that a user is MemberOf.
.DESCRIPTION
This script retrieves all the groups that a user is MemberOf in a recursive way.
.PARAMETER SamAccountName
The name of the user you want to check #>
Param (
[String]$SamAccountName = 'test',
$DomainUsersGroup = 'CN=Domain Users,CN=Users,DC=domain,DC=net'
)
Function Get-ADMemberOf {
Param (
[Parameter(ValueFromPipeline)]
[PSObject[]]$Group,
[String]$DomainUsersGroup = 'CN=Domain Users,CN=Users,DC=grouphc,DC=net'
)
Process {
foreach ($G in $Group) {
$G | Get-ADGroup | Select -ExpandProperty Name
Get-ADGroup $G -Properties MemberOf| Select-Object Memberof | ForEach-Object {
Get-ADMemberOf $_.Memberof
}
}
}
}
$Groups = Get-ADUser $SamAccountName -Properties MemberOf | Select-Object -ExpandProperty MemberOf
$Groups += $DomainUsersGroup
$Groups | Get-ADMemberOf | Select -Unique | Sort-Object
答案 28 :(得分:0)
Import-Module ActiveDirectory
Get-ADUser -SearchBase "OU=Users,DC=domain,DC=local" -Filter * | foreach-object {
write-host "User:" $_.Name -foreground green
Get-ADPrincipalGroupMembership $_.SamAccountName | foreach-object {
write-host "Member Of:" $_.name
}
}
更改-SearchBase的值以反映您需要列出用户的OU:)
这将列出该OU中的所有用户,并显示他们所属的组。
答案 29 :(得分:0)
Get-ADPrincipalGroupMembership USERLOGON |选择名称
答案 30 :(得分:0)
这是获取名称的最简单方法:
Get-ADPrincipalGroupMembership "YourUserName"
# Returns
distinguishedName : CN=users,OU=test,DC=SomeWhere
GroupCategory : Security
GroupScope : Global
name : testGroup
objectClass : group
objectGUID : 2130ed49-24c4-4a17-88e6-dd4477d15a4c
SamAccountName : testGroup
SID : S-1-5-21-2114067515-1964795913-1973001494-71628
添加一个select语句来修剪响应,或者为每个用户提供OU中的每个用户:
foreach ($user in (get-aduser -SearchScope Subtree -SearchBase $oupath -filter * -Properties samaccountName, MemberOf | select samaccountName)){
Get-ADPrincipalGroupMembership $user.samaccountName | select name}
答案 31 :(得分:-2)
(Get-ADUser $env:username -Properties MemberOf).MemberOf | % {$_.split(",")[0].replace("CN=","")}
Domain Users
Domain Computers
Workstation Admins
Company Users
Company Developers
AutomatedProcessingTeam