Script Powershell para gerar todos os grupos de distribuição e grupos aninhados em um csv

3

Oi, sou muito novo no powershell, então posso estar fazendo isso completamente errado, mas tenho que despejar todas as nossas empresas Grupos de distribuição, seus grupos aninhados e os usuários desses grupos em um arquivo csv ou txt. Até agora eu tenho uma lista de todos os nomes dos nossos grupos de distribuição, fazendo

Get-DistributionGroup | select name >> goups.csv

e a partir daí eu estou tentando executá-lo através de um script que cortará o espaço em branco nos nomes e canalizará cada valor através do comando Get-QADGroupMember e gerará a saída em um csv final. Aqui está o que eu tenho até agora ...

Import-Module ActiveDirectory

Add-PSSnapin quest.activeroles.admanagement

$GroupList = Import-Csv groups.csv | ForEach-Object {
$_.PSObject.Properties | ForEach-Object {$_.Name = $_.Name.Trim()}
}

ForEach ($_ in $GroupList){
   $_.Name

 Get-QADGroupMember $_.Name -indirect | sort name >> $_.Name.csv

   }

e agora está dizendo que "Nome" é uma propriedade somente leitura. Eu tentei definir somente leitura como falso através do PowerShell, mas ainda está dando o mesmo erro. Há algo que fiz de errado ao escrever isso?

    
por Austin 06.09.2014 / 01:58

1 resposta

4

Você parece ter sido preso pela propriedade inception

A referência $_.PSObject fornece acesso a metadados de tempo de execução sobre o objeto em questão, sem necessidade de mexer com isso

$GroupList = Import-Csv groups.csv | ForEach-Object {
$_.PSObject.Properties | ForEach-Object {$_.Name = $_.Name.Trim()}
}                                           ^
                                            |
                  This is the Name property of the Name NoteProperty from the CSV

Para a propriedade Name que você deseja, você precisa apenas de uma única execução ForEach-Object. Além disso, como o valor da propriedade Name é a única coisa em que você realmente está interessado, é possível simplesmente descartar $_.Name.Trim() no pipeline, em vez de atribuí-lo a $_.Name ou você pode usar Select-Object :

$GroupList = Import-Csv .\groups.csv | ForEach-Object {
    $_.Name.Trim()
}

$GroupList = Import-Csv .\groups.csv | ForEach-Object {
    $_.Name = $_.Name.Trim()
} | Select-Object -ExpandProperty Name

Você pode fazer com o módulo Active-Directory sozinho, usando a opção -Recursive , que atende ao mesmo propósito que o ActiveRoles ' -Indirect .
Em vez de usar o redirecionamento de saída cmd clássico, você deve enviar a saída para Out-File ou Export-Csv :

foreach($Group in $GroupList)
{
    Get-ADGroupMember $Group -Recursive | Select-Object Name | Sort-Object Name | Out-File "$Group.csv" -Append
}
    
por 06.09.2014 / 03:42

Tags