Problema do script de estatísticas Powershell activesync

2

Estou tentando gerar um relatório csv para nossa equipe de RH que listará:

  • nome de exibição
  • endereço SMTP principal
  • samaccountname
  • departamento
  • título
  • escritório
  • gerente
  • status da conta (ativado, desativado)
  • Modelo de dispositivo
  • DeviceOS
  • LastSyncAttemptTime

Meu script é o seguinte:

$users = get-aduser -Filter * '
    -SearchBase "ou=hr,ou=burbank,ou=corp,dc=corp,dc=castandcrew,dc=com" '
    -Properties * | 
    select DisplayName,EmailAddress,samAccountName,Department,Title,Office,Manager,Enabled

 "DisplayName;EmailAddress;samAccountName;Department;Title;Office;Manager;Enabled;DeviceModel;DeviceOS;LastSyncAttemptTime"

foreach ($u in $users) {
    $a = Get-MobileDeviceStatistics -Mailbox $u.EmailAddress | 
        select DeviceModel,DeviceOS,LastSyncAttemptTime

    "{0};{1};{2};{3};{4};{5};{6};{7};{8};{9};" -f
        $u.DisplayName, $u.EmailAddress, $u.samAccountName, $u.Department, $u.Title, $u.Office, $u.Manager, $u.Enabled, $a.DeviceModel, $a.DeviceOS, $a.LastSyncAttemptTime
}

Parece funcionar, mas algumas informações do usuário não são exibidas como mostrado abaixo (consulte Lynn Johnson):

Lynn Johnson;[email protected];ljohnson;Human Resources;SVP, Human Resources;Burbank;CN=Eric Belcher,OU=Users,OU=Restricted,OU=Burbank,OU=Corp,DC=CORP,DC=CASTANDCREW,DC=COM;True;System.Object[];System.Object[];
Renee Thurau;[email protected];rthurau;Human Resources;Executive Asisstant to SVP, Human Resources;Burbank;CN=Lynn Johnson,OU=Users,OU=HR,OU=Burbank,OU=Corp,DC=CORP,DC=CASTANDCREW,DC=COM;True;iPhone8C1;iOS 10.3.3 14G60;

Alguma ideia? Obrigado!

    
por Patrick Carney 12.10.2017 / 17:56

2 respostas

3

A raiz do seu problema é que Lynn Johnson possui vários dispositivos e seu código assume que Get-MobileDeviceStatistics retornará apenas um único resultado.

Como a consulta de Lynn retorna vários resultados, a referência feita a $a.DeviceModel e tal são matrizes de objetos (prováveis sequências). Você precisa contabilizar isso de alguma forma, dependendo dos requisitos do seu negócio. Eu acho que o mais lógico para alguém consumir o CSV seria ter um registro por dispositivo. Então, se Lynn tiver 3 dispositivos, ela terá 3 linhas no CSV. Mas você também pode tentar unir os elementos da matriz em um único valor de coluna combinada. Ou você pode optar por relatar apenas o primeiro dispositivo, etc.

Há algumas outras sugestões que tenho para o seu script também.

  • Não use -Properties * na sua consulta Get-ADUser . É um desperdício em termos de tempo de processamento e largura de banda. Você já sabe quais propriedades você deseja. Então, basta escrevê-los no script.
  • Não tente formatar manualmente a saída CSV. Deixe o cmdlet nativo de Export-CSV do Powershell fazer o trabalho para você. Ele tem um parâmetro -Delimiter , então você ainda pode usar um ponto-e-vírgula se não gostar da vírgula default.
por 12.10.2017 / 18:43
1

Muito parecido com o Ryan, mas gosto de criar um objeto que inclua o que você quer e use isso para criar um array que tenha todos os seus dados. Depois, você pode exportá-lo ou trabalhá-lo conforme desejado.

  • Adicionadas propriedades explícitas às suas consultas
  • Tratou os dispositivos móveis duplicados com um loop ForEach
  • Usou a nova variável $output para utilizar o Export-CSV com a opção -Delimtter ';'

código de script:

$users = get-aduser -Filter * '
    -SearchBase "ou=hr,ou=burbank,ou=corp,dc=corp,dc=castandcrew,dc=com" '
    -Properties DisplayName,EmailAddress,Department,Title,Office,Manager 

# Set up output as an empty array 
$output = @()

foreach ($u in $users) {
    # Get Statistics for that user, making an explicit array
    $Stats = @(Get-MobileDeviceStatistics -Mailbox $u.EmailAddress)

    $Stats | ForEach-Object {
        # Create an anonomous object with the properties we want
        $current = "" | Select-Object "DisplayName","EmailAddress","samAccountName","Department","Title","Office","Manager","Enabled","DeviceModel","DeviceOS","LastSyncAttemptTime" 
        $current.DisplayName = $u.DisplayName
        $current.EmailAddress =$u.EmailAddress
        $current.samAccountName =$u.samAccountName
        $current.Department = $u.Department
        $current.Title = $u.Title
        $current.Office = $u.Office
        $current.Manager = $u.Manager
        $current.Enabled = $u.Enabled
        $current.DeviceModel =  $_.DeviceModel
        $current.DeviceOS = $_.DeviceOS
        $current.LastSyncAttemptTime = $_.LastSyncAttemptTime

        # Add the current object to the output for later 
        $output += $current
    }
}

$output | Export-CSV -Path C:\report.csv -Delimiter ';' -NoTypeInformation -NoClobber
    
por 12.10.2017 / 20:52

Tags