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


Расскажу Вам о том как я добавляла фотографию из 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 / 1024, 2) > 10 Тогда  //Сравниваем размер файла
            
Процессор.Filters.Add(Процессор.FilterInfos(«Scale»).FilterID);
            
Процессор1 = Процессор.Filters(1);
             Для
К = 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 = СтрЗаменить(ADsPath, CN+«,», «»);
          
PreObj = ПолучитьCOMОбъект(«LDAP:»);
          
objContainer = PreObj.OpenDSObject(ADsPath, «ВашАдминскийЮзер», «ЕгоПароль», 1);
          
UpdateObject = objContainer.GetObject(«User», CN);
          
UpdateObject.Put(«thumbnailPhoto», Фото.Read());
          
UpdateObject.SetInfo();
       КонецЕсли;
      
Записали = Истина;
   Исключение
   КонецПопытки;

Закрываем подключение. Прибираемся. Уходим. Вот и всё!!!

 

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

 

Успехов Wink. В прикрепленных файлах есть обработка (не забудьте изменить строки подключения)

На скриншотах Вы можете увидеть результат работы обработки — на закладке Редактор аттрибутов в атрибуте thumbnailPhoto появилась строка с двоичными данными. В дальнейшем эти фотографии могут быть импортированы в Outlook.

7 Comments

  1. comol

    Если есть установленный sharepoint то это всё делается много проще…

    Reply
  2. Nas'ka

    (1) comol, Поделитесь с нами опытом

    Reply
  3. dimaster

    есть еще такая удобная штука:



    Скачать библиотеку можно тут: http://www.dewdney.co.uk/adext/adext.zip

    оф кос, это не пакетная загрузка, но удобней смотреть, чем

    Reply
  4. Nas'ka

    (3) Есть еще и такая «CodeTwo Active Directory Photos». Я ею пользовалась. Удобная софтинка. Не принципиально.

    Reply
  5. nanik

    Подскажите, можно ли получить фото из AD средствами 1с?

    Reply
  6. Nas'ka

    (5) Конечно можно, например следующий код открывает фото на просмотр:

    Query = «SEL ECT Name, sAMAccountName, ADsPath, thumbnailPhoto  FR OM ‘LDAP://ИмяДомена/DC=ИмяДомена,DC=ru’ WHERE objectCategory=’User’ And employeeID='»+НомерПФР+»‘»;  //или какой то другой уникальный признак
    Records = oConnect.Execute(query);
    Пока НЕ Records.EOF Цикл
    Если Records.Fields(«thumbnailPhoto»).Value = Null Тогда //Или вместо thumbnailPhoto ваше поле с фото
    Предупреждение(«Пусто»);
    Иначе
    ИмяФайла  = ПолучитьИмяВременногоФайла(«bmp»);
    
    Поток   = Новый COMОбъект(«ADODB.Stream»);
    Поток.Type  = 1;
    Поток.Mode  = 3;
    Поток.Open();
    Поток.Write(Records.Fields(«thumbnailPhoto»).Value);
    Поток.SaveToFile(ИмяФайла);
    Поток.Close();
    
    ЗапуститьПриложение(«explorer » + ИмяФайла);
    КонецЕсли;
    Records.MoveNext();
    КонецЦикла;

    Показать

    Reply
  7. nanik

    Спасибо.

    Reply

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *