|
Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » PowerShell - [решено] Exchange. Экспорт контактов |
|
PowerShell - [решено] Exchange. Экспорт контактов
|
Новый участник Сообщения: 29 |
Уважаемые, добрый день!
Такая появилась проблема. Необходимо выгружать контакты пользователей из Exchange в автоматическом режиме. Нашел скрипт Скрытый текст
Цитата:
Скрипт работает, но нужно два усовершенствования: 1. Скрипт должен брать credential из txt файла в формате name.name@domain.ru;password 2. Скрипт выгружает только папку контакты. Как задать, чтобы выгружал все подпапки в контактах? Специалисты, помогите, пожалуйста! |
||
Отправлено: 13:15, 14-09-2015 |
Ветеран Сообщения: 1259
|
Профиль | Отправить PM | Цитировать 1. Скрипт должен брать credential из txt файла в формате name.name@domain.ru;password
$pl = Import-Csv password.txt -Delimiter ";" -Header "Login","Password" #Credentials Option 1 using UPN for the windows Account $creds = New-Object System.Net.NetworkCredential($pl.Login,$pl.Password) $service.Credentials = $creds заменить на: Как планируется запускать скрипт ? Правки выше, если есть только 1 пользователь в файле. |
Отправлено: 13:38, 14-09-2015 | #2 |
Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети. Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля. |
Ветеран Сообщения: 1259
|
Профиль | Отправить PM | Цитировать Изменить txt файл в формат:
И уже в цикле передевать значения, скажем: $creds = Import-Csv users.txt -Delimiter ";" foreach ($cred in $creds) { ## Create Exchange Service Object $service = New-Object Microsoft.Exchange.WebServices.Data.ExchangeService($ExchangeVersion) $creds = New-Object System.Net.NetworkCredential($cred.UserName,$cred.Password)) $service.Credentials = $creds $service.AutodiscoverUrl($cred.MailboxName,{$true}) $coFolderView = New-Object Microsoft.Exchange.WebServices.Data.FolderView(1000) $coFolderView.Traversal = "Deep" $sf = New-Object Collections.Generic.List["Microsoft.Exchange.WebServices.Data.SearchFilter"] $sf.Add((New-Object Microsoft.Exchange.WebServices.Data.SearchFilter+IsEqualTo([Microsoft.Exchange.WebServices.Data.FolderSchema]::FolderClass,"IPF.Contact"))) $sf.Add((New-Object Microsoft.Exchange.WebServices.Data.SearchFilter+IsGreaterThan([Microsoft.Exchange.WebServices.Data.FolderSchema]::TotalCount,0))) $sf = New-Object Microsoft.Exchange.WebServices.Data.SearchFilter+SearchFilterCollection([Microsoft.Exchange.WebServices.Data.LogicalOperator]::And, $sf.ToArray()) $service.FindFolders($Contacts.Id,$sf,$coFolderView) |
Отправлено: 16:40, 14-09-2015 | #3 |
Новый участник Сообщения: 29
|
Профиль | Отправить PM | Цитировать Я извиняюсь, но всё же можете подсказать, как именно получить элементы из подпапок и выгрузить их в файл?
И как выгрузить данные с нескольких учётных записей (из users.txt) в разные файлы username.csv? |
Отправлено: 17:56, 14-09-2015 | #4 |
Ветеран Сообщения: 1259
|
Профиль | Отправить PM | Цитировать Формат users.txt:
MailboxName;UserName;Password user1@domai.ru;user@domain.ru;MYPassw01e user2@domai.ru;user@domain.ru;MYPassw01e user3@domai.ru;user@domain.ru;MYPassw01e Add-Type -Path "C:\Program Files\Microsoft\Exchange\Web Services\2.0\Microsoft.Exchange.WebServices.dll" ## Set Exchange Version $ExchangeVersion = [Microsoft.Exchange.WebServices.Data.ExchangeVersion]::Exchange2010_SP2 ## Choose to ignore any SSL Warning issues caused by Self Signed Certificates ## Code From http://poshcode.org/624 ## Create a compilation environment $Provider=New-Object Microsoft.CSharp.CSharpCodeProvider $Compiler=$Provider.CreateCompiler() $Params=New-Object System.CodeDom.Compiler.CompilerParameters $Params.GenerateExecutable=$False $Params.GenerateInMemory=$True $Params.IncludeDebugInformation=$False $Params.ReferencedAssemblies.Add("System.DLL") | Out-Null $TASource=@' namespace Local.ToolkitExtensions.Net.CertificatePolicy{ public class TrustAll : System.Net.ICertificatePolicy { public TrustAll() { } public bool CheckValidationResult(System.Net.ServicePoint sp, System.Security.Cryptography.X509Certificates.X509Certificate cert, System.Net.WebRequest req, int problem) { return true; } } } '@ $TAResults=$Provider.CompileAssemblyFromSource($Params,$TASource) $TAAssembly=$TAResults.CompiledAssembly ## We now create an instance of the TrustAll and attach it to the ServicePointManager $TrustAll=$TAAssembly.CreateInstance("Local.ToolkitExtensions.Net.CertificatePolicy.TrustAll") [System.Net.ServicePointManager]::CertificatePolicy=$TrustAll $creds = Import-Csv users.txt -Delimiter ";" foreach ($cred in $creds) { ## Create Exchange Service Object $service = New-Object Microsoft.Exchange.WebServices.Data.ExchangeService($ExchangeVersion) $creds = New-Object System.Net.NetworkCredential($cred.UserName,$cred.Password)) $service.Credentials = $creds $MailboxName = $cred.MailboxName $service.AutodiscoverUrl($MailboxName,{$true}) "Using CAS Server : " + $Service.url $ExportCollection = @() $Folders = @() $folderid= new-object Microsoft.Exchange.WebServices.Data.FolderId([Microsoft.Exchange.WebServices.Data.WellKnownFolderName]::Contacts,$MailboxName) $Contacts = [Microsoft.Exchange.WebServices.Data.Folder]::Bind($service,$folderid) $Folders += $Contacts.Id $coFolderView = New-Object Microsoft.Exchange.WebServices.Data.FolderView(1000) $coFolderView.Traversal = "Deep" $sf = New-Object Collections.Generic.List["Microsoft.Exchange.WebServices.Data.SearchFilter"] $sf.Add((New-Object Microsoft.Exchange.WebServices.Data.SearchFilter+IsEqualTo([Microsoft.Exchange.WebServices.Data.FolderSchema]::FolderClass,"IPF.Contact"))) $sf.Add((New-Object Microsoft.Exchange.WebServices.Data.SearchFilter+IsGreaterThan([Microsoft.Exchange.WebServices.Data.FolderSchema]::TotalCount,0))) $sf = New-Object Microsoft.Exchange.WebServices.Data.SearchFilter+SearchFilterCollection([Microsoft.Exchange.WebServices.Data.LogicalOperator]::And, $sf.ToArray()) $service.FindFolders($Contacts.Id,$sf,$coFolderView) | Foreach {$Folders += $_.Id} $psPropset = new-object Microsoft.Exchange.WebServices.Data.PropertySet([Microsoft.Exchange.WebServices.Data.BasePropertySet]::FirstClassProperties) $PR_Gender = New-Object Microsoft.Exchange.WebServices.Data.ExtendedPropertyDefinition(14925,[Microsoft.Exchange.WebServices.Data.MapiPropertyType]::Short) $psPropset.Add($PR_Gender) foreach($folder in $folders) { #Define ItemView to retrive just 1000 Items $ivItemView = New-Object Microsoft.Exchange.WebServices.Data.ItemView(1000) $fiItems = $null do { $fiItems = $service.FindItems($Folder,$ivItemView) [Void]$service.LoadPropertiesForItems($fiItems,$psPropset) foreach($Item in $fiItems.Items){ if($Item -is [Microsoft.Exchange.WebServices.Data.Contact]){ $expObj = "" | select DisplayName,GivenName,Surname,Gender,Email1DisplayName,Email1Type,Email1EmailAddress,BusinessPhone,M obilePhone,HomePhone,BusinessStreet,BusinessCity,BusinessState,HomeStreet,HomeCity,HomeState $expObj.DisplayName = $Item.DisplayName $expObj.GivenName = $Item.GivenName $expObj.Surname = $Item.Surname $expObj.Gender = "" $Gender = $null if($item.TryGetProperty($PR_Gender,[ref]$Gender)){ if($Gender -eq 2){ $expObj.Gender = "Male" } if($Gender -eq 1){ $expObj.Gender = "Female" } } $BusinessPhone = $null $MobilePhone = $null $HomePhone = $null if($Item.PhoneNumbers -ne $null){ if($Item.PhoneNumbers.TryGetValue([Microsoft.Exchange.WebServices.Data.PhoneNumberKey]::BusinessPhone,[ref]$BusinessPhone)){ $expObj.BusinessPhone = $BusinessPhone } if($Item.PhoneNumbers.TryGetValue([Microsoft.Exchange.WebServices.Data.PhoneNumberKey]::MobilePhone,[ref]$MobilePhone)){ $expObj.MobilePhone = $MobilePhone } if($Item.PhoneNumbers.TryGetValue([Microsoft.Exchange.WebServices.Data.PhoneNumberKey]::HomePhone,[ref]$HomePhone)){ $expObj.HomePhone = $HomePhone } } if($Item.EmailAddresses.Contains([Microsoft.Exchange.WebServices.Data.EmailAddressKey]::EmailAddress1)){ $expObj.Email1DisplayName = $Item.EmailAddresses[[Microsoft.Exchange.WebServices.Data.EmailAddressKey]::EmailAddress1].Name $expObj.Email1Type = $Item.EmailAddresses[[Microsoft.Exchange.WebServices.Data.EmailAddressKey]::EmailAddress1].RoutingType $expObj.Email1EmailAddress = $Item.EmailAddresses[[Microsoft.Exchange.WebServices.Data.EmailAddressKey]::EmailAddress1].Address } $HomeAddress = $null $BusinessAddress = $null if($item.PhysicalAddresses -ne $null){ if($item.PhysicalAddresses.TryGetValue([Microsoft.Exchange.WebServices.Data.PhysicalAddressKey]::Home,[ref]$HomeAddress)){ $expObj.HomeStreet = $HomeAddress.Street $expObj.HomeCity = $HomeAddress.City $expObj.HomeState = $HomeAddress.State } if($item.PhysicalAddresses.TryGetValue([Microsoft.Exchange.WebServices.Data.PhysicalAddressKey]::Business,[ref]$BusinessAddress)){ $expObj.BusinessStreet = $BusinessAddress.Street $expObj.BusinessCity = $BusinessAddress.City $expObj.BusinessState = $BusinessAddress.State } } $ExportCollection += $expObj } } $ivItemView.Offset += $fiItems.Items.Count } while($fiItems.MoreAvailable -eq $true) } $fnFileName = "c:\temp\" + $MailboxName + "_" + (Get-Date).ToString("ddMMyyyyHHmmss") + "_" + "-ContactsExport.csv" $ExportCollection | Export-Csv -NoTypeInformation -Path $fnFileName -Encoding UTF8 "Exported to " + $fnFileName } |
|
Отправлено: 11:05, 15-09-2015 | #5 |
Новый участник Сообщения: 29
|
Профиль | Отправить PM | Цитировать Kazun,
Скрипт, похоже, перебирает все папки и выдаёт несколько тысяч ошибок. Начинается с Select-object : Не удается найти позиционный параметр, принимающий аргумент "System.Object[]" А потом лопатит все свойства (BusinessPhone и пр.) и на каждое выдаёт ошибку. в результате выгрузка не происходит =\ Поможете? Спасибо огромное! |
Отправлено: 12:24, 15-09-2015 | #6 |
Ветеран Сообщения: 1259
|
Профиль | Отправить PM | Цитировать 1) Оставить только одного пользователя
2) В угадайку играть не буду, каждую строку выполняем отдельно и все ошибки сюда. |
Отправлено: 13:00, 15-09-2015 | #7 |
Новый участник Сообщения: 29
|
Профиль | Отправить PM | Цитировать 1) Оставил 1го пользователя
2) Скрытый текст
Process Contacts
Select-Object : Не удается найти позиционный параметр, принимающий аргумент "System.Object[]". C:\soft\final_ps.ps1:95 знак:19 + $expObj = "" | select DisplayName,GivenName,Surname,Gender,Email1DisplayName, ... + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : InvalidArgument: ( ![]() + FullyQualifiedErrorId : PositionalParameterNotFound,Microsoft.PowerShell.Commands.SelectObjectCommand Не удается найти свойство "DisplayName" для данного объекта. Убедитесь, что оно существует и его можно задать. C:\soft\final_ps.ps1:96 знак:4 + $expObj.DisplayName = $Item.DisplayName + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : InvalidOperation: ( ![]() + FullyQualifiedErrorId : PropertyNotFound Не удается найти свойство "GivenName" для данного объекта. Убедитесь, что оно существует и его можно задать. C:\soft\final_ps.ps1:97 знак:4 + $expObj.GivenName = $Item.GivenName + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : InvalidOperation: ( ![]() + FullyQualifiedErrorId : PropertyNotFound Не удается найти свойство "Surname" для данного объекта. Убедитесь, что оно существует и его можно задать. C:\soft\final_ps.ps1:98 знак:4 + $expObj.Surname = $Item.Surname + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : InvalidOperation: ( ![]() + FullyQualifiedErrorId : PropertyNotFound И далее - остальное вставлять не стал, т.к. ругается на каждый параметр. После перебора всех свойств выдаёт: Скрытый текст
Export-Csv : Не удается привязать аргумент к параметру "InputObject", так как он имеет значение NULL.
C:\soft\final_ps.ps1:153 знак:22 + $ExportCollection | Export-Csv -NoTypeInformation -Path $fnFileName -Encoding U ... + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : InvalidData: ( ![]() + FullyQualifiedErrorId : ParameterArgumentValidationErrorNullNotAllowed,Microsoft.PowerShell.Commands.ExportCsvCommand крайняя ошибка выдаётся ещё несколько тысяч раз, после чего выгрузка записывается, но, в результате, пустая. PS в последней версии скрипта в самом конце была лишняя } Возможно где-то нет { ? |
Последний раз редактировалось rox33, 15-09-2015 в 13:59. Отправлено: 13:52, 15-09-2015 | #8 |
Ветеран Сообщения: 1259
|
Профиль | Отправить PM | Цитировать Убрать пробел в строке с Select в месте ,M obilePhone, должно ,MobilePhone,
|
Отправлено: 13:58, 15-09-2015 | #9 |
Новый участник Сообщения: 29
|
Профиль | Отправить PM | Цитировать Цитата Kazun:
После исправления, в скрипте всё работает. |
|
Последний раз редактировалось rox33, 15-09-2015 в 16:50. Отправлено: 14:12, 15-09-2015 | #10 |
![]() |
Участник сейчас на форуме |
![]() |
Участник вне форума |
![]() |
Автор темы |
![]() |
Сообщение прикреплено |
| |||||
Название темы | Автор | Информация о форуме | Ответов | Последнее сообщение | |
V. 2007 - Экспорт контактов пользователей в CSV файл (Exchange 2007) | rox33 | Microsoft Exchange Server | 5 | 25-06-2013 19:23 | |
PowerShell - экспорт контактов из AD | dosperados | Скриптовые языки администрирования Windows | 3 | 29-12-2011 14:09 | |
V. 2007 - Импорт контактов в Exchange 2007 | barya | Microsoft Exchange Server | 4 | 13-12-2011 08:37 | |
V. 2007 - [решено] Exchange 2003 не отправляет почту на Exchange 2007 | kdsnice | Microsoft Exchange Server | 6 | 14-05-2009 11:18 | |
Экспорт Адрес из Exchange | nureke | Microsoft Exchange Server | 2 | 12-04-2008 09:43 |
|