ChatGPT解决这个技术问题 Extra ChatGPT

如何获取用户所属的所有组?

PowerShell 的 Get-ADGroupMember cmdlet 返回特定组的成员。是否有 cmdlet 或属性来获取特定用户所属的所有组?

我修正了我的错误:Get-Member 应该是 Get-ADGroupMember

请参阅 stackoverflow.com/questions/668321/…technet.microsoft.com/en-us/library/dd315351.aspx。您确定 Get-Member 会按照您的想法执行吗?
很快你就可以使用net user /domain username,也可以在Get Groups in which a user is a member Using PowerShell查看其他方法

k
kstrauss

Get-ADPrincipalGroupMembership 将执行此操作。

Get-ADPrincipalGroupMembership username | select name

name
----
Domain Users
Domain Computers
Workstation Admins
Company Users
Company Developers
AutomatedProcessingTeam

这只是让我免于使用最复杂和冗长的方法来找到这个。知道powershell会有这样的东西,但在任何地方都找不到。 +1
请注意,这取决于可用的 ActiveDirectory 模块。这不一定适用于运行 PowerShell 脚本的客户端计算机或下级客户端。如果您想这样做,请使用 this solution
以上给了我错误(“由于内部错误,服务器无法处理请求” - 可能是服务器上不可用的功能)。 get-aduser $username -Properties memberof | select -expand memberof 工作正常。
如果您使用的是 Windows 10 工作站而不是服务器,请从 here 安装 RSAT,然后在 powershell 命令行上键入 import-module activedirectory,然后它应该会运行。
如果未安装该模块:Install-WindowsFeature RSAT-AD-PowerShell
J
Jamie Ide

单行,不需要模块,使用当前登录的用户:

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

感谢这篇 vbs/powershell 文章:http://technet.microsoft.com/en-us/library/ff730963.aspx


谢谢,我很欣赏这个无模块版本。我只是将变量从 $env:username 更改为 $username 并设置为 $username = "testuser" 以轻松地为其他用户查找进行变量替换。
刚刚又用谷歌搜索了我回到这里的路!在 AD 工具不可用的随机情况下仍然有用。
不适用于用户的 DEFAULT GROUP 的嵌套成员资格。见这里:stackoverflow.com/questions/53451706/…
要仅获取(排序的)纯组列表,您可以运行 (New-Object System.DirectoryServices.DirectorySearcher("(&(objectCategory=User)(samAccountName=$($env:username)))")).FindOne().GetDirectoryEntry().memberOf -replace "CN=(.*?),.*" ,"``$1" | Sort
D
Daniel.S

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


这两个都给我错误:使用“0”参数调用“FindOne”的异常:“samaccountname= 搜索过滤器无效。”
奇怪....我刚刚再次测试了它,但是在完全不同的环境中的 Windows 7 上,它在这里也可以正常工作。
我刚才又试了一次,还在Win 7上,它确实工作得很好。也许我第一次尝试这个时有错字。感谢您添加替换以去除森林“胡言乱语”。
效果很好,附加 | Sort-Object 使其更具可读性。
不适用于用户的 DEFAULT GROUP 的嵌套成员资格。见这里:stackoverflow.com/questions/53451706/…
L
Linus Kleen

来自 CMD 的老派方式:

net user mst999 /domain 

它也可以在客户端机器上运行,无需额外的 AD 工具
不幸的是-如果您的组名很长(即> 21个字符),那么它将截断它们...
那个比其他方式更胜一筹!布拉沃
m
mattytommo
(GET-ADUSER –Identity USERNAME –Properties MemberOf | Select-Object MemberOf).MemberOf

谢谢!这行得通。唯一的缺点是返回的值是一个字符串。
| get-adgroup 将输出组对象。杰出的!
或者,使用 $env:USERNAME 来获取当前登录用户的用户名
不适用于默认组。见这里:stackoverflow.com/questions/53451706/…
N
Nayan

这应该为您提供当前用户的详细信息。不需要 Powershell。

whoami /groups


这仅对登录的用户 AD 组成员身份有用。但是,如果您需要其他用户或从提升的 shell 运行,这将无济于事。
a
andrew pate

