Статистика Exchange PowerShell ActiveSync

Я пытаюсь собрать сценарий PowerShell для получения статистики ActiveSync с сервера Exchange. Моя цель - получить отчет, включающий статистику по устройствам ActiveSync и некоторые детали из учетных записей Active Directory, связанных с пользователями. Чтобы быть более конкретным, в дополнение к информации, которую создает сценарий, я пытаюсь захватить атрибуты EmployeeID и businesscategory для каждой учетной записи пользователя. А затем выведите это в 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`

person RXA    schedule 08.12.2014    source источник
comment
У тебя действительно нет вопросов. Что не так или работает не так, как задумано   -  person Matt    schedule 08.12.2014
comment
Извините, если я не понял. Как я упоминал в своем примечании выше, сценарий отлично получает всю информацию, связанную с ActiveSync, но он не извлекает информацию AD (EmployeeID, BusinessCategory), поэтому мне интересно, может ли кто-нибудь указать на мою ошибку. Другое Я хочу записать вывод в файл CSV, что, кажется, не могу сделать с помощью сценария перед вами, поэтому предложения о том, как экспортировать вывод в CSV, будут оценены.   -  person RXA    schedule 08.12.2014
comment
Выводится ли эта информация на экран? Похоже, все, что вы просите, есть на экране консоли? Просто нужно исправить метод вывода, и он должен хорошо перейти в CSV.   -  person Matt    schedule 08.12.2014
comment
Вы правы, он пишет в хост-консоль ... когда я пытаюсь выполнить Export-CSV, я получаю SL с ошибками, а затем появляются недостающие поля AD.   -  person RXA    schedule 08.12.2014


Ответы (2)


Я думаю, что это очень похоже на Мэтта, я просто использовал Add-Member для работы с существующими объектами, а не в командлете Select. Это также оставляет вам массив $Devices, так что вы можете работать с ними позже, если вам нужно.

В основном для каждого устройства каждого человека он добавляет имя человека, адрес электронной почты, EmployeeID и BusinessCategory к объекту устройства, а затем передает их последнему элементу Add-Member, создавая массив объектов устройств, с которыми вы можете работать. Он также выводит для вас в 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:\Path\To\Export.CSV" -NoTypeInformation

Remove-PSSession $sess
person TheMadTechnician    schedule 08.12.2014
comment
Конечно скучал по тебе:}. Если это работает, просто используйте этот. - person Matt; 09.12.2014
comment
Thakss Madtech .. это тоже не сработало .. когда я работаю .. $ ASUser = Get-CASMailbox -Filter {HasActiveSyncDevicePartnership -eq $ True -and DisplayName -not like CAS _ {*} .. а затем $ ASUsers | Выберите SamAccountName .. вывод пустой - person RXA; 09.12.2014
comment
Это говорит мне, что что-то не так с вашим фильтром, или что SamAccountName не является свойством объекта, возвращаемого Get-CASMailbox - person TheMadTechnician; 09.12.2014
comment
Я только что проверил, и этот командлет возвращает CASMailbox, у которого есть свойство SamAccountName. Если вы просто запустите Get-CASMailbox -Filter {HasActiveSyncDevicePartnership -eq $True -and DisplayName -notlike "CAS_{*"}, он что-нибудь вернет? - person TheMadTechnician; 09.12.2014
comment
Но это .. :( ... среди прочего .. EmailAddresses LegacyExchangeDN LinkedMasterAccount PrimarySmtpAddress ProtocolSettings SamAccountName ServerLegacyDN - person RXA; 09.12.2014
comment
И я вижу имена учетных записей, когда получаю .. $ ASUser | Выберите SamAccountName - person RXA; 09.12.2014
comment
Я только что заметил, что вы назначаете $ASUser = , а затем запускаете $ASUsers | Select samAccountName ... вы добавили s к имени переменной во второй команде. - person TheMadTechnician; 09.12.2014
comment
Только что проверил сценарий, над которым я работаю .. без лишних слов - person RXA; 09.12.2014
comment
Только что проверил сценарий, над которым я работаю .. без лишних слов. Похоже, что поле идентификации выводит слишком много информации. Например, когда я запускаю $ ASUser | Выберите $ _. Identity .. Я получаю эти столбцы .. Имя ActiveSyncEnabled OWAEnabled PopEnabled ImapEnabled MapiEnabled .. и поле имени содержит имя пользователя в формате FirstName LastName. - person RXA; 09.12.2014
comment
Я только что исправил ошибку в своем коде ($_ вместо $User). Попробуйте еще раз и дайте мне знать, работает ли он лучше для вас. Если вы получили сообщение об ошибке, обратитесь к той части кода, которая выдает ошибку. - person TheMadTechnician; 10.12.2014
comment
Насколько я могу судить, строка 5 сценария не извлекает нужную мне информацию (SAMAccountName), которая является доступным свойством. откуда я это знаю, когда я запускаю эту строку, в частности, и пытаюсь найти использование SAMAccountName, выполнив $ ASUser.SAMAccountName, вывод будет пустым, - person RXA; 11.12.2014
comment
Даёт ли это вообще какие-то результаты? Если нет, я бы сказал, удалите -фильтр и посмотрите, не в этом ли проблема. - person TheMadTechnician; 11.12.2014
comment
Итак, да, когда я смотрю на вывод $ ASUser, там собирается информация, но поле SAMAccountName не входит в их число. Теперь я представлю, что если я сделаю $ ASUser = Get-CASMailbox -Filter {HasActiveSyncDevicePartnership -eq $ True -and DisplayName -notlike CAS _ {*} с FL в конце, он соберет и сохранит все свойства каждого пользователя, которые я подтвердил делает $ ASUser, но когда я делаю $ ASUser.SAMAccountName после этого, вывод пустой. - person RXA; 11.12.2014
comment
Нет, подключение к Format-List (что является сокращением FL) не заставит командлет Get-CASMailbox волшебным образом собрать дополнительную информацию. - person TheMadTechnician; 11.12.2014
comment
Я думаю, что на этом этапе было бы неплохо узнать, что вы получаете от Get-CASMailbox. Лично у меня нет доступа к этому командлету. - person TheMadTechnician; 11.12.2014

Хорошо, после прочтения комментариев проблема в том, что у вас проблемы с выводом в CSV. Export-CSV возьмет весь вывод и запишет его в файл csv. У вас есть две проблемы:

  1. Вы записываете данные в оболочку, поэтому нет вывода на конвейер
  2. 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:\temp\File.csv" -NoTypeInformation

Приведенный выше код предназначен для замены строки, начинающейся с $ASUser=, до сеанса удаления. Это выводит массив объектов в Export-CSV. Поскольку данные поступают от нескольких объектов, мы собираем их все в большой Select-Object.

Код, который выглядит как @{n=Email;e={$Email}}, является сокращенной формой для @{Name=Email;Expression={$Email}}, который известен как вычисляемое свойство. Мы используем это, поскольку данные сотрудников не являются частью командлета Get-ActiveSyncDeviceStatistics. Довольно уверен, что это работает.

person Matt    schedule 08.12.2014
comment
Спасибо за предложение, Мэтт, и за ваши усилия по созданию примера. Однако я пробовал, но получаю некоторые ошибки. Например: термин «Имя» не распознается как имя командлета, функции, файла сценария или работающей программы. Проверьте написание имени или, если путь был включен, убедитесь, что путь правильный, и повторите попытку. В H: \ scrap \ TS.ps1: 10 символов: 37 + $ Устройство | Select-Object @ {n = Name ‹***; e = {$ Name}}, + CategoryInfo: ObjectNotFound: (Name: String) [], CommandNotFoundException + FullyQualifiedErrorId: CommandNotFoundException - person RXA; 09.12.2014
comment
и ... Get-ActiveSyncDeviceStatistics: невозможно проверить аргумент параметра «Почтовый ящик». Аргумент нулевой или пустой. Укажите аргумент, который не может быть пустым или пустым, а затем повторите команду. По адресу H: \ scrap \ TS.ps1: 9 символов: 54 + $ Device = Get-ActiveSyncDeviceStatistics -Mailbox ‹-------------------------------- $ _. Identity + CategoryInfo: InvalidData: (:) [Get-ActiveSyncDeviceStatistics], ParameterBindingValidationException + FullyQualifiedErrorIdrorIdrorIdmeter: ParameterArrorIdror , Microsoft.Exchange.Management.Tasks.GetMobileDeviceStat istics - person RXA; 09.12.2014
comment
часть этого я не цитирую строки .... это было исправлено. Проверяю другую ошибку. - person Matt; 09.12.2014
comment
Если $_.identity имеет значение null, то, что я сделал, не должно было изменить этого. - person Matt; 09.12.2014
comment
Похоже, я тоже что-то не так, вот что у меня есть, что настраивает их: - person RXA; 09.12.2014
comment
$ ASUser = Get-CASMailbox -Filter {HasActiveSyncDevicePartnership -eq $ True -and DisplayName -not like CAS _ {*} $ ACT = Get-ADUser -ID $ ASUser.SAMAccountName -Properties EmployeeID, BusinessCategory - person RXA; 09.12.2014
comment
Когда я делаю .. $ ASUser = Get-CASMailbox -ID SomeUser, он вытягивает идентификатор, если я использую другой, которого нет. - person RXA; 09.12.2014
comment
@RXA Я вижу там синтаксическую ошибку. Ознакомьтесь с обновленным ответом. Исправлена ​​ошибка, на мой взгляд, неправильная. - person Matt; 09.12.2014
comment
Идентификатор все еще выходит пустым, я снова попытался поиграть с этой строкой, в частности, если я вытащу только одного пользователя, он получит его, но если я отброшу массы в массиве, этого не произойдет. Интересно, нужно ли мне специально вызывать это свойство в: $ ASUser = Get-CASMailbox -Filter {HasActiveSyncDevicePartnership -eq $ True -and DisplayName -notlike CAS_ *} - person RXA; 09.12.2014
comment
Каков результат этого $ASUser | Select Identity? Есть пробелы? У меня нет проблем - person Matt; 09.12.2014
comment
Да, есть пробелы, поэтому вывод ложный: domain.com/OU 1 / Child OU1 / Child OU2 / Some OU Name / User_FirstName User_LastName .. для чего это стоит Я попытался добавить кавычки вокруг $ ASUser.SamAccountName, но этого не произошло Покажи фокус. Кроме того, в сценарии мы запрашиваем пользователей SAMAccountName, поэтому я полагаю, что мне нужно искать $ ASUser | SAMAccountName .. форматируется прямо в форме samaccount. - person RXA; 09.12.2014
comment
Извините ... Я не уточнил. Я имел в виду промежутки между строками, а не пробелы, как будто в выводах было несколько нулей. Поскольку он находится в переменной, его не нужно заключать в кавычки в этом случае. Я протестирую ваш код подробнее. Пока я не получаю ошибок. Вы в ISE? возможно, закройте и снова откройте сеанс, чтобы быть уверенным. @RXA - person Matt; 09.12.2014
comment
Неа, без пробелов. Я использую ISE, но на другом компьютере скрипт выполняется на другом компьютере в PS. - person RXA; 09.12.2014
comment
Спасибо за помощь с этим, Мэтт, но пока без кубиков. - person RXA; 11.12.2014