Get-ADGroupMember
cmdlet ของ PowerShell ส่งคืนสมาชิกของกลุ่มเฉพาะ มี cmdlet หรือคุณสมบัติเพื่อรับกลุ่มทั้งหมดที่ผู้ใช้เฉพาะเป็นสมาชิกหรือไม่?
ฉันคงผิดพลาดของฉัน: ควรจะเป็นGet-Member
Get-ADGroupMember
Get-ADGroupMember
cmdlet ของ PowerShell ส่งคืนสมาชิกของกลุ่มเฉพาะ มี cmdlet หรือคุณสมบัติเพื่อรับกลุ่มทั้งหมดที่ผู้ใช้เฉพาะเป็นสมาชิกหรือไม่?
ฉันคงผิดพลาดของฉัน: ควรจะเป็นGet-Member
Get-ADGroupMember
net user /domain username
ตรวจสอบวิธีการอื่น ๆ ที่Get Groups ซึ่งผู้ใช้เป็นสมาชิกโดยใช้ PowerShell
คำตอบ:
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
เวอร์ชันที่ดียิ่งขึ้นซึ่งใช้ regex เพื่อดึง 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
| 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
โปรดดูรับการเป็นสมาชิกกลุ่มสำหรับผู้ใช้
แต่ยังเห็นเควสฟรี PowerShell คำสั่งสำหรับ Active Directory
[ แก้ไข : คำสั่งGet-ADPrincipalGroupMembershipรวมอยู่ใน Powershell ตั้งแต่เวอร์ชัน 2 พร้อมกับ Windows 2008 R2 ดูคำตอบของ kstrauss ด้านล่าง]
ควรให้รายละเอียดสำหรับผู้ใช้ปัจจุบัน ไม่จำเป็นต้องใช้ Powershell
whoami /groups
Get-Member
เป็น cmdlet 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
...
หากคุณต้องการเข้าถึงข้อมูลกลุ่มผู้ใช้ตามอำเภอใจคำแนะนำ @tiagoinu ในการใช้ cmdlets Quest AD เป็นวิธีที่ดีกว่า
ก่อนอื่นให้นำเข้าโมดูลไดเร็กทอรีการทำงาน:
import-module activedirectory
จากนั้นออกคำสั่งนี้:
Get-ADGroupMember -Identity $group | foreach-object {
Write-Host $_.SamAccountName
}
ซึ่งจะแสดงสมาชิกของกลุ่มที่ระบุ
ไม่ต้องสคริปยาวเมื่อเป็นซับง่ายๆ ..
คำสั่ง 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 ดีกว่า ..
สตีฟ
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 ด้วยชื่อคอมพิวเตอร์หรือชื่อโดเมนของคุณ
ใช้:
Get-ADPrincipalGroupMembership username | select name | export-CSV username.csv
ท่อนี้ผลลัพธ์ของคำสั่งเป็นCSVไฟล์
ฉันเขียนฟังก์ชัน PowerShell ชื่อ Get-ADPrincipalGroupMembershipRecursive ยอมรับ 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 joe.bloggs -properties *).memberof
จุดจบของ :)
select -expandproperty memberof
จะทำให้ผลลัพธ์อ่านง่าย / มีประโยชน์มากขึ้น
ด้านล่างทำงานได้ดี:
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=$_;}} `
}
รับ QADUser -SamAccountName LoginID | % {$ _. MemberOf} | รับ QADGroup | เลือกชื่อ
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 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 ให้คุณทั้งคู่
หากต้องการเรียกใช้ซ้ำคุณสามารถใช้:
<#
.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
แม้ว่าจะมีคำตอบที่ยอดเยี่ยมมากมายที่นี่ แต่ก็มีคำตอบที่ฉันมองหาเป็นการส่วนตัวที่หายไป เมื่อคิดออกแล้ว - ฉันคิดว่าควรโพสต์ไว้ในกรณีที่ต้องการค้นหาในภายหลังหรือสามารถช่วยคนอื่นได้ในบางจุด:
Get-ADPrincipalGroupMembership username | Format-Table -auto
แนวทางที่สองในการนำเสนอสิ่งนี้คือการระบุแต่ละคอลัมน์ที่คุณสนใจเช่น:
Get-ADPrincipalGroupMembership username | select name, GroupScope, GroupCategory
สิ่งนี้ทำให้กลุ่มโฆษณาทั้งหมดมีชื่อผู้ใช้เป็นของ - แต่ยังแสดงคุณสมบัติเริ่มต้นทั้งหมดของแต่ละกลุ่มที่จัดรูปแบบเป็นตารางอย่างสวยงาม
ประโยชน์หลักที่จะช่วยให้คุณคือคุณสามารถดูได้อย่างรวดเร็วว่าเป็นรายการแจกจ่ายและกลุ่มความปลอดภัย คุณสามารถดูเพิ่มเติมได้อย่างรวดเร็วว่า Universal ซึ่งเป็น DomainLocal และซึ่งเป็น Global
ทำไมคุณถึงสนใจบิตสุดท้ายนี้?
เมื่อคุณไม่มีสิทธิ์ในการปรึกษากลุ่มสมาชิกอื่น ๆ แต่คุณมีสิทธิ์ในการปรึกษาสมาชิกกลุ่มคุณสามารถทำสิ่งต่อไปนี้เพื่อสร้างแผนที่ว่าผู้ใช้รายใดสามารถเข้าถึงกลุ่มใดได้
$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)
}
}
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 ที่คุณต้องการเพื่อแสดงรายชื่อผู้ใช้จาก :)
นี่จะแสดงรายชื่อผู้ใช้ทั้งหมดในหน่วยงานนั้นและแสดงให้คุณเห็นว่าพวกเขาเป็นสมาชิกกลุ่มใด
รับ ADPrincipalGroupMembership USERLOGON | เลือกชื่อ
นี่เป็นวิธีที่ง่ายที่สุดในการรับชื่อ:
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}
โซลูชันข้างต้นเกือบทั้งหมดใช้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
ฉันใช้ 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" }