Powershell activesync 统计脚本问题

Powershell activesync 统计脚本问题

我正在尝试为我们的人力资源团队生成一份 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-CSVcmdlet 为您完成工作。它有一个-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

相关内容