Блокировка учетных записей пользователей в Active Directory в соответствии с документами увольнения 1С



Внешняя обработка позволяющая выбрать уволенных сотрудников в 1С за период и при желании заблокировать их в Active Directory.

При блокировке учетной записи уволенного сотрудника, в AD так же прописывается дата увольнения в поле Описание(Description) в виде: Уволен(а): 17 июня 2011 г.

Настраивать обработку очень просто — в процедуре ПриОткрытии() в Конфигураторе необходимо отредактировать строку поиска в LDAP в соответствии с именем своего домена и юнита в котором расположены учетки пользователей.

Процедура ПриОткрытии()
// Загрузка списка значений
СписВыб = Новый СписокЗначений;
// Здесь необходимо подставить своё значение в пределах которого будет производиться поиск:
// где dc=MYDOMAIN и dc=RU — имя Вашего домена вида MYDOMAIN.RU
// Main Office, Branch #1, Branch #2 — OU (организационные единицы) в Вашем AD
СписВыб.Добавить(«LDAP://OU=Main Office,dc=MYDOMAIN,dc=RU»);
СписВыб.Добавить(«LDAP://OU=Branch #1,dc=MYDOMAIN,dc=RU»);
СписВыб.Добавить(«LDAP://OU=Branch #2,dc=MYDOMAIN,dc=RU»);
ЭлементыФормы.ПолеВыбора.СписокВыбора = СписВыб;
// Установим текущим первое значение
ЭлементыФормы.ПолеВыбора.Значение = ЭлементыФормы.ПолеВыбора.СписокВыбора.Получить(0).Значение;
//сообщить(ЭлементыФормы.ПолеВыбора.Значение)
КонецПроцедуры

Запуск производится через Файл/Открыть

40 Comments

  1. nanik

    Очень удобно, хотелось бы опробовать на практике, но к сожалению количество StartMoney не позволяет.

    В развитие обработки, хотелось бы обратную процедуру, то есть при приеме сотрудника создавать учетные записи.

    Reply ↓
  2. Silver1975

    (1) nanik,

    <quote>хотелось бы обратную процедуру, то есть при приеме сотрудника создавать учетные записи</quote>Я тоже задумывался над этим, да и реализовать данную процедуру в общем-то совсем нетрудно.

    Но решил не тратить время, по той причине, что, к примеру в моей организации, вначале регистрируется учетка вновь прибывшего пользователя в AD, он успешно начинает под ней работать, и по прошествии n-го количества дней, отдел кадров заводит сотрудника в 1С…

    Reply ↓
  3. echo77

    Каким образом выполняется поиск пользователя в AD?

    Reply ↓
  4. Silver1975

    (3) echo77,

    Каким образом выполняется поиск пользователя в AD?

    Выборка производится по пути указанному в поле «Объект LDAP:» из юнита AD который указан в данной строке с условием WHERE objectCategory=’user’ для отбора только пользовательских учеток. Далее происходит объединение выборки полученной из AD с помощью INNER JOIN с таблицей уволенных полученной из 1С по полю DisplayName(Выводимое имя) учетной записи пользователя в AD, соответственно, указанное поле должно содержать полное ФИО сотрудника равное ФИО сотрудника в 1С.

    Reply ↓
  5. echo77

    (4) Ясно. Если сотрудник меняет фамилию, то получается что связь теряется?

    Reply ↓
  6. Silver1975

    (5) echo77,

    Верно, но факт того, что сотрудник изменил фамилию и сразу же после этого уволился, случай из ряда вон. Опять таки, при изменении сотрудником фамилии, мы неизбежно отразим сей факт и в AD, в учетной запись изменим имя, логин, эти изменения все равно придется сделать, а после внесения изменений в AD связь вновь восстановится.

    Reply ↓
  7. Silver1975

    (5) echo77,

    Специально смоделировал данную ситуацию: в 1С в физ.лицах сделал «Смена ФИО», в соответствии с новыми данными внес изменения в AD в учетку пользователя (поле: «Выводимое имя») — все прекрасно работает.

    Можно конечно при старте обработки делать выборку из РС — ФИОФизЛиц, и сообщать о том, что изменилось ФИО с предложением привести AD в соответствие, но опять таки данная обработка носит больше инвентаризационный характер и выполняется по факту увольнения сотрудника, а к этому моменту предполагается, что соответствующие изменения свершились ранее и AD приведен в соответствие с 1С.

    Reply ↓
  8. echo77

    (7) Понятно. На какой должности вы работаете? Сколько у вас пользователей домена? Кто администрирует домен?

    Не могли бы вы написать инструкцию об «интеграции» справочника сотрудники в AD в виде публикации?

    Reply ↓
  9. Silver1975

    (8) echo77,

    На какой должности вы работаете? Сколько у вас пользователей домена? Кто администрирует домен?

    Дальнейшая переписка в личке.

    Reply ↓
  10. echo77

    (0)- Я бы писал без использования vbs/js.

    — Список доступных доменов лучше заполнять реально доступными доменами, а не строками для примера

    — Не дает вписывать произвольную строку в поле ввода Объект LDAP

    — Нет возможности сохранять настройки

    — Справка к обработке будет не лишней. Ибо запускать данную штуку в AD не зная что делает кнопка «Применить«, а что кнопка «Выполнить» страшно

    — Каков смысл динамического(программно) создания колонок табличного поля на форме?

    Reply ↓
  11. Silver1975

    (10) echo77,

    • Про VBScript, а почему бы нет? К примеру посмотрите как Microsoft Consulting Services делает свои проекты — все на скриптах. К тому же возможно кому-нибудь подойдет в качестве примера вызова vbs/js скриптов из 1С.
    • Про домены, а какой прок от реального имени моего домена и OU, тем кто будет запускать обработку в своем домене?
    • Про произвольную строку в поле ввода, здесь Вы правы, (поправлю и перезалью когда накопиться некоторое количество нареканий 🙂 но в описании к публикации я указал что нужно править где и как.
    • Про сохранение настроек, актуально только при вводе значения в поле Объект LDAP, значит читаем предыдущий пункт, то что в скобках.
    • Про справку — подумаю, про кнопки согласен, малоинформативны, связано с тем, что изначально обработка предназначалась узкому кругу лиц которые были ознакомлены с ее функционалом мною лично.
    • Про создание колонок на этапе выполнения, это скорее привычка заимствованная из других языков, связанная с получением данных в grid с заранее не определенным их количеством.
    Reply ↓
  12. echo77

    (11) Было бы неплохо, чтобы в списке выбора объектов LDAP присутствовал бы доступных доменов той сети, в которой запущена данная программа.

    — Непонятно почему так сложно получается список уволенных сотрудников, и на кой черт должность при увольнении если она не используется?(Я бы просто отбирал уволенных по значению поля «ДатаУвольнения» в справочнике сотрудники)

    — Было бы неплохо, если бы при опущенном параметре ДатаНачала/ДатаОкончания выбирались бы все записи без ограничения

    Reply ↓
  13. Silver1975

    (12) echo77,

    > Было бы неплохо, чтобы в списке выбора объектов LDAP присутствовал бы доступных доменов

    Не совсем понятно как это нагляднее реализовать, можно к примеру получать список OU по всему домену, можно так же предварительно выбирать доверенные домены если таковые имеются проверять их на доступность и так же строить по ним список OU, но представьте какое количество будет иметь список, если к примеру администратор заводит под каждый департамент отдельный юнит, вообщем рассмотрю Ваши предложения.

    > и на кой черт должность при увольнении если она не используется

    Это так сказать рудимент, первоначально планировалось добавлять эту информацию в поле «Описание» вместе с фразой «Уволен(а)…», но позже отказался из соображений наглядности в AD. В следующей версии вычищу из запроса, хотя на производительность особо не влияет.

    > при опущенном параметре ДатаНачала/ДатаОкончания выбирались бы все записи без ограничения

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

    Reply ↓
  14. nanik

    Наконец-то смог скачать и проверить обработку в работе.

    К сожалению результат выглядит вот так: {Форма.Форма.Форма(104)}: Ошибка при вызове метода контекста (Run): Произошла исключительная ситуация (0x80005000)

    🙁

    Reply ↓
  15. Silver1975

    (14) nanik,

    Данная ошибка свидетельствует о том, что 0x80005000 («указанный атрибут службы каталогов или значение не существует»). Т.е. неверно была набрана строка в поле ввода Объект LDAP. Проверьте корректность заполнения данной строки.

    Увидеть/узнать LDAP имя домена можно скопировав нижеприведенный код в файл с расширением .vbs и запустив его на выполнение

    Set oRootDSE = GetObject(«LDAP://rootDSE»)
    strBaseDN = «LDAP://» & oRootDSE.Get(«defaultNamingContext»)
    msgbox «Domain Name: » & strBaseDN
    Reply ↓
  16. nanik

    (15) наименование домена указано верно, думаю проблема в OU. Но наименование скопировал с AD, так что опечаток не может быть. В чем еще может быть проблема?

    Reply ↓
  17. Silver1975

    (16) nanik,

    Сделаем так, запустите нижеуказанный скрипт он пробегает по всему AD показывая наименование организационных единиц и путь к ним, проверьте соответствует ли полученная скриптом строка CN той которую вы писали в обработке:

    Const ADS_SCOPE_SUBTREE = 2
    
    Set objConnection = CreateObject(«ADODB.Connection»)
    Set objCommand = CreateObject(«ADODB.Command»)
    objConnection.Provider = «ADsDSOObject»
    objConnection.Open «Active Directory Provider»
    Set objCommand.ActiveConnection = objConnection
    objCommand.Properties(«Page Size») = 1000
    objCommand.Properties(«Searchscope») = ADS_SCOPE_SUBTREE
    
    Set oRootDSE = GetObject(«LDAP://rootDSE»)
    strBaseDN = «LDAP://» & oRootDSE.Get(«defaultNamingContext»)
    
    objCommand.CommandText = _
    «SELECT Name, ADsPath FROM » & «‘» & strBaseDN & «‘» & _
    » WHERE objectCategory=’organizationalUnit’ ORDER BY Name»
    Set objRecordSet = objCommand.Execute
    
    objRecordSet.MoveFirst
    Do Until objRecordSet.EOF
    WScript.Echo «OU: » & objRecordSet.Fields(«Name»).Value & VbCrLf &_
    «CN: » & objRecordSet.Fields(«ADsPath»).Value
    objRecordSet.MoveNext
    Loop

    Показать

    Reply ↓
  18. Silver1975

    (16) nanik,

    Так же обратите внимание на то, что строка LDAP должна начинаться с LDAP:// а так же быть указана без пробелов между запятыми, имена OU пишутся как есть т.е. без кавычек или апострофов.

    Reply ↓
  19. nanik

    (18) спасибо большое.

    Если указываю OU первого уровня, то выходит указанная ошибка.

    СписВыб.Добавить(«LDAP://OU=Пользователи,dc=XXXXX,dc=RU»);

    {Форма.Форма.Форма(104)}: Ошибка при вызове метода контекста (Run): Произошла исключительная ситуация (0x80005000)

    Если же OU второго уровня, то обработка отрабатывает на ура

    СписВыб.Добавить(«LDAP://OU=ЖКХ,OU=Пользователи,dc=XXXXX,dc=RU»);

    До этого тестировал именно с OU первого уровня.

    Как поправить?

    Reply ↓
  20. Silver1975

    (19) nanik,

    Скорей всего связано с тем, что в Вашем контейнере OU=Пользователи кроме учетных записей пользователей имеются так же объекты — Контакт, если это так, необходимо подправить select в функции ПолучитьСписокПользователейAD(). А именно найти строку «»WHERE objectCategory=’user'»» и заменить ее на «»WHERE objectClass=’user’ AND objectCategory=’person'»»

    Reply ↓
  21. nanik

    (20) условия выборки подправил, но это не исправило ситуацию. Что заметил, по тем OU, в которых нет пустых, работает обработка. Если же хоть есть хоть один вложенный пустой OU, то возникает ошибка: {Форма.Форма.Форма(104)}: Ошибка при вызове метода контекста (Run): Произошла исключительная ситуация (ADODB.Recordset): BOF или EOF имеет значение True, либо текущая запись удалена. Для выполняемой операции требуется текущая запись.

    Думаю тут надо поставить заглушку, если OU не содержит элементы.

    Reply ↓
  22. Silver1975

    (21) nanik,

    Даже не предполагал что могут быть пустые контейнеры…

    Ну да ладно, вот что нужно сделать:

    1. найти строку objRecordSet.MoveFirst перед ней добавить if objRecordSet.RecordCount <> 0 then

    2. найти Loop после него добавить end if

    Искать все в той же функции: ПолучитьСписокПользователейAD()

    В коде будет выглядеть следующим образом:

     |If objRecordSet.RecordCount <> 0 Then
    |  objRecordSet.MoveFirst
    

     |  Loop
    |End If
    
    Reply ↓
  23. nanik

    (22) контейнеры потому что структура построена на основании штатного расписания. Администратор просто её продублировал. Есть такие структурные единицы, в которых люди не работают за компьютером, поэтому они и пустые.

    Reply ↓
  24. Silver1975

    (23) nanik,

    Про контейнеры понятно…

    Сообщите пожалуйста, все ли корректно отрабатывает после внесенных изменений о которых говорилось выше?

    Reply ↓
  25. nanik

    (22) исправления внес, теперь пустые подразделения отрабатываются. Но ошибка так и осталась: {Форма.Форма.Форма(105)}: Ошибка при вызове метода контекста (Run): Произошла исключительная ситуация (0x80005000)

    Стал разбираться почему же так происходит, оказалось все банально, проблема с наименования подразделений:

    СписВыб.Добавить(«LDAP://OU=Отдел организации труда и з/п,OU=УСМ,OU=Пользователи,dc=XXXXX,dc=RU»);

    Соответственно здесь выходит такая ошибка:

    {Форма.Форма.Форма(105)}: Ошибка при вызове метода контекста (Run): Произошла исключительная ситуация (Active Directory): Был передан недопустимый путь службы каталогов

    Можно ли это как-то обойти или проще всего переименовать подобные подразделения без специальных символов?

    Reply ↓
  26. Silver1975

    (25) nanik,

    Можно указать: СписВыб.Добавить(«LDAP://OU=Отдел организации труда и з/п,OU=УСМ,OU=Пользователи,dc=XXXXX,dc=RU»); — будет работать.

    Подскажите, как я понимаю Вы каждую OU добавляете в список, возможно правильнее будет добавить единственную запись СписВыб.Добавить(«LDAP://dc=XXXXX,dc=RU»); чтобы выборка из AD происходила по всем имеющимся UO, или есть какой-то глубинный смысл?

    Reply ↓
  27. nanik

    (24) начал теперь тестировать обработку на некоторых крупных подразделениях.

    1 — С сотрудником часто заключают трудовой договор на определенный период. По истечению которого его увольняют и если сотрудник согласен продолжать работу, то его опять оформляют на работу. Или сотрудник поработав в одном филиале, увольняется переводом в другой филиал. То есть таких сотрудников надо исключить из обработки или организовать предупреждение.

    2 — Сравнение идет по наименованию из справочника сотрудники. Например, сотрудник был устроен по внешнему совместительству или договору подряда, и в наименовании его для удобства добавлен префикс соответствующий. Такие сотрудники автоматически будут исключены из обработки.

    3 — Для удобства хотелось бы дополнительный поиск по фамилии, имени и инициалу. Например, в поле Выводимое имя в замен ФИО написали по ошибке ИОФ. Или хотя бы список уволенных, которых не нашли в AD.

    Reply ↓
  28. nanik

    (26) добавляю каждое подразделение, так как с вариантом LDAP://dc=XXXXX,dc=RU получаю только ошибку

    {Форма.Форма.Форма(105)}: Ошибка при вызове метода контекста (Run): Произошла исключительная ситуация (0x80005000)

    Что бы вычислить причину перебираю каждое подразделение.

    Глубина просмотра для меня не имеет значение.

    Reply ↓
  29. nanik

    (26) еще в наименованиях подразделений используются кавычки, они тоже вызывают ошибку.

    Reply ↓
  30. Silver1975

    (29) nanik,

    С кавычками тоже вопрос решаемый, но опять придется вносить изменения в функцию: ПолучитьСписокПользователейAD()

    меняем строку:

    |    «»SELECT distinguishedName FROM»» & «» ‘»» & strLDAP & «»‘ «» & «»WHERE objectClass=’user’ AND objectCategory=’person'»»

    на

    |    «»SELECT distinguishedName FROM»» & «» ‘»» & Replace(strLDAP, Chr(34), «»»» & Chr(34)) & «»‘ «» & «»WHERE objectClass=’user’ AND objectCategory=’person'»»

    Пример строки: СписВыб.Добавить(«LDAP://ou=Тестовое «»подразделение»»,dc=XXXXX,dc=RU»); — т.е если подразделение называется к примеру Тестовое «подразделение» для корректной работы необходимо заключить фразу «подразделение» в двойные кавычки.

    Reply ↓
  31. nanik

    (30) функцию ПолучитьСписокПользователейAD() исправил. Нашел в AD все подразделения, в наименовании которого присутствовал символ «/» и переименовал.

    Частенько приказы на увольнение изготавливают заранее, то есть дата приказа 12.05.12, а дата увольнения, например, 25.05.12. Возможно ли таким пользователям в AD устанавливать срок действия учетной записи?

    Reply ↓
  32. Silver1975

    (31) nanik,

    Частенько приказы на увольнение изготавливают заранее, то есть дата приказа 12.05.12, а дата увольнения, например, 25.05.12. Возможно ли таким пользователям в AD устанавливать срок действия учетной записи?

    Установить значение в поле «Срок действия учетной записи» юзерской учетки в AD не сложно, но нужно понять как у Вас происходит ввод документа на увольнение в 1С или приказа, т.е. понять какую дату ставить в это поле и от куда ее брать?

    Reply ↓
  33. nanik

    (32) в табличной части документа проставляется реальная дата увольнения человека. То есть в AD надо установить срок действия учетной записи равной дате увольнения +1 день. Про +1 день: день увольнения считается рабочим днем.

    Reply ↓
  34. Silver1975

    (33) nanik,

    Ясно, осталось понять по какому принципу устанавливать дату запрета учетной записи, либо блокировать учетку.

    Reply ↓
  35. nanik

    (34) Если текущая дата больше даты увольнения, то учетную запись отключаем. Если текущая дата меньше или равна текущей даты, то установить срок действия учетной записи.

    Reply ↓
  36. nanik

    (34) под текущей датой можно понимать дату выполнения или создать на форме реквизит с типом дата и на него ориентироваться.

    Reply ↓
  37. Silver1975

    (35) nanik,

    Я к тому, что Вы собираетесь обработку запускать ежедневно? А если от случая к случаю, то она будет носить больше инвентаризационный характер и есть ли тогда смысл устанавливать срок истечения учетки? Проще будет ее просто заблокировать.

    Reply ↓
  38. nanik

    (37)

    Про ежедневный запуск тоже вариант, но тогда надо исправить условия выборки. Так как сейчас если дата приказа например дата увольнения 27.05.12, то в выборку с 27.05.12 по 27.05.12 уволенный человек не попадет, как и на 28.05.12, только если ставить интервал с 27.05.12 по 28.05.12.

    Reply ↓
  39. iSchenkov

    Добрый день. А вы занимались доработкой этого решения

    Интересует, возможно ли его доработать таким образом, чтобы отображались в окне принятия решения не только уволенные, но и принятые (создание УЗ в АД). и переведённые по основному месту работы (обновление данных в АД) и пр. Т.е. полноценный функционал обмена данных о сотруднике из 1С в АД, но через форму согласования как у Вас на скрине.

    Reply ↓
  40. user978221

    Добрый день, вопросы принимаете по обработке?

    Reply ↓

Leave a Comment

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