(Powershell) Método para retornar uma lista de grupos em que um usuário específico possui segurança 'write member'

2

Usamos um software baseado na Web no qual os usuários podem fazer logon para gerenciar o acesso a compartilhamentos controlados com grupos do AD. A lista de grupos que um usuário pode gerenciar são os grupos nos quais eles têm a segurança 'Gravar Membros'. Isso permite que os usuários mantenham compartilhamentos de arquivos sem exigir conhecimento do AD.

Estou tentando escrever um script Powershell usando o quest.activeroles.admanagement que retornará uma lista de grupos em que um usuário especificado tem a segurança 'Write Members', para limpar as permissões para usuários que partiram. Os grupos que preciso pesquisar são armazenados em uma UO, embora haja mais de 1.000 deles.

Eu até agora inventei:

add-pssnapin quest.activeroles.admanagement
Get-QADObject -ShowProgress -SearchRoot 'domain.server.com/path/to/OU' -SearchScope 'OneLevel' -Type Group -SizeLimit 2500 | Get-QADPermission -Rights 'WriteProperty' -Property 'member' -Account "user" -WarningAction SilentlyContinue

Isso funciona bem (no entanto ineficientemente), mas a saída do host é bastante confusa:

Permissions for: full.domain.path/OU/path/group1

Ctrl   Account                                  Rights                              Source           AppliesTo                                    
----   -------                                  ------                              ------           ---------                                    
       Domain\user                              Write member                        Not inherited    This object and all child objects            
Permissions for: full.domain.path/OU/path/group2
       Domain\user                              Write member                        Not inherited    This object and all child objects                        Not inherited    This object and all child objects            
Permissions for: full.domain.path/OU/path/group3
       Domain\user                              Write member                        Not inherited    This object and all child objects                        Not inherited    This object only                             
Permissions for: full.domain.path/OU/path/group4
       Domain\user                              Write member                        Not inherited    This object and all child objects                        Not inherited    This object and all child objects            

Eu recebo as informações necessárias, mas um monte de lixo em torno dele. Se eu canalizar / anexar a um arquivo de texto, só recebo o nome de usuário, não os nomes dos grupos. Idealmente, o que eu quero é apenas uma lista de nomes de grupo sem o caminho OU, ou em um mundo perfeito, um CSV onde a coluna um é o nome de usuário e a coluna dois é o grupo, para que eu possa executar vários usuários (foreach $ username in $ usernames)):

User                Group
domain\username     group_name_one
domain\username     group_name_two
domain\username     group_name_three

Qual seria a melhor maneira de lidar com isso de forma que o Export-CSV cuspisse algo um pouco melhor?

    
por nlseven 11.12.2012 / 09:27

1 resposta

1

Existem dois problemas aqui.

  1. O CMDlet Get-QADPermission está gravando diretamente no console durante a execução, e é por isso que você está vendo Permissions for: ... . Como o pipeline está escrevendo para a mesma saída, tudo fica misturado. Armazene a saída do seu pipeline para uma variável.

  2. Quando você canaliza o grupo para Get-QADPermission , você está jogando fora o objeto do grupo e obtendo um objeto de permissão. Se você quiser manter o objeto original, você precisa filtrar com Where-Object.

Além disso, tenha cuidado com Get-QADPermission . Se você consultar apenas WriteProperty , ele não retornará resultados com acesso de leitura + gravação. Normalmente você quer consultar os dois. E, na maioria dos casos, você também deseja usar -Inherited para obter permissões concedidas pelas OUs pai. Se você realmente está procurando permissões únicas, pode ignorar essa opção.

function Test-UserCanModifyGroupsInOU ($Username, $OU)
{
  $results = Get-QADGroup -SearchScope 'OneLevel' -SearchRoot $OU |
    Where-Object {
      $_ | Get-QADPermission -Rights ReadProperty,WriteProperty -Property member -Account $username
    } |
    Select @{Name="User";Expression={$username}}, @{Name="Group";Expression={$_.Name}}
  $results | Write-Output
  $results | Export-Csv "$username.csv"
}

@("bob","sally") |
  ForEach-Object {
    Test-UserCanModifyGroupsInOU -Username $_ -OU 'domain.org.com/path/to/OU'
  }

Observe também que isso só funciona para permissões em propriedades específicas. Ele não retornará resultados para um usuário que tenha "Controle Total" no grupo, mesmo que eles ainda possam modificar o atributo do membro.

    
por 29.03.2013 / 09:32