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

Аватара пользователя
dosperados

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

Сообщение dosperados »

Пишу скрипт по синхронизации 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() то контакты как бы делятся на две части и удаляются только половина импортированных контактов. И так чтобы удалить все импортированные контакты надо несколько раз запустить скрипт на удаление…

Почему так, помогите!!! Или предложите другой метод, всем предложения решения задачи буду рад!!!
Аватара пользователя
dosperados

Re: PowerShell - [решено] PS: Синхронизация контактов Outlook`a с AD

Сообщение dosperados »

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



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

Ну или вообще как подругому сделать)
Аватара пользователя
Iska

Re: PowerShell - [решено] PS: Синхронизация контактов Outlook`a с AD

Сообщение Iska »

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()
}
Аватара пользователя
dosperados

Re: PowerShell - [решено] PS: Синхронизация контактов Outlook`a с AD

Сообщение dosperados »

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

Re: PowerShell - [решено] PS: Синхронизация контактов Outlook`a с AD

Сообщение dosperados »

Такой вопрос: я создаю в папке "\\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() 



Аватара пользователя
Iska

Re: PowerShell - [решено] PS: Синхронизация контактов Outlook`a с AD

Сообщение Iska »

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()
Аватара пользователя
dosperados

Re: PowerShell - [решено] PS: Синхронизация контактов Outlook`a с AD

Сообщение dosperados »

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



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

Re: PowerShell - [решено] PS: Синхронизация контактов Outlook`a с AD

Сообщение dosperados »

Цитата dosperados:



зачем буковка o в переменных $oContact, она что-то значит или просто для красоты?
PowerShell - [решено] PS: Синхронизация контактов Outlook`a с AD




С точки зрения PoSH — да, для красоты. Для меня — что эта переменная предназначена для хранения ссылки на объект.




Цитата dosperados:



работает не совсем так как нужно... папку создает и в ней контакты тоже, но удалить из папки контакты не получается.
PowerShell - [решено] PS: Синхронизация контактов Outlook`a с AD




Где, в каком месте и что именно «не работает»?



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

Re: PowerShell - [решено] PS: Синхронизация контактов Outlook`a с AD

Сообщение Iska »

Не работает вот эта часть скрипта, когда контакты созданы в подпапке т.е. ("\\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() 

                            } 






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

Вернуться в «Скриптовые языки администрирования Windows»