PowerShellのGet-ADGroupMember
コマンドレットは、特定のグループのメンバーを返します。特定のユーザーがメンバーであるすべてのグループを取得するコマンドレットまたはプロパティはありますか?
私は私のミスを修正:Get-Member
する必要がありますGet-ADGroupMember
。
net user /domain username
。ユーザーがメンバーであるグループの取得で
PowerShellのGet-ADGroupMember
コマンドレットは、特定のグループのメンバーを返します。特定のユーザーがメンバーであるすべてのグループを取得するコマンドレットまたはプロパティはありますか?
私は私のミスを修正:Get-Member
する必要がありますGet-ADGroupMember
。
net user /domain username
。ユーザーがメンバーであるグループの取得で
回答:
Get-ADPrincipalGroupMembershipがこれを行います。
Get-ADPrincipalGroupMembership username | select name
name
----
Domain Users
Domain Computers
Workstation Admins
Company Users
Company Developers
AutomatedProcessingTeam
get-aduser $username -Properties memberof | select -expand memberof
でもうまくいきました。
import-module activedirectory
powershellコマンドラインで入力すると、これが実行されます。
単一行、モジュールは不要、現在ログインしているユーザーを使用:
(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"
、他のユーザールックアップの変数置換を簡単に実行できます。
現在ログオンしているユーザーのグループメンバーシップを取得するための、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
| Sort-Object
します。追加すると読みやすくなります。
(GET-ADUSER –Identity USERNAME –Properties MemberOf | Select-Object MemberOf).MemberOf
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])}
ます。
ユーザーのグループメンバーシップを取得します。
$strUserName = "Primoz"
$strUser = get-qaduser -SamAccountName $strUserName
$strUser.memberof
ユーザーのグループメンバーシップの取得を参照してください
ただし、QuestのActive Directory用の無料のPowerShellコマンドも参照してください。
[ 編集:Get-ADPrincipalGroupMembershipコマンドは、Windows 2008 R2のv2以降のPowershellに含まれています。以下のkstraussの回答を参照してください。]
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の提案がより適切な方法です。
シンプルなワンライナーの場合、長いスクリプトは必要ありません。
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は高速ですが、クエストの方が好きな人もいます。
スティーブ
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をローカルコンピューター名またはドメイン名に置き換えます。
たった1行です。
(get-aduser joe.bloggs -properties *).memberof
の終わり :)
select -expandproperty memberof
と、出力が少し読みやすく/便利になります。
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
以下はうまくいきます:
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=$_;}} `
}
特定のユーザーに対して以下を機能させることができませんでした。
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します。
ここには多くの優れた答えがありますが、私が個人的に探していたもののうち、欠けていたものがあります。見つけたら、後で見つけたいときのために投稿するか、実際にどこかで誰かを助けることができると思った。
Get-ADPrincipalGroupMembership username | Format-Table -auto
これを提示するための2番目のアプローチは、関心のある個々の列を指定することです。例:
Get-ADPrincipalGroupMembership username | select name, GroupScope, GroupCategory
これにより、ユーザー名が所属するすべてのADグループが提供されますが、各グループのすべてのデフォルトプロパティが表として適切にフォーマットされます。
これにより得られる主な利点は、配布リストとセキュリティグループを一目で確認できることです。さらに、Universal、DomainLocal、Globalが一目でわかります。
なぜこの最後の部分を気にするのですか?
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内のすべてのユーザーが一覧表示され、ユーザーがメンバーとなっているグループが表示されます。
Get-ADPrincipalGroupMembership USERLOGON | 名前を選択
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.
これは名前を取得する最も簡単な方法です。
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}
それを再帰的にするために、あなたは使うことができます:
<#
.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
上記のほとんどすべてのソリューションは、ActiveDirecotry
ほとんどの場合、デフォルトでは使用できない可能性があるモジュールを使用していました。
以下の方法を使用しました。少し間接的ですが、私の目的を果たしました。
使用可能なすべてのグループをリストする
Get-WmiObject -Class Win32_Group
次に、ユーザーが属するグループを一覧表示します
[System.Security.Principal.WindowsIdentity]::GetCurrent().Groups
次に、を介したチェックによって比較を行うことができSIDs
ます。これは、ログインしているユーザーに対して機能します。私が間違っていたら訂正してください。PowerShellはまったく新しいものですが、作業を行うためにこれを実行する必要がありました。
ユーザー入力と派手な出力フォーマット:
[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
}
}
これを将来の参照用にここに配置します。メールの移行中です。各ユーザーアカウントとそのそれぞれのグループメンバーシップを知る必要があります。また、各グループとそのそれぞれのメンバーを知る必要があります。
以下のコードブロックを使用して、各ユーザーのグループメンバーシップの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=""; `
}
提示されたすべてのコメントを研究することは、私に出発点を与えました(そのようなものに対する感謝)が、いくつかの未解決の問題を私に残しました。結果はここに私の答えです。提供されているコードスニペットは、要求されたものよりも少しだけ機能しますが、役立つデバッグ情報を提供します。
[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
他のメンバーグループにコンサルトする権限はないが、グループメンバーにコンサルトする権限はある場合、次のようにして、どのユーザーがどのグループにアクセスできるかのマップを作成できます。
$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)
}
}