Блокировка учетных записей пользователей в 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 не будет опубликован. Обязательные поля помечены *