我正在尝试将Powershell脚本放在一起,以便从Exchange服务器检索ActiveSync统计信息。我的目标是获得一份报告,其中包括有关ActiveSync设备的统计信息以及与用户关联的Active Directory帐户的一些详细信息。除了脚本生成的信息之外,为了更具体地说明,我正在尝试捕获每个用户帐户的 EmployeeID 和业务类别属性。然后将其输出到 csv。
公平地说,我不是Powershell专家,并且从我在网上找到的示例中增强了此脚本。任何反馈/建议将不胜感激。
$DCSession = "DC1"
$sess = New-PSSession -computer $DCSession
Invoke-Command -session $sess -script { Import-Module ActiveDirectory }
Import-PSSession -session $sess -module ActiveDirectory
$ASUser = Get-CASMailbox -Filter {HasActiveSyncDevicePartnership -eq $True -and DisplayName -notlike "CAS_{*"}
$ACT = Get-ADUser -ID $ASUser.SAMAccountName -Properties EmployeeID, BusinessCategory
$ASUser | ForEach {$Name = $_.Name; $EMail = $_.PrimarySMTPAddress; $Device = Get- ActiveSyncDeviceStatistics -Mailbox $_.identity; $Device | ForEach {Write-Host $Name, $Email, $ACT.EmployeeID, $ACT.BusinessCategory, $_.devicemodel, $_.devicephonenumber, $_.deviceid, $_.FirstSyncTime, $_.LastSuccessSync} }
Remove-PSSession $sess`
我认为这与Matt的非常相似,我只是使用Add-Member来处理现有对象,而不是在Select cmdlet中执行此操作。这也为您留下了$Devices
数组,以便您以后可以在需要时使用它们。
基本上,对于每个人的每个设备,它将人员的姓名,电子邮件地址,EmployeeID和BusinessCategory添加到设备的对象中,然后在最后一个添加成员上传递该内容,从而创建您可以使用的设备对象数组。它还会为您输出到 CSV。
$DCSession = "DC1"
$sess = New-PSSession -computer $DCSession
Invoke-Command -session $sess -script { Import-Module ActiveDirectory }
Import-PSSession -session $sess -module ActiveDirectory
$ASUser = Get-CASMailbox -Filter {HasActiveSyncDevicePartnership -eq $True -and DisplayName -notlike "CAS_{*"}
$Devices = ForEach($User in $ASUser) {
$ACT = Get-ADUser -ID $User.SAMAccountName -Properties EmployeeID, BusinessCategory
Get-ActiveSyncDeviceStatistics -Mailbox $_.identity | ForEach{
Add-Member -InputObject $_ -NotePropertyName 'EmployeeID' -NotePropertyValue $ACT.EmployeeID
Add-Member -InputObject $_ -NotePropertyName 'BusinessCategory' -NotePropertyValue $ACT.BusinessCategory
Add-Member -InputObject $_ -NotePropertyName 'Name' -NotePropertyValue $User.Name
Add-Member -InputObject $_ -NotePropertyName 'Email' -NotePropertyValue $User.PrimarySMTPAddress -PassThru
}
}
$Devices | Select Name,Email,EmployeeID,BusinessCategory,DeviceModel,DevicePhoneNumber,DeviceID,FirstSyncTime,LastSyncTime | Export-CSV "C:PathToExport.CSV" -NoTypeInformation
Remove-PSSession $sess
,阅读评论后,问题是您在输出到 csv 时遇到问题。 Export-CSV
将获取所有输出并将其写入 csv 文件。您遇到的两个问题是
- 您正在将数据写入 shell,因此没有输出到管道
-
Export-Csv
首选对象输出到文件。 在这种情况下,Add-Content
可能有效。
$ASUser = Get-CASMailbox -Filter {HasActiveSyncDevicePartnership -eq $True -and DisplayName -notlike "CAS_*"}
$ACT = Get-ADUser -ID $ASUser.SAMAccountName -Properties EmployeeID, BusinessCategory
$ASUser | ForEach {
$Name = $_.Name
$EMail = $_.PrimarySMTPAddress
$Device = Get-ActiveSyncDeviceStatistics -Mailbox $_.identity
$Device | Select-Object @{n="Name";e={$Name}},
@{n="Email";e={$Email}},
@{n="EmployeeID";e={$ACT.EmployeeID}},
@{n="BusinessCategory";e={$ACT.BusinessCategory}},
devicemodel,devicephonenumber,deviceid,FirstSyncTime,LastSuccessSync
} | Export-CSV -Path "C:tempFile.csv" -NoTypeInformation
上面的代码旨在替换从 $ASUser=
开始直到 Remove 会话的行。这样做的作用是输出一个对象数组来Export-CSV
。由于数据来自多个对象,因此我们将其全部收集在一个大Select-Object
中。
看起来像@{n=Email;e={$Email}}
的代码是@{Name=Email;Expression={$Email}}
的简写形式,称为计算属性。我们之所以使用它,是因为员工数据不是Get-ActiveSyncDeviceStatistics
cmdlet 的一部分。很确定这有效。