Назад | Перейти на главную страницу

Проблема со скриптом статистики Powershell activesync

Я пытаюсь создать отчет CSV для нашей HR-команды, в котором будут перечислены:

Мой сценарий выглядит следующим образом:

$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
}

Кажется, работает нормально, за исключением того, что некоторая информация о пользователе не извлекается, как показано ниже (см. Линн Джонсон):

Lynn Johnson;Lynn.Johnson@castandcrew.com;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;Renee.Thurau@castandcrew.com;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;

Любые идеи? Спасибо!

Корень вашей проблемы в том, что у Линн Джонсон есть несколько устройств, и ваш код предполагает, что Get-MobileDeviceStatistics вернет только один результат.

Поскольку запрос Линн возвращает несколько результатов, ссылка, которую вы сделали на $a.DeviceModel и таковы массивы объектов (вероятно, строки). Вы должны каким-то образом учесть это в зависимости от требований вашего бизнеса. Я предполагаю, что наиболее логичным для того, кто использует CSV, было бы иметь запись для каждого устройства. Итак, если у Линн 3 устройства, у нее будет 3 строки в CSV. Но вы также можете просто попытаться объединить элементы массива в одно объединенное значение столбца. Или вы можете выбрать отчет только по первому устройству и т. Д.

У меня есть еще несколько предложений для вашего сценария.

  • Не использовать -Properties * в твоем Get-ADUser запрос. Это расточительно с точки зрения времени обработки и пропускной способности. Вы уже знаете, какую недвижимость хотите. Так что просто запишите их в сценарий.
  • Не пытайтесь вручную отформатировать вывод CSV. Пусть родной Powershell Export-CSV командлет сделает всю работу за вас. Оно имеет -Delimiter параметр, поэтому вы все равно можете использовать точку с запятой, если вам не нравится запятая по умолчанию.

Очень похоже на Райана, но мне нравится создавать объект, который включает в себя то, что вы хотите, а затем использовать его для создания массива, содержащего все ваши данные. Затем вы можете экспортировать его или работать с ним по желанию.

  • Добавлены явные свойства в ваши запросы
  • Обработка дубликатов мобильных устройств с помощью цикла ForEach
  • Использовал новый $output переменная для использования Export-CSV с -Delimtter ';' вариант

код скрипта:

$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