gifts2017

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

Опубликовал Alex Silver (Silver1975) в раздел Администрирование - Защита, права, пароли

Внешняя обработка позволяющая выбрать уволенных сотрудников в 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).Значение;
//сообщить(ЭлементыФормы.ПолеВыбора.Значение)
КонецПроцедуры

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

Скачать файлы

Наименование Файл Версия Размер Кол. Скачив.
Блокировать уволенных в AD.epf
.epf 10,74Kb
20.04.12
124
.epf 10,74Kb 124 Скачать

См. также

PowerTools от 1 000
Подписаться Добавить вознаграждение

Комментарии

1. nanik nanik (nanik) 22.04.12 09:27
Очень удобно, хотелось бы опробовать на практике, но к сожалению количество StartMoney не позволяет.
В развитие обработки, хотелось бы обратную процедуру, то есть при приеме сотрудника создавать учетные записи.
2. Alex Silver (Silver1975) 25.04.12 08:44
(1) nanik,
<quote>хотелось бы обратную процедуру, то есть при приеме сотрудника создавать учетные записи</quote>Я тоже задумывался над этим, да и реализовать данную процедуру в общем-то совсем нетрудно.
Но решил не тратить время, по той причине, что, к примеру в моей организации, вначале регистрируется учетка вновь прибывшего пользователя в AD, он успешно начинает под ней работать, и по прошествии n-го количества дней, отдел кадров заводит сотрудника в 1С...
3. Александр Крынецкий (echo77) 25.04.12 21:18
Каким образом выполняется поиск пользователя в AD?
4. Alex Silver (Silver1975) 26.04.12 09:15
(3) echo77,
Каким образом выполняется поиск пользователя в AD?
Выборка производится по пути указанному в поле "Объект LDAP:" из юнита AD который указан в данной строке с условием WHERE objectCategory='user' для отбора только пользовательских учеток. Далее происходит объединение выборки полученной из AD с помощью INNER JOIN с таблицей уволенных полученной из 1С по полю DisplayName(Выводимое имя) учетной записи пользователя в AD, соответственно, указанное поле должно содержать полное ФИО сотрудника равное ФИО сотрудника в 1С.
5. Александр Крынецкий (echo77) 26.04.12 17:35
(4) Ясно. Если сотрудник меняет фамилию, то получается что связь теряется?
6. Alex Silver (Silver1975) 27.04.12 13:01
(5) echo77,
Верно, но факт того, что сотрудник изменил фамилию и сразу же после этого уволился, случай из ряда вон. Опять таки, при изменении сотрудником фамилии, мы неизбежно отразим сей факт и в AD, в учетной запись изменим имя, логин, эти изменения все равно придется сделать, а после внесения изменений в AD связь вновь восстановится.
7. Alex Silver (Silver1975) 27.04.12 13:32
(5) echo77,
Специально смоделировал данную ситуацию: в 1С в физ.лицах сделал "Смена ФИО", в соответствии с новыми данными внес изменения в AD в учетку пользователя (поле: "Выводимое имя") - все прекрасно работает.
Можно конечно при старте обработки делать выборку из РС - ФИОФизЛиц, и сообщать о том, что изменилось ФИО с предложением привести AD в соответствие, но опять таки данная обработка носит больше инвентаризационный характер и выполняется по факту увольнения сотрудника, а к этому моменту предполагается, что соответствующие изменения свершились ранее и AD приведен в соответствие с 1С.
8. Александр Крынецкий (echo77) 27.04.12 21:27
(7) Понятно. На какой должности вы работаете? Сколько у вас пользователей домена? Кто администрирует домен?
Не могли бы вы написать инструкцию об "интеграции" справочника сотрудники в AD в виде публикации?
9. Alex Silver (Silver1975) 02.05.12 09:49
(8) echo77,
На какой должности вы работаете? Сколько у вас пользователей домена? Кто администрирует домен?
Дальнейшая переписка в личке.
10. Александр Крынецкий (echo77) 03.05.12 13:48
(0)- Я бы писал без использования vbs/js.
- Список доступных доменов лучше заполнять реально доступными доменами, а не строками для примера
- Не дает вписывать произвольную строку в поле ввода Объект LDAP
- Нет возможности сохранять настройки
- Справка к обработке будет не лишней. Ибо запускать данную штуку в AD не зная что делает кнопка "Применить", а что кнопка "Выполнить" страшно
- Каков смысл динамического(программно) создания колонок табличного поля на форме?
11. Alex Silver (Silver1975) 03.05.12 17:25
(10) echo77,
  • Про VBScript, а почему бы нет? К примеру посмотрите как Microsoft Consulting Services делает свои проекты - все на скриптах. К тому же возможно кому-нибудь подойдет в качестве примера вызова vbs/js скриптов из 1С.
  • Про домены, а какой прок от реального имени моего домена и OU, тем кто будет запускать обработку в своем домене?
  • Про произвольную строку в поле ввода, здесь Вы правы, (поправлю и перезалью когда накопиться некоторое количество нареканий :) но в описании к публикации я указал что нужно править где и как.
  • Про сохранение настроек, актуально только при вводе значения в поле Объект LDAP, значит читаем предыдущий пункт, то что в скобках.
  • Про справку - подумаю, про кнопки согласен, малоинформативны, связано с тем, что изначально обработка предназначалась узкому кругу лиц которые были ознакомлены с ее функционалом мною лично.
  • Про создание колонок на этапе выполнения, это скорее привычка заимствованная из других языков, связанная с получением данных в grid с заранее не определенным их количеством.
