我正在尝试为我们的人力资源团队生成一份 csv 报告,其中列出:
- 显示名称
- 主要 smtp 地址
- 帐户名
- 部门
- 标题
- 办公室
- 经理
- 账户状态(启用、禁用)
- 设备型号
- 设备操作系统
- 上次同步尝试时间
我的脚本如下:
$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;[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;
有什么想法吗?谢谢!
答案1
问题的根源在于 Lynn Johnson 拥有多个设备,而您的代码假定Get-MobileDeviceStatistics
只会返回一个结果。
因为 Lynn 的查询返回多个结果,所以您引用的引用$a.DeviceModel
等都是对象数组(可能是字符串)。您需要根据业务需求以某种方式考虑到这一点。我猜对于使用 CSV 的人来说,最合乎逻辑的做法是每个设备都有一条记录。因此,如果 Lynn 有 3 个设备,那么她在 CSV 中会有 3 行。但您也可以尝试将数组的元素合并为一个组合列值。或者您可以选择仅报告第一台设备,等等。
我对您的脚本还有一些其他建议。
- 不要
-Properties *
在查询中使用Get-ADUser
。这会浪费处理时间和带宽。您已经知道需要哪些属性。因此只需在脚本中写出它们即可。 - 不要尝试手动格式化 CSV 输出。让 Powershell 的原生
Export-CSV
cmdlet 为您完成工作。它有一个-Delimiter
参数,因此如果您不喜欢逗号默认设置,您仍然可以使用分号。
答案2
与 Ryan 非常相似,但我喜欢构建一个包含所需内容的对象,然后使用它来创建一个包含所有数据的数组。然后您可以根据需要导出或使用它。
- 为您的查询添加了明确的属性
- 使用 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