Como obter todos os grupos de que um usuário é membro?
Get-ADGroupMember
o cmdlet devolve membros de um grupo específico. Existe um cmdlet ou propriedade para obter todos os grupos de que um usuário em particular é membro?
Corrigi o meu erro.:
Get-Member
deve ser {[[0]}.
30 answers
Get-ADPrincipalGroupMembership username | select name
name
----
Domain Users
Domain Computers
Workstation Admins
Company Users
Company Developers
AutomatedProcessingTeam
Uma única linha, sem módulos necessários, usa o utilizador logado actual:
(New-Object System.DirectoryServices.DirectorySearcher("(&(objectCategory=User)(samAccountName=$($env:username)))")).FindOne().GetDirectoryEntry().memberOf
Parabéns a este artigo vbs/powershell: http://technet.microsoft.com/en-us/library/ff730963.aspx
Uma alternativa mais concisa para a postada por Canoas,para obter membros de grupo para o usuário atualmente conectado.
Encontrei este método neste post: http://www.travisrunyard.com/2013/03/26/auto-create-outlook-mapi-user-profiles/
([ADSISEARCHER]"samaccountname=$($env:USERNAME)").Findone().Properties.memberof
Uma versão ainda melhor que usa um regex para remover o guff LDAP e deixa apenas os nomes dos grupos:
([ADSISEARCHER]"samaccountname=$($env:USERNAME)").Findone().Properties.memberof -replace '^CN=([^,]+).+$','$1'
Mais detalhes sobre a utilização do acelerador do tipo [ADSISEARCHER] podem ser encontrados na programação blog do guy: http://blogs.technet.com/b/heyscriptingguy/archive/2010/08/24/use-the-powershell-adsisearcher-type-accelerator-to-search-active-directory.aspx
À moda antiga do CMD:
net user mst999 /domain
(GET-ADUSER –Identity USERNAME –Properties MemberOf | Select-Object MemberOf).MemberOf
Se você não consegue obter-ADPrincipalGroupMembership para trabalhar para você poderia tentar login como esse usuário então usar.
$id = [Security.Principal.WindowsIdentity]::GetCurrent()
$groups = $id.Groups | foreach-object {$_.Translate([Security.Principal.NTAccount])}
$groups | select *
Isto deve fornecer-lhe os detalhes para o utilizador actual. Powershell não precisa.
whoami /groups
Obter membros de grupo para um utilizador:
$strUserName = "Primoz"
$strUser = get-qaduser -SamAccountName $strUserName
$strUser.memberof
Ver Obter a adesão do grupo para um utilizador
Mas também ver os comandos PowerShell livres do Quest para o directório activo .
[editar: o comando Get-ADPrincipalGroupMembership está incluído no Powershell desde v2 com o Windows 2008 R2. Veja a resposta de kstrauss abaixo.]
Get-Member
é um cmdlet para listar os membros de uma. Net object
. Isto não tem nada a ver com a adesão do utilizador/grupo. Você pode obter a adesão do grupo do usuário atual assim:
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
...
Se você precisa de acesso a informações arbitrárias do grupo de usuários, então a sugestão @tiagoinu de usar O Quest AD cmdlets é uma maneira melhor de ir.
Primeiro, importar o módulo activedirectory:
import-module activedirectory
Então emite este comando:
Get-ADGroupMember -Identity $group | foreach-object {
Write-Host $_.SamAccountName
}
Isto irá mostrar os membros do grupo indicado.
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
Não há necessidade de scripts longos quando é um simples liner..
Comando QUEST
(Get-QADUser -Identity john -IncludedProperties MemberOf | Select-Object MemberOf).MemberOf
Comando do MS AD
(GET-ADUSER –Identity john –Properties MemberOf | Select-Object MemberOf).MemberOf
Acho que o cmd do MS AD é mais rápido, mas algumas pessoas gostam mais dos Quest..
Steve
$query = "ASSOCIATORS OF {Win32_Account.Name='DemoUser1',Domain='DomainName'} WHERE ResultRole=GroupComponent ResultClass=Win32_Account"
Get-WMIObject -Query $query | Select Name
Na consulta acima, substitua o DemoUser1 pelo nome de utilizador que deseja e o DomainName pelo seu nome de computador local ou nome de domínio.
Utilizar:
Get-ADPrincipalGroupMembership username | select name | export-CSV username.csv
Isto canaliza o resultado do comando para um ficheiroCSV .
É apenas uma linha:
(get-aduser joe.bloggs -properties *).memberof
Fim de:]
O abaixo funciona bem:
get-aduser $username -Properties memberof | select -expand memberof
Se tem uma lista de utilizadores:
$list = 'administrator','testuser1','testuser2'
$list | `
%{
$user = $_;
get-aduser $user -Properties memberof | `
select -expand memberof | `
%{new-object PSObject -property @{User=$user;Group=$_;}} `
}
Get-ADPrincipalGroupMembership username | Format-Table -auto
Uma segunda abordagem para apresentar isto é especificar as colunas individuais em que está interessado, por exemplo:
Get-ADPrincipalGroupMembership username | select name, GroupScope, GroupCategory
Isto dá a todos os grupos de anúncios o nome de utilizador pertence - mas também apresenta todos os predefinidos as propriedades de cada grupo formatadas como uma tabela.
O principal benefício que isto lhe dá é que você pode ver de relance quais são as listas de distribuição, & quais são os grupos de segurança. Você pode ver mais adiante num olhar que são universais, que são DomainLocal & que são globais.
Porque te importarias com esta última parte?
- O Grupo Universal é um grupo de segurança ou distribuição que contém usuários, grupos e computadores de qualquer domínio em sua floresta como membro. Podes dar direitos dos grupos de segurança universal e permissões de recursos em qualquer domínio da floresta.
- O Grupo Global é um grupo que pode ser usado no seu próprio domínio, em servidores e estações de trabalho do domínio, e em domínios confiantes. Em todos esses locais, você pode dar a um grupo global direitos e as permissões e o Grupo global podem se tornar membros de grupos locais. No entanto, um grupo global pode conter contas de utilizador que são apenas de o seu próprio domínio.
- O Grupo local do domínio é um grupo de segurança ou distribuição que pode conter grupos universais, grupos globais, outros grupos locais de domínio de seu próprio domínio, e relatos de qualquer domínio na floresta. Você pode dar aos grupos de segurança locais do domínio direitos e permissões em recursos que residem apenas no mesmo domínio onde o domínio local o grupo está localizado.
Get-QADUser-SamAccountName LoginID | % {$_.MemberOf } / Get-QADGroup | select name
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.
Não consegui que o seguinte funcionasse para um utilizador em particular:
Get-ADPrincipalGroupMembership username
Lançou um erro que eu não estava disposto a resolver.
No entanto, arranjei uma solução diferente usando o Get-ADUser. Eu gosto um pouco mais porque se você não sabe o nome da conta então você pode obtê-lo baseado em um wildcard no nome real do Usuário. Basta preencher o nome de Partofusers e lá vai ele.
#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
}
Parabéns ao schmeckendeugler e ao 8DH por me fazerem solucao. +1 para ambos.
Para o tornar recursivo, pode usar:
<#
.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
[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
Quando você não tem privilégios para consultar outros grupos de membros, mas você tem o privilégio de consultar os membros do grupo, você pode fazer o seguinte para construir um mapa do qual o utilizador tem acesso a quais grupos.
$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
}
}
Alterar o valor da Base de pesquisa para reflectir a OU que necessita de listar os utilizadores a partir de:)
Isto irá listar todos os utilizadores nesse OU e mostrar-lhe quais os grupos de que são membros.
Get-ADPrincipalGroupMembership USERLOGON / select name
Esta é a maneira mais simples de obter os nomes:
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
Adicione uma declaração de selecção para aparar a resposta ou para obter cada utilizador num OU de cada grupo de:
foreach ($user in (get-aduser -SearchScope Subtree -SearchBase $oupath -filter * -Properties samaccountName, MemberOf | select samaccountName)){
Get-ADPrincipalGroupMembership $user.samaccountName | select name}
Quase todas as soluções acima usaram o módulo ActiveDirecotry
que pode não estar disponível por padrão na maioria dos casos.
Usei o método abaixo. Um pouco indireta, mas serviu o meu propósito.
Lista todos os Grupos Disponíveis
Get-WmiObject -Class Win32_Group
E depois listar os grupos a que o utilizador pertence
[System.Security.Principal.WindowsIdentity]::GetCurrent().Groups
A comparação pode então ser feita através da verificação através do SIDs
. Isso funciona para o usuário logado. Por favor, corrija-me se estiver errado. Completamente novo em PowerShell, mas teve que Faz isto por um compromisso de trabalho.
Com a formatação de entrada e de saída:
[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
}
}
Estou a usar o bloco de código abaixo para emitir um CSV para cada membro do grupo de cada utilizador.
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 ; `
}
O processo de exportação para os grupos e seus respectivos membros foi um pouco complicado, mas o abaixo funciona. Os nomes dos ficheiros de saída incluem o tipo de grupo. Portanto, os grupos de distribuição de E-mail que eu preciso São/devem ser os grupos de distribuição Universal e Global. Eu deveria ser capaz de apagar ou mover os arquivos txt resultantes que eu não preciso.
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=""; `
}
Uso este simples oneliner para procurar recursivamente todos os grupos de que um utilizador é membro:
Get-ADPrincipalGroupMembership $UserName | foreach-object { Get-ADPrincipalGroupMembership $_.SamAccountName | select SamAccountName }
Para filtrar os grupos para descobrir se o utilizador é membro de um grupo específico, eu uso isto:
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" }