如果您无法让 Get-ADPrincipalGroupMembership 为您工作,可以尝试以该用户身份登录,然后使用。

$id = [Security.Principal.WindowsIdentity]::GetCurrent()
$groups = $id.Groups | foreach-object {$_.Translate([Security.Principal.NTAccount])}
$groups | select *

如果您使用 $id = [Security.Principal.WindowsIdentity]("username") 之类的内容,您也不需要以用户身份登录
这很好地缩短为单行 [System.Security.Principal.WindowsIdentity]::GetCurrent().Groups | % {$_.Translate([Security.Principal.NTAccount])}
k
kiltannen

虽然这里有很多出色的答案,但我个人一直在寻找的答案却不见了。一旦我弄清楚了-我想我应该发布它以防我以后想找到它,或者它实际上在某个时候可以帮助其他人:

Get-ADPrincipalGroupMembership username | Format-Table -auto

第二种方法是指定您感兴趣的各个列,例如:

Get-ADPrincipalGroupMembership username | select name, GroupScope, GroupCategory

这给出了用户名所属的所有 AD 组 - 但也显示了每个组的所有默认属性,格式很好地作为表格。

这给您带来的主要好处是您可以一目了然地看到哪些是分发列表,哪些是安全组。您可以一目了然地看到哪些是通用的,哪些是域本地的,哪些是全局的。你为什么要关心这最后一点?

通用组是一个安全组或通讯组,它包含来自其林中任何域的用户、组和计算机作为成员。您可以授予通用安全组对林中任何域中资源的权限。

全局组是可以在自己的域中、在成员服务器和域的工作站中以及在信任域中使用的组。在所有这些位置,您可以授予全局组权限和权限,并且全局组可以成为本地组的成员。但是,全局组可以包含仅来自其自己域的用户帐户。

域本地组是一个安全或通讯组,它可以包含通用组、全局组、来自其自己域的其他域本地组以及来自林中任何域的帐户。您可以授予域本地安全组对仅驻留在域本地组所在域中的资源的权限和权限。


我同意。如果您想对 PowerShell 中的输出做一些事情(系统管理员可能会这样做),这是更好的解决方案。也比 - 我承认 - 非常优雅的 oneliner 解决方案更容易记住,该解决方案被提议和投票超过 100 次。
r
ravikanth

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 替换为您的本地计算机名或域名。


当环境中有多个用户和组时,此查询非常耗时并且响应非常慢
无论谁正在编辑答案,请确保您以正确的方式进行编辑。我建议 OP 用他想要的任何用户名替换 DemoUser1。而且,你完全改变了那个意思。
A
Abraham

获取用户的组成员身份:

$strUserName = "Primoz"
$strUser = get-qaduser -SamAccountName $strUserName
$strUser.memberof

请参阅Get Group Membership for a User

但也请参阅 Quest 的 Free PowerShell Commands for Active Directory

[编辑:Get-ADPrincipalGroupMembership 命令自 v2 和 Windows 2008 R2 起包含在 Powershell 中。请参阅下面的 kstrauss 的回答。]


实际上,使用 Quest cmdlet 有一种更简单的方法:Get-QADGroup -Contains Primoz
这不再是最佳答案,因为 Get-ADPrincipalGroupMembership 现在已内置于 PowerShell
投反对票是因为使用 Get-ADPrincipalGroupMembership 会好得多。我想撤消这个反对票,但我不能。我将编辑答案以指出现在存在内置选项。
K
Keith Hill

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 是一种更好的方法。


B
Brian Reich

我编写了一个名为 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

不能与用户的默认组一起正常工作。见这里:stackoverflow.com/questions/53451706/…
S
Steve Adkin

当它是一个简单的单行时,不需要长脚本..

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 的 ..

史蒂夫


P
Peter Mortensen

利用:

Get-ADPrincipalGroupMembership username | select name | export-CSV username.csv

这会将命令的输出通过管道传输到 CSV 文件中。


J
Jonathan Rioux

首先,导入 ActiveDirectory 模块:

Import-Module ActiveDirectory

然后发出这个命令:

Get-ADGroupMember -Identity $group | foreach-object {
    Write-Host $_.SamAccountName
}

这将显示指定组的成员。


OP要求相反。获取指定用户所属的所有组。
P
Peter Mortensen

这只是一行:

(get-aduser joe.bloggs -properties *).memberof

结束 :)


将其连接到 select -expandproperty memberof 将使输出更具可读性/实用性。
J
JohnLBevan

以下效果很好:

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=$_;}} `
    }

S
Sathish

Get-QADUser -SamAccountName LoginID | % {$_.MemberOf } |获取-QADGroup |选择名称


S
Sunil Aher
   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. 

A
Adam

我无法让以下内容适用于特定用户:

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。


D
DarkLite1

要使其递归,您可以使用:

<# 
    .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

E
ES44AC SD70MAC

研究提出的所有评论给了我一个起点(感谢这样),但给我留下了几个未解决的问题。结果这里是我的答案。提供的代码片段比要求的要多一点,但它提供了有用的调试信息。

[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

对不起,我忘了澄清。首先执行此操作: $aduserDistinguishedName = "CN=name,OU=..." $aduser = Get-ADUser -Identity $aduserDistinguishedName -Properties *
k
kiltannen

当您没有权限咨询其他成员组但您有权限咨询组成员时,您可以执行以下操作来构建哪个用户可以访问哪些组的映射。

$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)
    }
}

j
john v kumpf

对于 LOCAL 用户和组(即不在 Active Directory 中),如果您不想、不允许或无法安装 RSAT 和/或 Install-WindowsFeature RSAT-AD-PowerShell 和/或 import-module activedirectory,那么这里有纯粹的、预装的 powershell (5.1+) 方式来做到这一点。

(注意:下面使用的 Get-LocalGroup* 仅适用于 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))

$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
    } 
}

示例输出:

Administrators
Users

此方法与 Active Directory 无关。
@Slogmeister Extraordinaire 我的理由是一些搜索这个问题的互联网用户会对不在活动目录中的本地组感兴趣
@johnvkrumpf 了解,但您的回答并不表明它不是 Active Directory 解决方案。它表明,如果您无法加载 AD 模块/工具,这将起作用,但在这种情况下不会。该问题专门要求使用 AD 解决方案。我并不反对你的推理,但是因为我已经多次这样做了。但是,请考虑到读者可能不理解您的答案不适用于 AD,并且尝试非常沮丧。修改您的答案以清楚地表明这是一个非 AD 解决方案,我会支持它。
S
Stephen Galvin
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 中的所有用户,并向您显示他们属于哪些组。


J
Jacob Fischlein

获取 ADPrincipalGroupMembership USERLOGON |选择名称


S
Stuart

这是获取名称的最简单方法:

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}


R
Ruifeng Ma

几乎所有上述解决方案都使用了 ActiveDirecotry 模块,在大多数情况下默认情况下可能不可用。

我使用了下面的方法。有点间接,但符合我的目的。

列出所有可用组

Get-WmiObject -Class Win32_Group

然后列出用户所属的组

[System.Security.Principal.WindowsIdentity]::GetCurrent().Groups

然后可以通过检查 SIDs 进行比较。这适用于登录用户。如果我错了,请纠正我。对 PowerShell 来说是全新的,但为了工作承诺必须完成这项工作。


如果您正在检查一个已经是管理员组成员的用户,请确保通过“以管理员身份运行”启动 PowerShell,否则第二个命令将无法正确列出这些组......需要很长时间才能弄清楚这外面...窗户...
c
coinbird

使用用户输入和精美的输出格式:

[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 
    } 
}

u
user208145

将其放在这里以供将来参考。我正在进行电子邮件迁移。我需要知道每个用户帐户及其各自的组成员身份,还需要了解每个组及其各自的成员。

我正在使用下面的代码块为每个用户的组成员资格输出一个 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=""; `
  }

关注公众号,不定期副业成功案例分享
关注公众号

不定期副业成功案例分享

领先一步获取最新的外包任务吗?

立即订阅