Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » PowerShell - [решено] PS: Синхронизация контактов Outlook`a с AD

Ответить
Настройки темы
PowerShell - [решено] PS: Синхронизация контактов Outlook`a с AD

Аватара для dosperados

Пользователь


Сообщения: 77
Благодарности: 0

Профиль | Отправить PM | Цитировать


Пишу скрипт по синхронизации Email адресов, которые хранятся в АД и контактов в Outlook`е.
Смысл в том, что скрипт по добавлению Email адресов из АД в Outlook уже есть он описан на форуме тут
Но при каждом запуске скрипта в Outlook`e появляются дубликаты одних и тех же записей.
Я хочу написать скриптик который бы делал вот что:
1) При импорте проверял бы есть такой контакт в Outlook`e, если есть то повторно не импортировать, если же нету то импортировался но с дополнительным полем которое бы указывало на то, что этот объект импортирован из АД
2) Потом бы проверялись контакты в Outlook`e если контакт имеет поле импортирован то такойже объект ищется в АД если его там нету то этот контакт удаляется из Outlook`а, если же контакт создал сам пользователь и у него нету поля которое показывает что он создан при импорте то этот контакт остается без изменения.

так вот я не знаю как правильно реализовать то что я хочу и я пошел обходным путем (если кто знает как сделать правильней и лучше подскажите!!!):
Я сначала удаляю контакты из Outlook`а в которых присутствуют поля означающие что этот контакт импортирован (у меня за это отвечает два поля $_.Mileage и $_.BusinessHomePage) контакты созданные пользователем не трогаем. Потом необходимо проделать импорт из АД в Outlook с полями означающими импорт.

так вот у меня неправильно работает удаление контактов с полем означающим импорт.
я делаю это так:
PHP код: Выделить весь код

#Подключаемся к Outlook

$outlook = New-Object -ComObject Outlook.Application
$mapi 
$outlook.GetNamespace("MAPI")
#Получаем папку контактов
$Contacts $mapi.GetDefaultFolder(10).Items
$Contacts 
| ForEach { 
 if (
$_.Mileage -match "1" )        
     {if (
$_.BusinessHomePage -match "http://company.com/" )        
        {
Write-Host " Импортированный контакт " $_.LastName $_.Email1Address  -ForegroundColor blue $_.delete() }  
    } 
       else { 
Write-Host " Пользовательский контакт " $_.LastName $_.Email1Address  -ForegroundColor Red}
                            } 

когда запускаешь этот скрипт без метода $_.delete() то все проходит как положено все контакты правильно показываются какие импортированы а какие пользовательские, а когда же ставим метод $_.delete() то контакты как бы делятся на две части и удаляются только половина импортированных контактов. И так чтобы удалить все импортированные контакты надо несколько раз запустить скрипт на удаление…
Почему так, помогите!!! Или предложите другой метод, всем предложения решения задачи буду рад!!!

Отправлено: 11:36, 06-09-2011

 

Аватара для dosperados

Пользователь


Сообщения: 77
Благодарности: 0

Профиль | Отправить PM | Цитировать


Что-то ни кто даже слово не напишет) что все боятся запустить у себя этот скрипт!? Он ничего не удалит если не будет в контакте особых полей ($_.Mileage и $_.BusinessHomePage) с нужными значениями. только если два этих поля удовлетворили условию тогда этот контакт удалиться...

Мне нужен совет гуру, почему при тесте без использования $_.delete() все работает как положено, а с ним неправильно!!!
Ну или вообще как подругому сделать)

Отправлено: 05:51, 07-09-2011 | #2



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Ветеран


Сообщения: 27449
Благодарности: 8087

Профиль | Отправить PM | Цитировать


dosperados, возможно, это как-то связано с перемещением по коллекции. Я с чем-то подобным при работе с коллекциями сталкивался и под WSH.

Попробуйте работать не с коллекцией, а с выборкой по условию:
Код: Выделить весь код
$outlook = New-Object -ComObject Outlook.Application
$mapi = $outlook.GetNamespace("MAPI")

$Contacts = $mapi.GetDefaultFolder(10).Items

$Contact = $Contacts.Find("[Mileage] = ""1"" AND [BusinessHomePage] = ""http://company.com/""")

