среда, 26 декабря 2012 г.

Добавление фотографий из 1с в ActiveDirectory

Допустим что перед нами стоит задача выгрузить фотографии сотрудников из 1с в ActiveDirectory.
Начнем с создания подключения к AD.
     

    // Подключимся к AD
    
Попытка
        
oConnect ПолучитьCOMОбъект("","ADODB.Connection");
        
oConnect.Provider "ADSDSOObject";
        
oConnect.Properties("User ID").Value "ВашАдминскийЮзер";
        
oConnect.Properties("Password").Value "ЕгоПароль";
        
oConnect.Properties("Encrypt Password").Value = True;
        
oConnect.Open("Active Directory Provider");
    Исключение
        Возврат;
    КонецПопытки;
Затем необходимо прочитать фото в 1с. Для этого я пользовалась своим РегистромСведений ИзменениеФотоФизЛица, который заполняется каждый раз при изменении фото у физ лица. Вы можете напрямую смотреть в карточке физ лица

// Список записанных фото
    
СписокФотоФизЛиц = Новый СписокЗначений;
    
// Прочитаем регистр изменений фотографий физ. лиц
    
ИзменениеФотоФизЛица РегистрыСведений.ИзменениеФотоФизЛица.СоздатьНаборЗаписей();
    
ИзменениеФотоФизЛица.Прочитать();
    Для каждого 
ФотоФизЛица Из ИзменениеФотоФизЛица Цикл
        
Записали = Ложь;
        
// Получить имя временного файла
        
ИмяФайла ПолучитьИмяВременногоФайла();
        
мТекущееИзображение ФотоФизЛица.Фото.Хранилище.Получить();
        
// Страховой номер ПФР является поисковым реквизитом
        
НомерПФР ФотоФизЛица.Физлицо.СтраховойНомерПФР;
        Если Не 
ПустаяСтрока(НомерПФР) И мТекущееИзображение <> Неопределено Тогда
            
мТекущееИзображение.Записать(ИмяФайла);

Как вы заметили Страховой номер у меня это уникальный идентификатор, т.е. в AD в EmployeeID должно быть равно номеру ПФР.
Для помещения картинки в AD она должна соответствовать размеру (не более 10 К и ширина, высота - 96). Для изменения размера картинки воспользуемся стандартной библиотекой Windows Image Acquisition Automation Library (в Windows 7 входит в состав дистрибутива). Библиотеку wiaaut.dll придется зарегистрировать командой regsvr32.

     Попытка
         
Фото       = Новый COMОбъект("WIA.ImageFile");
         
Процессор  = Новый COMОбъект("WIA.ImageProcess");
         
Фото.LoadFile(ИмяФайла);
         Если 
Окр(Фото.FileData.Count 10242) > 10 Тогда  //Сравниваем размер файла
             
Процессор.Filters.Add(Процессор.FilterInfos("Scale").FilterID);
             
Процессор1 Процессор.Filters(1);
             Для 
К По Процессор1.Properties.Count Цикл
                 Если 
Процессор1.Properties(К).Name "MaximumWidth" Тогда
                     
Процессор1.Properties(К).Value 96//Задаем ширину
                 
КонецЕсли;
                 Если 
Процессор1.Properties(К).Name "MaximumHeight" Тогда
                     
Процессор1.Properties(К).Value 96//Задаем высоту
                 
КонецЕсли;
             КонецЦикла;
             
Фото Процессор.Apply(Фото);
         КонецЕсли;
         
ИмяФайла Лев(ИмяФайлаСтрДлина(ИмяФайла) - 4) + ".jpg";
         
Фото.SaveFile(ИмяФайла);
         
Фото = Новый COMОбъект("ADODB.Stream");
         
Фото.Type 1;
         
Фото.Open();
         
Фото.LoadFromFile(ИмяФайла);
     Исключение
         
Сообщить("Возникла проблема " ОписаниеОшибки());
     КонецПопытки;

Ну а теперь находим пользователя в AD и записываем ему фото:
       Query "SELECT Name, sAMAccountName, ADsPath FROM 'LDAP://Домен/DC=ВашСервер,DC=ru' WHERE objectCategory='User' And employeeID='"+НомерПФР+"'";
       
Records oConnect.Execute(query);
       Если НЕ 
Records.EOF Тогда
           
ADsPath Records.Fields("ADsPath").Value;
           
CN ПолучитьCOMОбъект(Records.Fields("ADsPath").Value).Name;
           
ADsPath СтрЗаменить(ADsPathCN+",""");
           
PreObj ПолучитьCOMОбъект("LDAP:");
           
objContainer PreObj.OpenDSObject(ADsPath"ВашАдминскийЮзер""ЕгоПароль"1);
           
UpdateObject objContainer.GetObject("User"CN);
           
UpdateObject.Put("thumbnailPhoto"Фото.Read());
           
UpdateObject.SetInfo();
       КонецЕсли;
       
Записали = Истина;
   Исключение
   КонецПопытки;
Закрываем подключение. Прибираемся. Уходим. Вот и всё!!!

        // Удалим фото из регистра
        
СписокФотоФизЛиц.Добавить(ФотоФизЛица);
        
// Удалим временный файл
        
УдалитьФайлы(ИмяФайла);
    КонецЕсли;
КонецЦикла;
// Закроем ADoConnect.Close();// Запишим изменения в регистр изменений фотографий физ. лицДля каждого ФотоФизЛица Из СписокФотоФизЛиц Цикл
    
ИзменениеФотоФизЛица.Удалить(ФотоФизЛица.Значение);
КонецЦикла;
ИзменениеФотоФизЛица.Записать(Истина);


Комментариев нет:

Отправить комментарий