ユーザーがメンバーになっているすべてのグループを取得するにはどうすればよいですか?


135

PowerShellのGet-ADGroupMemberコマンドレットは、特定のグループのメンバーを返します。特定のユーザーがメンバーであるすべてのグループを取得するコマンドレットまたはプロパティはありますか?


私は私のミスを修正:Get-Memberする必要がありますGet-ADGroupMember


質問は明確ではありません。それをリフレームしたり、例を追加したりできますか?
Mohit Chakraborty

1
stackoverflow.com/questions/668321/…およびtechnet.microsoft.com/en-us/library/dd315351.aspxを参照してください。Get-Memberがあなたが思っていることを実行しますか?
tiago2014

@Mohit Chakrabortyはより明確になりましたか?
Primoz

1
すぐに使用できますnet user /domain usernameユーザーがメンバーであるグループの取得で
Mohamed

回答:


282

Get-ADPrincipalGroupMembershipがこれを行います。

Get-ADPrincipalGroupMembership username | select name

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

1
これにより、これを見つけるのに最も複雑で長時間の方法を使用する必要がなくなりました。powershellがこのようなものになることはわかっていましたが、どこにも見つかりませんでした。+1
Tim Alexander

7
これは、使用可能なActiveDirectoryモジュールに依存することに注意してください。これは、PowerShellスクリプトを実行しているクライアントマシンやダウンレベルのクライアントでは必ずしも機能しません。それを行う場合は、このソリューションを使用してください。
Daniel.S 2014年

5
上記でエラーが発生しました(「サーバーは内部エラーのために要求を処理できませんでした」-サーバーで使用できない機能である可能性があります)。 get-aduser $username -Properties memberof | select -expand memberofでもうまくいきました。
JohnLBevan 2015

5
サーバーではなくWindows 10ワークステーションを使用している場合は、ここからRSATをインストールしてから、import-module activedirectorypowershellコマンドラインで入力すると、これが実行されます。
James Toomey 2017年

3
モジュールがインストールされていない場合:Install-WindowsFeature RSAT-AD-PowerShell
Preben Huybrechts

81

単一行、モジュールは不要、現在ログインしているユーザーを使用:

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

このvbs / powershell記事のクドス:http ://technet.microsoft.com/en-us/library/ff730963.aspx


5
ありがとう、このモジュールなしのバージョンに感謝します。変数をから$env:usernameに変更し$username、で設定するだけで$username = "testuser"、他のユーザールックアップの変数置換を簡単に実行できます。
projectdp 2016年

ここに戻ってもう一度ググってみた!ADツールが使用できないランダムな状況でも引き続き役立ちます。
ネイサン

43

現在ログオンしているユーザーのグループメンバーシップを取得するための、Canoasによって投稿されたもののより簡潔な代替手段。

このブログ投稿でこの方法に出くわしました:http : //www.travisrunyard.com/2013/03/26/auto-create-outlook-mapi-user-profiles/

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

正規表現を使用してLDAPガフを削除し、グループ名のみを残すさらに優れたバージョン:

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

[ADSISEARCHER]タイプアクセラレータの使用の詳細については、scripting guyブログ(http://blogs.technet.com/b/heyscriptingguy/archive/2010/08/24/use-the-powershell-adsisearcher-type)を参照してください。 -accelerator-to-search-active-directory.aspx


1
これらの両方でエラーが発生します。「0」引数を使用して「FindOne」を呼び出す例外:「samaccountname =検索フィルターが無効です。」
ダラス

奇妙なことです。もう一度テストしましたが、Windows 7のまったく異なる環境で、ここでも問題なく動作します。
Daniel.S 2017

まだWin 7で今すぐ再試行しましたが、正常に機能します。たぶん、これを最初に試すときにタイプミスがあったかもしれません。フォレストの「ガフ」を取り除くために置換を追加していただきありがとうございます。
ダラス

2
うまく機能| Sort-Objectします。追加すると読みやすくなります。
Martin Hollingsworth

31

CMDからの古いやり方:

net user mst999 /domain 

1
追加のADツールがなくてもクライアントマシンで機能します
Rast

4
残念ながら、グループ名が長い(21文字を超える)場合は、切り捨てられます...
kiltannen

それは他のすべての方法を打ちます!ブラボー
StayCool

24
(GET-ADUSER Identity USERNAME Properties MemberOf | Select-Object MemberOf).MemberOf

ありがとう!これはうまくいきました。欠点は、返される値が文字列であることだけです。
shaiss

3
| get-adgroupはグループオブジェクトを出力します。鮮やかさ!
2014年

1
または、代わりに$ env:USERNAMEを使用して、現在ログインしているユーザーのユーザー名を取得します
Dave Lucre

6

Get-ADPrincipalGroupMembershipが機能しない場合は、そのユーザーとしてログインしてから使用してください。

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

次のようなものを使用する場合も、ユーザーとしてログインする必要はありません$id = [Security.Principal.WindowsIdentity]("username")
Bitcoin Murderous Maniac

1
これはワンライナーにうまく短縮され[System.Security.Principal.WindowsIdentity]::GetCurrent().Groups | % {$_.Translate([Security.Principal.NTAccount])}ます。
alx9r

5

ユーザーのグループメンバーシップを取得します。

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

ユーザーのグループメンバーシップの取得を参照してください

ただし、QuestのActive Directory用無料のPowerShellコマンドも参照してください。

[ 編集Get-ADPrincipalGroupMembershipコマンドは、Windows 2008 R2のv2以降のPowershellに含まれています。以下のkstraussの回答を参照してください。]


2
実際、Questコマンドレットを使用する簡単な方法があります:Get-QADGroup -Contains Primoz
fenster

18
Get-ADPrincipalGroupMembershipがPowerShellに組み込まれているため、これはもはや最良の答えではありません
Rob Cannon

1
Get-ADPrincipalGroupMembershipを使用する方がはるかに良いため、反対票を投じました。この反対投票を元に戻したいのですが、できません。組み込みオプションが存在することを指摘するために、回答を編集します。
アブラハム

4

Get-Member.NETのメンバーを一覧表示するためのコマンドレットですobject。これはユーザー/グループのメンバーシップとは関係ありません。次のように、現在のユーザーのグループメンバーシップを取得できます。

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

任意のユーザーのグループ情報にアクセスする必要がある場合は、Quest ADコマンドレットの使用に関する@tiagoinuの提案がより適切な方法です。


4

まず、ActiveDirectoryモジュールをインポートします。

import-module activedirectory

次に、次のコマンドを発行します。

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

指定したグループのメンバーが表示されます。


OPは反対を要求します。指定したユーザーがメンバーであるすべてのグループを取得します。
8DH 2014年

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は高速ですが、クエストの方が好きな人もいます。

スティーブ


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をローカルコンピューター名またはドメイン名に置き換えます。


このクエリは非常に時間がかかり、環境に複数のユーザーとグループがある場合、応答が非常に遅くなります
randeepsp

回答を編集している人は誰でも、正しい方法で編集してください。OPにDemoUser1を任意のユーザー名に置き換えることを提案しました。そして、あなたはその意味を完全に変えました。
ラビカンス2015年

4

使用する:

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

これにより、コマンドの出力がCSVファイルにパイプ処理されます。


4

これにより、現在のユーザーの詳細が提供されます。PowerShellは必要ありません。

whoami /groups


3

たった1行です。

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

の終わり :)


これをaにパイピングするselect -expandproperty memberofと、出力が少し読みやすく/便利になります。
Ben Thul 2016

2

Get-ADPrincipalGroupMembershipRecursiveというPowerShell関数を作成しました。ユーザー、コンピューター、グループ、またはサービスアカウントのDSNを受け入れます。アカウントのmemberOf属性からグループの初期リストを取得し、それらのグループのメンバーシップを再帰的にチェックします。省略コードを以下に示します。コメント付きの完全なソースコードはここにあります

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

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


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します。


1

ここには多くの優れた答えがありますが、私が個人的に探していたもののうち、欠けていたものがあります。見つけたら、後で見つけたいときのために投稿するか、実際にどこかで誰かを助けることができると思った。

Get-ADPrincipalGroupMembership username | Format-Table -auto

これを提示するための2番目のアプローチは、関心のある個々の列を指定することです。例:

Get-ADPrincipalGroupMembership username | select name, GroupScope, GroupCategory

これにより、ユーザー名が所属するすべてのADグループが提供されますが、各グループのすべてのデフォルトプロパティが表として適切にフォーマットされます。

これにより得られる主な利点は、配布リストとセキュリティグループを一目で確認できることです。さらに、Universal、DomainLocal、Globalが一目でわかります。
なぜこの最後の部分を気にするのですか?

  • ユニバーサルグループは、フォレスト内の任意のドメインのユーザー、グループ、およびコンピューターをメンバーとして含むセキュリティグループまたは配布グループです。ユニバーサルセキュリティグループに、フォレスト内の任意のドメインのリソースに対する権限とアクセス許可を与えることができます。
  • グローバルグループは、独自のドメイン、メンバーサーバーとドメインのワークステーション、および信頼する側のドメインで使用できるグループです。これらすべての場所で、グローバルグループに権限とアクセス許可を与えることができ、グローバルグループはローカルグループのメンバーになることができます。ただし、グローバルグループには、独自のドメインからのユーザーアカウントのみを含めることができます。
  • ドメインローカルグループは、ユニバーサルグループ、グローバルグループ、独自のドメインの他のドメインローカルグループ、およびフォレスト内の任意のドメインのアカウントを含むことができるセキュリティグループまたは配布グループです。ドメインローカルセキュリティグループには、ドメインローカルグループが配置されているのと同じドメインにのみ存在するリソースに対する権限とアクセス許可を与えることができます。

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内のすべてのユーザーが一覧表示され、ユーザーがメンバーとなっているグループが表示されます。



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. 

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}


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

0

上記のほとんどすべてのソリューションは、ActiveDirecotryほとんどの場合、デフォルトでは使用できない可能性があるモジュールを使用していました。

以下の方法を使用しました。少し間接的ですが、私の目的を果たしました。

使用可能なすべてのグループをリストする

Get-WmiObject -Class Win32_Group

次に、ユーザーが属するグループを一覧表示します

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

次に、を介したチェックによって比較を行うことができSIDsます。これは、ログインしているユーザーに対して機能します。私が間違っていたら訂正してください。PowerShellはまったく新しいものですが、作業を行うためにこれを実行する必要がありました。


既に管理者グループのメンバーであるユーザーをチェックしている場合は、「管理者として実行」でPowerShellを起動してください。そうしないと、2番目のコマンドでグループが正しくリストされません。 this out ... windows ...
Ruifeng Ma

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

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

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

明確にするのを忘れて申し訳ありません。最初にこれを行います:$ aduserDistinguishedName = "CN = name、OU = ..." $ aduser = Get-ADUser -Identity $ aduserDistinguishedName -Properties *
ES44AC SD70MAC

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)
    }
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.