grupo - listar usuarios active directory powershell
¿Cómo obtener todos los grupos de los que un usuario es miembro? (25)
Camino de la vieja escuela de CMD:
net user mst999 /domain
El cmdlet Get-ADGroupMember
devuelve miembros de un grupo específico. ¿Hay un cmdlet o propiedad para obtener todos los grupos de los que un usuario en particular es miembro?
Get-ADGroupMember
mi error: Get-Member
debería ser Get-ADGroupMember
.
Casi todas las soluciones anteriores utilizaron el módulo ActiveDirecotry
, que podría no estar disponible de forma predeterminada en la mayoría de los casos.
Usé el siguiente método. Un poco indirecto, pero cumplió mi propósito.
Listar todos los grupos disponibles
Get-WmiObject -Class Win32_Group
Y luego enumere los grupos a los que pertenece el usuario
[System.Security.Principal.WindowsIdentity]::GetCurrent().Groups
La comparación se puede hacer a través de la verificación a través de los SIDs
. Esto funciona para el usuario que ha iniciado sesión. Por favor, corríjame si estoy equivocado. Completamente nuevo para PowerShell, pero tuve que hacer esto para un compromiso de trabajo.
Con la entrada del usuario y el formato de salida elegante:
[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
}
}
El siguiente funciona bien:
get-aduser $username -Properties memberof | select -expand memberof
Si tiene una lista de usuarios:
$list = ''administrator'',''testuser1'',''testuser2''
$list | `
%{
$user = $_;
get-aduser $user -Properties memberof | `
select -expand memberof | `
%{new-object PSObject -property @{User=$user;Group=$_;}} `
}
Es solo una linea
(get-aduser joe.bloggs -properties *).memberof
final de :)
Escribí una función de PowerShell llamada Get-ADPrincipalGroupMembershipRecursive. Acepta el DSN de un usuario, computadora, grupo o cuenta de servicio. Recupera una lista inicial de grupos del atributo memberOf de la cuenta, luego revisa recursivamente las membresías de ese grupo. El código abreviado está debajo. El código fuente completo con comentarios se puede encontrar aquí .
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
Esta es la forma más sencilla de obtener los nombres:
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
Agregue una declaración de selección para recortar la respuesta o para obtener a cada usuario en una unidad organizativa en cada grupo del que es usuario:
foreach ($user in (get-aduser -SearchScope Subtree -SearchBase $oupath -filter * -Properties samaccountName, MemberOf | select samaccountName)){ Get-ADPrincipalGroupMembership $user.samaccountName | select name}
Get-ADPrincipalGroupMembership USERLOGON | seleccionar nombre
Get-ADPrincipalGroupMembership hará esto.
Get-ADPrincipalGroupMembership username | select name
name
----
Domain Users
Domain Computers
Workstation Admins
Company Users
Company Developers
AutomatedProcessingTeam
Get-Member no es para obtener la membresía grupal del usuario. Si desea obtener una lista de grupos a los que pertenece un usuario en el sistema local, puede hacerlo de la siguiente manera:
$query = "ASSOCIATORS OF {Win32_Account.Name=''DemoUser1'',Domain=''DomainName''} WHERE ResultRole=GroupComponent ResultClass=Win32_Account"
Get-WMIObject -Query $query | Select Name
En la consulta anterior, reemplace DemoUser1 con el nombre de usuario que desee y DomainName con el nombre de su computadora local o el nombre de dominio.
Get-QADUser -SamAccountName ID de inicio de sesión | % {$ _. MemberOf} | Get-QADGroup | seleccionar nombre
No hay necesidad de largas secuencias de comandos cuando se trata de un simple trazador de líneas.
Comando QUEST
(Get-QADUser -Identity john -IncludedProperties MemberOf | Select-Object MemberOf).MemberOf
Comando MS AD
(GET-ADUSER –Identity john –Properties MemberOf | Select-Object MemberOf).MemberOf
Encuentro que el cmd de MS AD es más rápido, pero a algunas personas les gustan más las Quest.
Steve
No pude conseguir que lo siguiente funcione para un usuario en particular:
Get-ADPrincipalGroupMembership username
Lanzó un error que no estaba dispuesto a solucionar.
Sin embargo, presenté una solución diferente usando Get-ADUser. Me gusta un poco mejor porque si no conoces el nombre de la cuenta, puedes obtenerlo a partir de un comodín en el nombre real del usuario. Solo completa PartOfUsersName y lo guarda .
#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
}
Grandes apoyos para schmeckendeugler y 8DH para llegar a esta solución. +1 a ambos.
Obtener membresía grupal para un usuario:
$strUserName = "Primoz"
$strUser = get-qaduser -SamAccountName $strUserName
$strUser.memberof
Ver Obtener membresía grupal para un usuario
Pero también vea los Comandos de PowerShell gratuitos de Quest para Active Directory .
[ Editar : El comando Get-ADPrincipalGroupMembership se incluye en Powershell desde v2 con Windows 2008 R2. Vea la respuesta de kstrauss abajo.]
Para obtenerlo recursivo, puede 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
Poniendo esto aquí para referencia futura. Estoy en medio de una migración de correo electrónico. Necesito saber cada cuenta de usuario y su respectiva membresía grupal, y también necesito conocer cada grupo y sus respectivos miembros.
Estoy usando el siguiente bloque de código para generar un archivo CSV para cada miembro del grupo de usuarios.
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 ; `
}
El proceso de exportación para los grupos y sus respectivos miembros fue un poco intrincado, pero el siguiente funciona. Los nombres de archivo de salida incluyen el tipo de grupo. Por lo tanto, los grupos de distribución de correos electrónicos que necesito son / deberían ser los grupos de Distribución Universal y Global. Debería poder eliminar o mover los archivos TXT resultantes que no necesito.
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=""; `
}
Primero, importe el módulo activedirectory:
import-module activedirectory
Luego emita este comando:
Get-ADGroupMember -Identity $group | foreach-object {
Write-Host $_.SamAccountName
}
Esto mostrará los miembros del grupo especificado.
Si no tiene privilegios para consultar a otros grupos miembros, tiene el privilegio de consultar a los miembros del grupo. puede hacer lo siguiente para crear un mapa de qué usuario tiene acceso a qué 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)
}
}
Una alternativa más concisa a la publicada por Canoas, para obtener membresía grupal para el usuario que actualmente está conectado.
Encontré este método en esta publicación de blog: http://www.travisrunyard.com/2013/03/26/auto-create-outlook-mapi-user-profiles/
([ADSISEARCHER]"samaccountname=$($env:USERNAME)").Findone().Properties.memberof
Una versión aún mejor que usa una expresión regular para quitar la máscara de LDAP y deja solo los nombres de los grupos:
([ADSISEARCHER]"samaccountname=$($env:USERNAME)").Findone().Properties.memberof -replace ''^CN=([^,]+).+$'',''$1''
Se pueden encontrar más detalles sobre el uso del acelerador de tipo [ADSISEARCHER] en el blog del tipo scripting: http://blogs.technet.com/b/heyscriptingguy/archive/2010/08/24/use-the-powershell-adsisearcher-type-accelerator-to-search-active-directory.aspx
Una sola línea, sin módulos necesarios, usa el usuario registrado actual:
(New-Object System.DirectoryServices.DirectorySearcher("(&(objectCategory=User)(samAccountName=$($env:username)))")).FindOne().GetDirectoryEntry().memberOf
Qudos de este artículo de vbs / powershell: http://technet.microsoft.com/en-us/library/ff730963.aspx
Utilizar:
Get-ADPrincipalGroupMembership username | select name | export-CSV username.csv
Esto canaliza la salida del comando a un archivo CSV .
Get-Member
es un cmdlet para listar los miembros de un object
.NET. Esto no tiene nada que ver con la membresía del usuario / grupo. Puede obtener la membresía del grupo del usuario actual así:
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
...
Si necesita acceder a la información de grupo de usuarios arbitrarios, la sugerencia de @tiagoinu de usar los cmdlets de Quest AD es una mejor manera de hacerlo.
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-ADUSER –Identity USERNAME –Properties MemberOf | Select-Object MemberOf).MemberOf
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
}
}
Cambie el valor de -SearchBase para reflejar la OU que necesita para enumerar a los usuarios desde :)
Esto mostrará una lista de todos los usuarios en esa unidad organizativa y le mostrará a qué grupos pertenecen.