while ($Contact -ne $null) {
    Write-Host $Contact.LastName $Contact.Email1Address $Contact.EntryID -ForegroundColor blue
    
    $Contact.Delete()
    $Contact = $Contacts.FindNext()
}
Это сообщение посчитали полезным следующие участники:

Отправлено: 08:37, 07-09-2011 | #3


Аватара для dosperados

Пользователь


Сообщения: 77
Благодарности: 0

Профиль | Отправить PM | Цитировать


Iska, Спасибо твой метод работает как положенно, но кто знает как реализовать мою задумку не через попу как сейчас, а правильно!?

Отправлено: 18:47, 07-09-2011 | #4


Аватара для dosperados

Пользователь


Сообщения: 77
Благодарности: 0

Профиль | Отправить PM | Цитировать


Такой вопрос: я создаю в папке "\\Outlook\Контакты" подпапку "Контакты моей компании" саму папку я успешно создаю, но если начинаешь создавать контакты в ней, они сохраняется в папке "Контакты", а мне надо чтобы он сохранился в подпапке "Контакты моей компании".
Кто решал такую проблему подскажите...
PHP код: Выделить весь код

#Подключаемся к Outlook

$outlook = New-Object -ComObject Outlook.Application
$mapi 
$outlook.GetNamespace("MAPI")
#Получаем папку контактов для сохранения новых
$Contacts =  $mapi.GetDefaultFolder(10)
  
# Проверяем создана ли подпапка "контакты фирмы" если не создана, то создаем ее.
  
