"Зачистка" 1С от пользователей с отключенной учетной записью Windows

Опубликовал Дмитрий Павлов (mi1man) в раздел Администрирование - Защита, права, пароли

Задача: в справочнике пользователей вычислить по учетной записи windows уволенных (т.е. с отключенной учеткой), перенести таких пользователей в папку "Уволенные" (при отсутствии создать такую) а в карточке пользователя снять галку "Аутентификация windows".

По запросу службы тех. поддержки, написал обработку для решения описанной выше задачи (в конфигурациях УТ10.3 и БП 2.0).

На Инфостарте уже есть обработки, работающие с информацией Active Directory, так что добавлю к ним и свою.

Для тех, кто решит ею воспользоваться, приведу краткое описание действий для работы с ней:

 

1. Перед формированием отчета, нужно указать/определить имя домена в структуре которого находятся искомые учетные записи. Если, при автоматическом определении имени домена, выскочит ошибка, то скорее всего у Вас недостаточно прав. 

Домен

Обычно имя домена указывается через "\" перед Вашим логином при подключения к серверу терминалов по протоколу Remote Desktop Protocol (RDP).


2. Выводим информацию в отчет

отчет

 

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

отборы

      Представленная на рис. комбинация оставит выборку пользователей:

  • с отключенной учетной записью Windows
  • имеющих доступ в текущую базу данных
  • включенную аутентификацию операционной системы для входа в 1С). 

4. Выбираем действие над полученной выборкой пользователей

операции

 

5. Тут включается режим "паранойя")) .. поэтому еще раз укажем нужных пользователей или отметим всех

паранойя

 

6. Готово.  Для того чтобы получить новый набор данных нужно снять галочку "Уже рассчитаный набор данных".

 

 Теперь немного кода с комментариями. При выполнении команды "Сформировать" происходит следующее:

 1. Получаем по запросу LDAP список отключенных учетных записей.

Протокол LDAP (Lightweight Directory Access Protocol, упрощённый протокол для доступа к каталогу) служит для доступа к службам каталогов, в том числе Active Directory в Windows 2000/2003. Служба каталогов Active Directory является LDAP-совместимой реализацией службы каталогов Microsoft для операционных систем семейства Windows и хранит информацию о сетевых ресурсах - пользователях, компьютерах, файлах, папках и принтерах, а также информацию безопасности, касающуюся этих ресурсов.

Специальный объект RootDSE (Root Directory Service Entry) автоматически вернёт имя того домена, к которому принадлежит данный компьютер:
# получение имени домена, к которому принадлежит данный компьютер:
adsi = win32com.client.GetObject("LDAP://RootDSE")
domain = adsi.Get("defaultNamingContext")

 Для начала, создадим подключение в Active Directory

Функция СоздатьПодключениеКAD(ОписаниеОшибок = "")
	
	ПодключениеКAD = Неопределено;
	
	Попытка
		ПодключениеКAD = Новый COMОбъект("ADODB.Connection");
		ПодключениеКAD.Provider = "ADSDSOObject";
		ПодключениеКAD.cursorLocation = 3; //adUseClient
		ПодключениеКAD.Open("ADs Provider");
	Исключение
		ПодключениеКAD = Неопределено;
		ОписаниеОшибок = "Не удалось создать подключение к Active Directory!";
	КонецПопытки;
	
	Возврат ПодключениеКAD;
	
КонецФункции

затем получаем список учетных записей Windows. В массив Результат собираем значения ОписаниеОбъекта. Это структура со описанием свойств записи пользователя.  

Функция ПолучитьМассивСотрудниковAD() Экспорт
	
	Результат = Новый Массив;

	ИмяГруппыAD	  = "DC="+ДоменActiveDirectory;
	ПоляЗапроса	  = ПолучитьСоответствиеПолей();
	СтрокаПодключения = СтроковыеФункцииКлиентСервер_ПодставитьПараметрыВСтроку("<LDAP://%1>;(&(objectCategory=person)(objectClass=user));%2;subtree", ИмяГруппыAD, ПолучитьИменаПолей(ПоляЗапроса));
	
	rs = ПолучитьВыборкуLDAP(СтрокаПодключения);
	Сч = 0;
	
	Если ИСТИНА 
		 И НЕ rs = Неопределено
		 И rs.RecordCount > 0 
	Тогда
		Пока Не rs.EOF Цикл  		
			Если rs.Fields("givenName").Value = null Тогда 
				Попытка
					rs.MoveNext();
					Сч = Сч + 1;
					
				Исключение
					СтатусВыполнения = "Данные получены не полностью (" + Сч + " записей). Ограничьте размер выборки.";
					Прервать;
									
				КонецПопытки;
				
				Продолжить;
				
			КонецЕсли;
			
			ОписаниеОбъекта = Новый Структура("Идентификатор, Значения", "", Новый Структура());
			Результат.Добавить(ОписаниеОбъекта);
			
			ОписаниеОбъекта.Идентификатор = ПривестиМассивИДКСтроке(rs.Fields("objectGUID").Value);
						
			Для каждого ТекКлючЗначение Из ПоляЗапроса Цикл
				ОписаниеОбъекта.Значения.Вставить(ТекКлючЗначение.Значение, rs.Fields(ТекКлючЗначение.Ключ).Value);
				
			КонецЦикла;	
			
			Попытка
				rs.MoveNext();
				Сч = Сч + 1;
				
			Исключение
				СтатусВыполнения = "Данные получены не полностью (" + Сч + " записей). Ограничьте размер выборки.";
				Прервать;
								
			КонецПопытки;
			
		КонецЦикла;
	КонецЕсли;
	
	rs.Close();
	rs = Неопределено;
		
	Возврат Результат;
		
КонецФункции

Описание свойств записи пользователя задается набором полей в этой функции:

Функция ПолучитьСоответствиеПолей()
	
	Результат = Новый Соответствие;
	
	Результат.Вставить("ADsPath",                 "ПолноеИмя");
	Результат.Вставить("Name",                    "Наименование");
	Результат.Вставить("DisplayName",             "ОтображаемоеИмя");
	Результат.Вставить("Mail",                    "АдресЭлектроннойПочты");
	Результат.Вставить("sAMAccountName",          "ИмяАккаунта");
	Результат.Вставить("userAccountControl",      "ПараметрДоступа");
	Результат.Вставить("memberOf",                "СостоитВГруппах");
	Результат.Вставить("objectClass",             "КлассыОбъекта");
	Результат.Вставить("title",                   "Должность");
	Результат.Вставить("department",              "Департамент");
	Результат.Вставить("msExchShadowGivenName",   "Фамилия");
	Результат.Вставить("msExchShadowSn",          "ИмяОтчество");
	Результат.Вставить("givenName",         	  "Имя");
	Результат.Вставить("sAMAccountName",       	  "Логин");
	
	Результат.Вставить("objectGUID",          "Идентификатор"); 
		
	Возврат Результат;
		
КонецФункции

По значению в поле "ПараметрДоступа" будет определяться текущий статус учетной записи пользователя, который будет выводится в колонке "Отключенная учетная запись ОС". Расшифровка значений параметра задается в этой функции:

Функция ПолучитьПараметрыДоступа()
	
	Результат = Новый Соответствие;
	Результат.Вставить(512,       Истина);	//Enabled Account
	Результат.Вставить(514,       Ложь);	//Disabled Account
	Результат.Вставить(544,       Истина);	//Enabled, Password Not Required
	Результат.Вставить(546,       Ложь);	//Disabled, Password Not Required
	Результат.Вставить(66048,     Истина);	//Enabled, Password Doesn't Expire
	Результат.Вставить(66050,     Ложь);	//Disabled, Password Doesn't Expire
	Результат.Вставить(66080,     Истина);	//Enabled, Password Doesn't Expire & Not Required
	Результат.Вставить(66082,     Ложь);	//Disabled, Password Doesn't Expire & Not Required
	Результат.Вставить(262656,    Истина);	//Enabled, Smartcard Required
	Результат.Вставить(262658,    Ложь);	//Disabled, Smartcard Required
	Результат.Вставить(262688,    Истина);	//Enabled, Smartcard Required, Password Not Required
	Результат.Вставить(262690,    Ложь);	//Disabled, Smartcard Required, Password Not Required
	Результат.Вставить(328192,    Истина);	//Enabled, Smartcard Required, Password Doesn't Expire
	Результат.Вставить(328194,    Ложь);	//Disabled, Smartcard Required, Password Doesn't Expire
	Результат.Вставить(328224,    Истина);	//Enabled, SmРезультат.Вставить(artcard Required, Password Doesn't Expire & Not Required
	Результат.Вставить(328226,    Ложь);	//Disabled, Smartcard Required, Password Doesn't Expire & Not Required
	
	Возврат Результат;
		
КонецФункции

2. Получаем всех пользователей 1С.

3. Сопоставляем два списка. Для того, чтобы связать персону из 1С и персону из Active Directory, необходимо иметь некий идентификатор, связывающий эти две записи. В моем случае будем связывать по логину учетной записи Windows.

4. Выводим информацию в отчет. Полученная таблица значений служит источником для набора данных СКД.

5. Далее уже работаем с данными через отчет. Реализованы следующие операции:

  • перемещение элемента справочника "Пользователи" в указанную группу
  • снятие/установка галочки "Аутентификация операционной системы" в карточке пользователя.

добавлено 04.05.2016

добавлена возможность сформировать отчет по справочнику "Пользователи" и пользователям информационной базы:
колонка "Есть пользователь БД" - указывает на существование пользователя БД.

доп отчет  

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

Наименование Файл Версия Размер
Уволенные Сотрудники с отключенной аутентификацией ОС
.erf 23,98Kb
04.05.16
15
.erf 23,98Kb 15 Скачать

См. также

Добавить вознаграждение
Комментарии
1. Александр Дунаев (mbgimpex) 18.11.16 15:55 Сейчас в теме
Обработка переписана на СКД, в инструкции так и остались картинки от старых версий, и соответственно новой обработке не соответствует.
Но, главное в том, что НЕ РАБОТАЕТ. При формировании отчета сразу же валится с ошибкой

Ошибка выполнения отчета
по причине:
Ошибка исполнения отчета
по причине:
Ошибка инициализации
по причине:
Ошибка создания набора данных "НаборДанных1"
по причине:
Не найден внешний набор данных "ТЗ"
Прикрепленные файлы: