Listar usuários recursivamente na organização grande AD

1

Eu tenho um script que lista recursivamente membros do grupo. O problema é que existem mais de 5K, portanto, não posso usar Get-ADGroupMember e também preciso apenas obter usuários habilitados. O UAC, apesar da documentação da Microsoft, não mostra apenas usuários habilitados. Eu tenho isso, mas ele não filtra habilitado.

Function Get-MyLargeGroup {
[cmdletbinding()]
Param(
[Parameter(Position=0,ValueFromPipeline,ValueFromPipelineByPropertyName)]
[ValidateNotNullorEmpty()]
[string]$Name)

Begin {
    Write-Verbose "Starting $($MyInvocation.MyCommand)"
} #begin

Process {
Write-Verbose "Retrieving members from $Name"
$mygroup = Get-ADGroup -Identity $Name -Properties Members

foreach ($member in $mygroup.members) {
  $object = $member | Get-ADObject -Properties samaccountname,enabled
  if ($object.ObjectClass -eq 'Group') {
    Write-Verbose "Found nested group $($object.distinguishedname)"
    #recursively run this command for the nested group
    & $MyInvocation.MyCommand -name $object.Name
  } 
  else {
   Select-Object -InputObject $object -property ObjectClass,Name,SamAccountname,DistinguishedName,enabled
  }
} #foreach
} #process

End {
    Write-Verbose "Ending $($MyInvocation.MyCommand)"
} #end

} #end function
    
por user206106 26.06.2017 / 15:52

2 respostas

3

A menos que haja alguma limitação muito antiga com o Get-ADUser que não conheço, não deve haver um problema em usá-la para uma consulta que retorne mais de 5k usuários. Acabei de testá-lo a partir de uma caixa 2008 R2 executando o PowerShell 4 e minha consulta Get-ADUser retornou quase 7k usuários com nada além de um parâmetro -Filter * e -SearchBase. Também não estou claro por que você acha que o UAC tem algo a ver com a capacidade de filtrar usuários habilitados.

Independentemente disso, você não precisa realmente de um script recursivo para essa tarefa. Há um filtro LDAP que você pode usar para retornar a lista aninhada completa dos membros de um grupo chamada LDAP_MATCHING_RULE_IN_CHAIN .

# first, get the DN of the group
$groupDN = (Get-ADGroup $Name).DistinguishedName

# now use it to get the nested members
Get-ADUser -LDAPFilter "(memberOf:1.2.840.113556.1.4.1941:=$groupDN)" -Property SamAccountname,Enabled | select ObjectClass,Name,SamAccountname,DistinguishedName,enabled

# alternatively, you can filter out the disabled users in the same query
Get-ADUser -LDAPFilter "(&(memberOf:1.2.840.113556.1.4.1941:=$groupDN)(!(userAccountControl:1.2.840.113556.1.4.803:=2)))" -Property SamAccountname,Enabled | select ObjectClass,Name,SamAccountname,DistinguishedName,enabled
    
por 26.06.2017 / 17:33
0

O motivo pelo qual seu script não está funcionando para usuários habilitados é porque 'enabled' não é uma propriedade válida do cmdlet Get-ADObject. É válido para Get-ADUser e Get-ADComputer. Com o Get-ADObject, você precisa decodificar o valor do atributo userAccountControl .

O limite de 5.000 registros em Get-ADGroupMember é um conjunto de limitações dos Serviços da Web do AD em execução nos seus controladores de domínio. Você pode modificar um parâmetro ADWS para permitir que resultados maiores sejam retornados.

Você pode retornar mais de 5.000 membros do grupo sem modificar os parâmetros do ADWS usando o PowerShell abaixo:

(Get-ADGroup -Identity "SomeGroupName" -Properties Members).members

Você precisaria percorrer esses resultados com o cmdlet Get-ADObject para consultar informações adicionais sobre objetos.

    
por 27.06.2017 / 12:55