PowerShell Get-ADGroupMember
cmdlet은 특정 그룹의 구성원을 반환합니다. 특정 사용자가 속한 모든 그룹을 가져 오는 cmdlet 또는 속성이 있습니까?
나는 내 실수를 수정 : Get-Member
이어야한다 Get-ADGroupMember
.
net user /domain username
. Get Groups에서 사용자가 구성원 인
PowerShell Get-ADGroupMember
cmdlet은 특정 그룹의 구성원을 반환합니다. 특정 사용자가 속한 모든 그룹을 가져 오는 cmdlet 또는 속성이 있습니까?
나는 내 실수를 수정 : Get-Member
이어야한다 Get-ADGroupMember
.
net user /domain username
. Get Groups에서 사용자가 구성원 인
답변:
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 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
Quest의 Active Directory 용 무료 PowerShell 명령 도 참조하십시오 .
[ 편집 : Get-ADPrincipalGroupMembership 명령은 Windows 2008 R2 v2 이후 Powershell에 포함되어 있습니다. 아래의 kstrauss의 답변을 참조하십시오.]
Get-Member
.NET 멤버를 나열하는 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
...
임의의 사용자 그룹 정보에 액세스해야하는 경우 Quest AD cmdlet 사용에 대한 @tiagoinu 제안이 더 나은 방법입니다.
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-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
이를 제시하는 두 번째 방법은 다음과 같이 관심있는 개별 열을 지정하는 것입니다.
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
}
}
사용자를 나열해야하는 OU를 반영하도록 -SearchBase 값을 변경하십시오. :)
그러면 해당 OU의 모든 사용자가 나열되고 이들이 속한 그룹이 표시됩니다.
Get-ADPrincipalGroupMembership 사용자 로그인 | 이름을 선택하십시오
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 ; `
}
그룹과 각 회원의 수출 과정은 다소 복잡했지만 아래는 작동합니다. 출력 파일 이름에는 그룹 유형이 포함됩니다. 따라서 필요한 전자 메일 그룹은 Universal 및 Global 메일 그룹이어야합니다. 필요하지 않은 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)
}
}