Я пытаюсь создать отчет 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
запрос. Это расточительно с точки зрения времени обработки и пропускной способности. Вы уже знаете, какую недвижимость хотите. Так что просто запишите их в сценарий.Export-CSV
командлет сделает всю работу за вас. Оно имеет -Delimiter
параметр, поэтому вы все равно можете использовать точку с запятой, если вам не нравится запятая по умолчанию.Очень похоже на Райана, но мне нравится создавать объект, который включает в себя то, что вы хотите, а затем использовать его для создания массива, содержащего все ваши данные. Затем вы можете экспортировать его или работать с ним по желанию.
$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