12. Александр Крынецкий (echo77) 03.05.12 20:28
(11) Было бы неплохо, чтобы в списке выбора объектов LDAP присутствовал бы доступных доменов той сети, в которой запущена данная программа.
- Непонятно почему так сложно получается список уволенных сотрудников, и на кой черт должность при увольнении если она не используется?(Я бы просто отбирал уволенных по значению поля "ДатаУвольнения" в справочнике сотрудники)
- Было бы неплохо, если бы при опущенном параметре ДатаНачала/ДатаОкончания выбирались бы все записи без ограничения
13. Alex Silver (Silver1975) 04.05.12 17:33
(12) echo77,
> Было бы неплохо, чтобы в списке выбора объектов LDAP присутствовал бы доступных доменов
Не совсем понятно как это нагляднее реализовать, можно к примеру получать список OU по всему домену, можно так же предварительно выбирать доверенные домены если таковые имеются проверять их на доступность и так же строить по ним список OU, но представьте какое количество будет иметь список, если к примеру администратор заводит под каждый департамент отдельный юнит, вообщем рассмотрю Ваши предложения.

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

> при опущенном параметре ДатаНачала/ДатаОкончания выбирались бы все записи без ограничения
В текущей версии можно указывать только дату окончания равную текущей. Будут отобраны все по текущий момент.
14. nanik nanik (nanik) 13.05.12 14:53
Наконец-то смог скачать и проверить обработку в работе.
К сожалению результат выглядит вот так: {Форма.Форма.Форма(104)}: Ошибка при вызове метода контекста (Run): Произошла исключительная ситуация (0x80005000)
:(
15. Alex Silver (Silver1975) 14.05.12 17:12
(14) nanik,
Данная ошибка свидетельствует о том, что 0x80005000 («указанный атрибут службы каталогов или значение не существует»). Т.е. неверно была набрана строка в поле ввода Объект LDAP. Проверьте корректность заполнения данной строки.

Увидеть/узнать LDAP имя домена можно скопировав нижеприведенный код в файл с расширением .vbs и запустив его на выполнение
Set oRootDSE = GetObject("LDAP://rootDSE")
strBaseDN = "LDAP://" & oRootDSE.Get("defaultNamingContext")
msgbox "Domain Name: " & strBaseDN
16. nanik nanik (nanik) 15.05.12 17:11
(15) Silver1975, наименование домена указано верно, думаю проблема в OU. Но наименование скопировал с AD, так что опечаток не может быть. В чем еще может быть проблема?
17. Alex Silver (Silver1975) 15.05.12 17:47
(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
...Показать Скрыть
18. Alex Silver (Silver1975) 15.05.12 17:56
(16) nanik,
Так же обратите внимание на то, что строка LDAP должна начинаться с LDAP:// а так же быть указана без пробелов между запятыми, имена OU пишутся как есть т.е. без кавычек или апострофов.
19. nanik nanik (nanik) 15.05.12 23:59
(18) Silver1975, спасибо большое.
Если указываю OU первого уровня, то выходит указанная ошибка.
СписВыб.Добавить("LDAP://OU=Пользователи,dc=XXXXX,dc=RU");

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

Если же OU второго уровня, то обработка отрабатывает на ура
СписВыб.Добавить("LDAP://OU=ЖКХ,OU=Пользователи,dc=XXXXX,dc=RU");

До этого тестировал именно с OU первого уровня.
Как поправить?
20. Alex Silver (Silver1975) 16.05.12 09:27
(19) nanik,
Скорей всего связано с тем, что в Вашем контейнере OU=Пользователи кроме учетных записей пользователей имеются так же объекты - Контакт, если это так, необходимо подправить select в функции ПолучитьСписокПользователейAD(). А именно найти строку ""WHERE objectCategory='user'"" и заменить ее на ""WHERE objectClass='user' AND objectCategory='person'""
21. nanik nanik (nanik) 16.05.12 12:04
(20) Silver1975, условия выборки подправил, но это не исправило ситуацию. Что заметил, по тем OU, в которых нет пустых, работает обработка. Если же хоть есть хоть один вложенный пустой OU, то возникает ошибка: {Форма.Форма.Форма(104)}: Ошибка при вызове метода контекста (Run): Произошла исключительная ситуация (ADODB.Recordset): BOF или EOF имеет значение True, либо текущая запись удалена. Для выполняемой операции требуется текущая запись.

Думаю тут надо поставить заглушку, если OU не содержит элементы.
22. Alex Silver (Silver1975) 16.05.12 12:35
(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
23. nanik nanik (nanik) 16.05.12 13:42
(22) Silver1975, контейнеры потому что структура построена на основании штатного расписания. Администратор просто её продублировал. Есть такие структурные единицы, в которых люди не работают за компьютером, поэтому они и пустые.
24. Alex Silver (Silver1975) 16.05.12 13:52
(23) nanik,
Про контейнеры понятно...
Сообщите пожалуйста, все ли корректно отрабатывает после внесенных изменений о которых говорилось выше?
25. nanik nanik (nanik) 16.05.12 14:06
(22) Silver1975, исправления внес, теперь пустые подразделения отрабатываются. Но ошибка так и осталась: {Форма.Форма.Форма(105)}: Ошибка при вызове метода контекста (Run): Произошла исключительная ситуация (0x80005000)
Стал разбираться почему же так происходит, оказалось все банально, проблема с наименования подразделений:
СписВыб.Добавить("LDAP://OU=Отдел организации труда и з/п,OU=УСМ,OU=Пользователи,dc=XXXXX,dc=RU");
Соответственно здесь выходит такая ошибка:
{Форма.Форма.Форма(105)}: Ошибка при вызове метода контекста (Run): Произошла исключительная ситуация (Active Directory): Был передан недопустимый путь службы каталогов

Можно ли это как-то обойти или проще всего переименовать подобные подразделения без специальных символов?
26. Alex Silver (Silver1975) 16.05.12 14:38
(25) nanik,
Можно указать: СписВыб.Добавить("LDAP://OU=Отдел организации труда и з\/п,OU=УСМ,OU=Пользователи,dc=XXXXX,dc=RU"); - будет работать.

Подскажите, как я понимаю Вы каждую OU добавляете в список, возможно правильнее будет добавить единственную запись СписВыб.Добавить("LDAP://dc=XXXXX,dc=RU"); чтобы выборка из AD происходила по всем имеющимся UO, или есть какой-то глубинный смысл?
27. nanik nanik (nanik) 16.05.12 14:59
(24) Silver1975, начал теперь тестировать обработку на некоторых крупных подразделениях.
1 - С сотрудником часто заключают трудовой договор на определенный период. По истечению которого его увольняют и если сотрудник согласен продолжать работу, то его опять оформляют на работу. Или сотрудник поработав в одном филиале, увольняется переводом в другой филиал. То есть таких сотрудников надо исключить из обработки или организовать предупреждение.
2 - Сравнение идет по наименованию из справочника сотрудники. Например, сотрудник был устроен по внешнему совместительству или договору подряда, и в наименовании его для удобства добавлен префикс соответствующий. Такие сотрудники автоматически будут исключены из обработки.
3 - Для удобства хотелось бы дополнительный поиск по фамилии, имени и инициалу. Например, в поле Выводимое имя в замен ФИО написали по ошибке ИОФ. Или хотя бы список уволенных, которых не нашли в AD.
28. nanik nanik (nanik) 16.05.12 15:02
(26) Silver1975, добавляю каждое подразделение, так как с вариантом LDAP://dc=XXXXX,dc=RU получаю только ошибку
{Форма.Форма.Форма(105)}: Ошибка при вызове метода контекста (Run): Произошла исключительная ситуация (0x80005000)
Что бы вычислить причину перебираю каждое подразделение.
Глубина просмотра для меня не имеет значение.
29. nanik nanik (nanik) 16.05.12 15:05
(26) Silver1975, еще в наименованиях подразделений используются кавычки, они тоже вызывают ошибку.
30. Alex Silver (Silver1975) 16.05.12 16:53
(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"); - т.е если подразделение называется к примеру Тестовое "подразделение" для корректной работы необходимо заключить фразу "подразделение" в двойные кавычки.
31. nanik nanik (nanik) 17.05.12 00:15
(30) Silver1975, функцию ПолучитьСписокПользователейAD() исправил. Нашел в AD все подразделения, в наименовании которого присутствовал символ "/" и переименовал.

Частенько приказы на увольнение изготавливают заранее, то есть дата приказа 12.05.12, а дата увольнения, например, 25.05.12. Возможно ли таким пользователям в AD устанавливать срок действия учетной записи?
32. Alex Silver (Silver1975) 17.05.12 10:19
(31) nanik,
Частенько приказы на увольнение изготавливают заранее, то есть дата приказа 12.05.12, а дата увольнения, например, 25.05.12. Возможно ли таким пользователям в AD устанавливать срок действия учетной записи?
Установить значение в поле "Срок действия учетной записи" юзерской учетки в AD не сложно, но нужно понять как у Вас происходит ввод документа на увольнение в 1С или приказа, т.е. понять какую дату ставить в это поле и от куда ее брать?
33. nanik nanik (nanik) 17.05.12 11:15
(32) Silver1975, в табличной части документа проставляется реальная дата увольнения человека. То есть в AD надо установить срок действия учетной записи равной дате увольнения +1 день. Про +1 день: день увольнения считается рабочим днем.
34. Alex Silver (Silver1975) 17.05.12 11:39
(33) nanik,
Ясно, осталось понять по какому принципу устанавливать дату запрета учетной записи, либо блокировать учетку.
35. nanik nanik (nanik) 17.05.12 12:07
(34) Silver1975, Если текущая дата больше даты увольнения, то учетную запись отключаем. Если текущая дата меньше или равна текущей даты, то установить срок действия учетной записи.
36. nanik nanik (nanik) 17.05.12 12:08
(34) Silver1975, под текущей датой можно понимать дату выполнения или создать на форме реквизит с типом дата и на него ориентироваться.
37. Alex Silver (Silver1975) 17.05.12 12:51
(35) nanik,
Я к тому, что Вы собираетесь обработку запускать ежедневно? А если от случая к случаю, то она будет носить больше инвентаризационный характер и есть ли тогда смысл устанавливать срок истечения учетки? Проще будет ее просто заблокировать.
38. nanik nanik (nanik) 17.05.12 13:05
(37) Silver1975,
Про ежедневный запуск тоже вариант, но тогда надо исправить условия выборки. Так как сейчас если дата приказа например дата увольнения 27.05.12, то в выборку с 27.05.12 по 27.05.12 уволенный человек не попадет, как и на 28.05.12, только если ставить интервал с 27.05.12 по 28.05.12.
39. Евгений Ищенков (iSchenkov) 13.11.14 14:19
Добрый день. А вы занимались доработкой этого решения
Интересует, возможно ли его доработать таким образом, чтобы отображались в окне принятия решения не только уволенные, но и принятые (создание УЗ в АД). и переведённые по основному месту работы (обновление данных в АД) и пр. Т.е. полноценный функционал обмена данных о сотруднике из 1С в АД, но через форму согласования как у Вас на скрине.
Для написания сообщения необходимо авторизоваться
Прикрепить файл
Дополнительные параметры ответа