$CompanyContFolder  =   $Contacts.Folders.Item("Контакты моей компании")
  if (
$CompanyContFolder -eq $null) { 
  
$CompanyContFolder  =   $Contacts.Folders.Add("Контакты моей компании")
  
$CompanyContFolder  =   $Contacts.Folders.Item("Контакты моей компании"
  
Write-Host "Папка компании создана и выбрана" -ForegroundColor DarkRed }
  
  
$CompanyContFolder $outlook.Application.CreateItem(2)
    
$CompanyContFolder.LastName "Test_LastName"
    
$CompanyContFolder.Email1Address "test@email.ru"
    
$CompanyContFolder.CompanyName "Моя комания"
    
$CompanyContFolder.Department "test_Department"
    
$CompanyContFolder.BusinessHomePage "http://company.com/"
    
$CompanyContFolder.Mileage "1"
    
#Сохраняем контакт
    
$CompanyContFolder.Save() 


Последний раз редактировалось dosperados, 08-09-2011 в 11:29. Причина: ошибка орфографическая


Отправлено: 11:26, 08-09-2011 | #5


Ветеран


Сообщения: 27449
Благодарности: 8087

Профиль | Отправить PM | Цитировать


dosperados, попробуйте так:
Код: Выделить весь код
$oOutlook    = New-Object -ComObject Outlook.Application
$oNameSpace  = $oOutlook.GetNamespace("MAPI")
$oMAPIFolder = $oNameSpace.GetDefaultFolder(10)

try {
    $oMyMAPIFolder = $oMAPIFolder.Folders.Item("Контакты моей компании")
} catch {
    $oMyMAPIFolder = $oMAPIFolder.Folders.Add("Контакты моей компании")
}

$oContact = $oMyMAPIFolder.Items.Add(2)

$oContact.LastName         = "Test_LastName"
$oContact.Email1Address    = "test@email.ru"
$oContact.CompanyName      = "Моя комания"
$oContact.Department       = "test_Department"
$oContact.BusinessHomePage = "http://company.com/"
$oContact.Mileage          = "1"

$oContact.Save()
Это сообщение посчитали полезным следующие участники:

Отправлено: 23:44, 08-09-2011 | #6


Аватара для dosperados

Пользователь


Сообщения: 77
Благодарности: 0

Профиль | Отправить PM | Цитировать


Iska, Ты гений так легко и просто решил две мои проблемы! Огромное тебе, человеческое спасибо!

Iska, Можно ещё один глупый вопрос зачем буковка o в переменных $oContact, она что-то значит или просто для красоты?

Отправлено: 06:58, 09-09-2011 | #7


Аватара для dosperados

Пользователь


Сообщения: 77
Благодарности: 0

Профиль | Отправить PM | Цитировать


Iska, Будь добр подскажи ещё раз! По отдельности все что ты мне помогал работает, а вот когда совмещаю все в одно, то работает не совсем так как нужно... папку создает и в ней контакты тоже, но удалить из папки контакты не получается.
PHP код: Выделить весь код

#Подключаемся к Outlook

$oOutlook    = New-Object -ComObject Outlook.Application
$oNameSpace  
$oOutlook.GetNamespace("MAPI")
#Получаем папку "Контакты"
$oMAPIFolder $oNameSpace.GetDefaultFolder(10)


#Получаем папку контактов для удаления
$oContact $oMyMAPIFolder.Items.Find("[Mileage] = ""1"" AND [BusinessHomePage] = ""http://company.com/""")
while (
$oContact -ne $null) {
    
Write-Host $oContact.LastName $oContact.Email1Address        $oContact.EntryID -ForegroundColor blue
    $oContact
.Delete()
    
$oContact $oContact.FindNext()
                            } 


Последний раз редактировалось dosperados, 10-09-2011 в 13:02.


Отправлено: 10:59, 09-09-2011 | #8


Ветеран


Сообщения: 27449
Благодарности: 8087

Профиль | Отправить PM | Цитировать


Цитата dosperados:
зачем буковка o в переменных $oContact, она что-то значит или просто для красоты? »
С точки зрения PoSH — да, для красоты. Для меня — что эта переменная предназначена для хранения ссылки на объект.

Цитата dosperados:
работает не совсем так как нужно... папку создает и в ней контакты тоже, но удалить из папки контакты не получается. »
Где, в каком месте и что именно «не работает»?

И на что мне ориентироваться? На код в предыдущем посте или тот, что Вы прислали в личку? Определитесь.

Отправлено: 00:11, 10-09-2011 | #9


Аватара для dosperados

Пользователь


Сообщения: 77
Благодарности: 0

Профиль | Отправить PM | Цитировать


Не работает вот эта часть скрипта, когда контакты созданы в подпапке т.е. ("\\Outlook\Контакты\контакты компании") невозможно их удалить.
В этой части скрипта я пытался получить папку "контакты компании" и методом Find найти все содержимое и в цикле удалить каждый найденный элемент, но мне возвращается ошибка что метода FindNext() нет для данного объекта. и что я делаю неправильно я непойму...
PHP код: Выделить весь код

#Получаем папку контактов для удаления 

$oMAPIFolder $oNameSpace.GetDefaultFolder(10).Items("контакты компании")
$oContact $oMyMAPIFolder.Items.Find("[Mileage] = ""1"" AND [BusinessHomePage] = ""http://company.com/"""
while (
$oContact -ne $null) { 
    
Write-Host $oContact.LastName $oContact.Email1Address        $oContact.EntryID -ForegroundColor blue 
    $oContact
.Delete() 
    
$oContact $oContact.FindNext() 
                            } 

Удалить содержимое этой папки я пытался разными способами: Другой вариант удалить саму папку "контакты компании" такой вариант тоже мне подойдет... Ну или удалять содержимое этой папки по фильтрам. Но ни так у меня не получается.

Отправлено: 13:20, 10-09-2011 | #10



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » PowerShell - [решено] PS: Синхронизация контактов Outlook`a с AD

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
2007 - MS Outlook замена форм контактов Maggy Microsoft Office (Word, Excel, Outlook и т.д.) 5 21-06-2011 17:06
2007 - Синхронизация Outlook с онлайн-сервисом tym83 Microsoft Office (Word, Excel, Outlook и т.д.) 7 31-12-2010 10:36
2007 - удаление контактов с Outlook Express 2007 log74 Microsoft Office (Word, Excel, Outlook и т.д.) 0 03-06-2010 04:57
Разное - [Outlook] Отсортировать список контактов в Адресной книге Gangabass Microsoft Office (Word, Excel, Outlook и т.д.) 0 18-08-2009 08:28
V. 2007 - Ошибка при попытке добавить множество контактов в список рассылки в Outlook Dmitriy_K Microsoft Exchange Server 1 03-04-2009 10:56




 
Переход