Соответствие пользователей Информационной базы и Актив директория

23.01.20

Администрирование - Роли и права

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

Скачать исходный код

Наименование Файл Версия Размер
Соответствие пользователей Информационной Базы и Актив Директория.:
.epf 12,02Kb
10
.epf 12,02Kb 10 Скачать

Обработка предназначена для работы в клиент-серверных базах и тестировалась на платформе 8.3.14.1854. 

Работает в режиме внешней обработки. 

Перейдем к рассмотрению программного кода.

    Обработка небольшая и состоит из нескольких функций и одной процедуры, коды которых я коротко опишу.

1. Процедура запуска , она последовательно запускает на выполнение функции и процедуры обработки.

Код процедуры:
    

&НаКлиенте
Процедура ПолучитьПользователейИБ(Команда)
	МассивЛогинов=Новый Массив;
	МассивДоменов=Новый Массив;
	
	МассивЛогинов=ПолучитьПользователейИБ1();
	МассивДоменов=ПолучитьДоменыИБ1();
	ПолучитьПользователяИзАД1(МассивЛогинов,МассивДоменов);
	ЗаполнениеОтличиеИБотАД();
КонецПроцедуры


2. Процедура ИнструкцияПоЭксплуатации при нажатии соответствующей кнопки выводит текст инструкции.

Код процедуры:
    

&НаКлиенте
 Процедура ИнструкцияПоЭксплуатации(Команда)
//Процедура выводит текстовый файл Инструкция по эксплуатации	 
	Инструкция="          Инструкция на обработку ПользователиИБвАД ."+Символы.ПС+" 
	|Обработка проверяет наличие всех пользователей Информационной Базы в Актив Директории."+Символы.ПС+"
	|1. Закладка ""ПользователиИБ"" отобпажает всех пользователей ИБ."+Символы.ПС+"
	|2. Закладка ""ПользователиАД"" отображает пользователей ИБ найденных в АД"+Символы.ПС+"
	|3. Закладка ""Отличие ИБ от АД"" отображает пользователей ИБ которых нет в АД и отличие пользователей ИБ и АД.";

	Предупреждение(Инструкция);

КонецПроцедуры

3. Функция ПолучитьПользователейИБ1 выбирает всех пользователей Информационной Базы, заполняет таблицу Пользователи и 
Возвращаемый массив МассивЛогинов1. Данные таблицы используются на закладке формы ПользователиИБ.
 


Код Функции:
    

&НаСервере
Функция ПолучитьПользователейИБ1()
//Выбираем всех пользователей ИБ, заполняем таблицу Пользователи и Возвращаемый массив МассивЛогинов1************************************************
	МассивЛогинов1=Новый Массив;
	ИмяДоменаАД="";                                        
	ЛогинАД="" ;
	ПолноеИмяПользователяАД="";

	Буква="";
	ЛогинИБ="";                                     
	Домен="";
	НомерПользователя=1;
	ПредидущийДомен="";
	СчетчикБукв=3;
	СчетчикДоменов=1;
	МассивПользователей= ПользователиИнформационнойБазы.ПолучитьПользователей();   //Встроенной функцией получаем массив пользователей Выборка
	Для Каждого ЭлементМассива Из МассивПользователей Цикл                         //Через цикл просматриваем массив Выборка по ключевому параметру Логин
		СчетчикБукв=3;
		ФлагДоменЛогин="Домен";
		ДоменЛогин=ЭлементМассива.ПользовательОС;                                  //Выбираем из массива пользователей значение ПользовательОС это ДоменЛогин
		ПолноеИмяПользователя=ЭлементМассива.ПолноеИмя;                            //Выбираем из массива пользователей значение ПолноеИмя
		ПользовательУникльныйИдентификатор=ЭлементМассива.УникальныйИдентификатор; //Выбираем из массива пользователей значение УникальныйИдентификатор
		
		Запрос = Новый Запрос;                                                     //Определяем текущего пользователя в справочнике Пользователи 
		Запрос.Текст = 
		"ВЫБРАТЬ
		|	Пользователи.Наименование КАК Наименование,
		|	Пользователи.ПометкаУдаления КАК ПометкаУдаления
		|ИЗ
		|	Справочник.Пользователи КАК Пользователи
		|ГДЕ
		|	Пользователи.ИдентификаторПользователяИБ = &ПользовательУникльныйИдентификатор"
		;
		Запрос.УстановитьПараметр("ПользовательУникльныйИдентификатор",ПользовательУникльныйИдентификатор);
		РезультатЗапроса = Запрос.Выполнить();
		Выборка = РезультатЗапроса.Выбрать();                                
		Пока Выборка.Следующий() Цикл
			НаименованиеВСправочнике=Выборка.Наименование;
			Если Выборка.ПометкаУдаления=Ложь Тогда
				ПометкаУдаленияПользователя = "Действует";                          //Записываем результат ПометкаУдаления
			Иначе
				ПометкаУдаленияПользователя = "Удален";
			КонецЕсли;		
		КонецЦикла; 
		
		Буква=Сред(ДоменЛогин,СчетчикБукв,1);
		Пока НЕ	Буква="" Цикл                                                       //В цикле преобразуем в необходимый вид Домен, ЛогинИБ, ПолноеИмяПользователя 
			Если НЕ Буква="\" Тогда
				Если ФлагДоменЛогин="Домен" Тогда
					Домен=Домен+Буква;
				КонецЕсли;
				
				Если ФлагДоменЛогин="Логин" Тогда
					ЛогинИБ=ЛогинИБ+Буква;                            
				КонецЕсли;
				
			Иначе
				ФлагДоменЛогин="Логин";	
			КонецЕсли;
			СчетчикБукв=СчетчикБукв+1;
			Буква=Сред(ДоменЛогин,СчетчикБукв,1);
		КонецЦикла;
		Строка=Пользователи.Добавить();                                            //Добавляем в таблицу Пользователи строку с параметрами пользователя
		Строка.Номер=НомерПользователя;
		Строка.Домен=Домен;                                        
		Строка.Логин =ЛогинИБ ;
		Строка.ФИО=ПолноеИмяПользователя;
		Строка.ПометкаУдаления=ПометкаУдаленияПользователя;
		Строка.НаименованиеВСправочникеПользователи=НаименованиеВСправочнике;
		
		МассивЛогинов1.Добавить(ЛогинИБ);                                         //Добавляем в возвращаемый массив логин пользователя в Информационной базе
		
		НомерПользователя=НомерПользователя+1;
		
		ПредидущийДомен=Домен;
		
		ФлагДоменЛогин="Домен";
		ЛогинИБ="";                                 
		Домен="";
	КонецЦикла;
	Возврат МассивЛогинов1;

КонецФункции


4. Функция ПолучитьДоменыИБ1 получает список доменов в МассивДоменов1, это необходимо для просмотра пользователей
в Актив Директории.

Код Функции:
            

&НаСервере
Функция ПолучитьДоменыИБ1()
//Заполняем возвращаемый массив	МассивДоменов********************************************************************************************************
	МассивДоменов1=Новый Массив;
	ПустойДомен="";
	СчетчикДоменов=1;
	Запрос = Новый Запрос;
	ПИБ = РеквизитФормыВЗначение("Пользователи",Тип("ТаблицаЗначений"));           //Выгружаем Табличный реквизит формы в переменную
	МВТ=Новый МенеджерВременныхТаблиц;                                             //Создаем МенеджерВременныхТаблиц
	Запрос.МенеджерВременныхТаблиц=МВТ;
	Запрос.Текст = 
	"ВЫБРАТЬ
	|	ПИБ1.Домен КАК Домен
	|ПОМЕСТИТЬ ВТДанные
	|ИЗ
	|	&ПИБ1 КАК ПИБ1
	|;
	|
	|////////////////////////////////////////////////////////////////////////////////
	|ВЫБРАТЬ
	|	ВТДанные.Домен КАК Домен
	|ИЗ
	|	ВТДанные КАК ВТДанные
	|ГДЕ
	|	ВТДанные.Домен <> &ПустойДомен
	|
	|СГРУППИРОВАТЬ ПО
	|	ВТДанные.Домен"
	;
	Запрос.УстановитьПараметр("ПустойДомен",ПустойДомен);
	Запрос.УстановитьПараметр("ПИБ1",ПИБ);
	РезультатЗапроса = Запрос.Выполнить();
	Выборка = РезультатЗапроса.Выбрать();                                
	Пока Выборка.Следующий() Цикл                                                 //Выбираем результат запроса в возвращаемый массив МассивДоменов1
		МассивДоменов1.Добавить(Выборка.Домен);
	КонецЦикла;   
	Возврат МассивДоменов1;
				
  КонецФункции
 

5. Процедура ПолучитьПользователяИзАД1 получает пользователей в Актив Директории и помещает их в таблицу ПользователиАД .
Данные таблицы используются на закладке формы ПользователиАД.
 


Код процедуры:
 

&НаКлиенте
Процедура ПолучитьПользователяИзАД1(МассивЛогинов,МассивДоменов)
//Процедура заполняет таблицу ПользователиАД, из АД заносим ФИО, Логин*******************************************************************************	
//Достаем значение Логина
НомерПользователя=0;

Для Каждого ЭлементМассива из МассивЛогинов Цикл
	ЛогинИБ=ЭлементМассива; 
	Если НЕ ЛогинИБ="" Тогда		
		ЛогинПользователя=СокрЛП(ЛогинИБ);
//Комутирум Active Directory для извлечения данных о пользователе
		КомандаАДО    = Новый COMОбъект("ADODB.Command");
		СоединениеАДО = Новый COMОбъект("ADODB.Connection");
		СоединениеАДО.Provider = "ADSDSOObject";
		Попытка
			СоединениеАДО.Open("Active Directory Provider");    
		Исключение
			Сообщить("Ошибка при открытии Active Directory Provider: " + ОписаниеОшибки());
			Возврат;
		КонецПопытки;
		
		КомандаАДО.ActiveConnection = СоединениеАДО;
		
//Получаем имя домена к которому принадлежит данный компьютер 
		Попытка
			RootDSE = ПолучитьCOMОбъект("LDAP://RootDSE");
		Исключение
			Сообщить("Ошибка ПолучитьCOMОбъект(LDAP://RootDSE): " + ОписаниеОшибки());
			Возврат;
		КонецПопытки;
		СчетчикДоменов=0;
		ПолноеИмяПользователя="";
		ИндексДомена=0;
		ФлагЦиклаДомена=0;
		ФлагПользователя=0;
		Для Каждого ЭлементМассива из МассивДоменов Цикл
			ТекущийДомен=ЭлементМассива;
//			Если ВРег(ТекущийДомен)="KRG" Тогда
//				ТекущийДомен="DC=krg,DC=mrg,DC=ru";
//			Иначе
				ТекущийДомен=ТекущийДомен+".local";
//			КонецЕсли;
			
			CommandText = " 
			|SELECT 
			|    AdsPath
			|FROM 'LDAP://" +ТекущийДомен + "'
			|WHERE 
			|    objectCategory = 'user'
			|    and objectClass = 'person'
			|    and SAMAccountName = '" + ЛогинПользователя + "'
			|";
			
			Попытка
				ВыборкаАДО = СоединениеАДО.Execute( CommandText); 
				ПутьОбъекта = ВыборкаАДО.Fields("AdsPath").Value;
				ОбъектАД = ПолучитьCOMОбъект(ПутьОбъекта);
				ЛогинАД= ОбъектАД.sAMAccountName;
				ПолноеИмяПользователя=ОбъектАД.cn;
				Если ЛогинАД=""  Тогда                                                  //Проверяем выборку на пустое значение , если ЛогинАД пуст пропускаем эту строку 
					ФлагЦиклаДомена=1;
				КонецЕсли;
			Исключение
				ФлагЦиклаДомена=1;
			КонецПопытки;
			Если  ФлагЦиклаДомена=0 Тогда                                               //Проверяем был ли найден пользователь в домене 
				
				НомерПользователя=НомерПользователя+1;
						
				Строка=ПользователиАД.Добавить();
				Строка.ЛогинИБ =ЛогинИБ ;
				Строка.Номер=НомерПользователя;
				Строка.Домен=ТекущийДомен;                                        
				Строка.Логин =ЛогинАД ;
				Строка.ФИО=ПолноеИмяПользователя;
				
				Сообщить("Пользователь"+ПолноеИмяПользователя+" найден в АД."); 
				
				
				ИмяДомена="";
				ЛогинАД="";
				ПолноеИмяПользователя="";
				ВыборкаАДО.Close();
				Прервать;
			КонецЕсли;	
			ФлагЦиклаДомена=0;
			ИндексДомена=ИндексДомена+1;
		КонецЦикла;		
		ФлагПользователя=0;
		СоединениеАДО.Close();
	КонецЕсли;	
КонецЦикла;

КонецПроцедуры

 

6. Процедура ЗаполнениеОтличиеИБотАД заполняет таблицу ОтличиеИБотАД, которая используются на закладке формы ОтличиеИБотАД.
 


Код процедуры:
 


&НаКлиенте
Процедура ПолучитьПользователяИзАД1(МассивЛогинов,МассивДоменов)
//Процедура заполняет таблицу ПользователиАД, из АД заносим ФИО, Логин*******************************************************************************	
//Достаем значение Логина
НомерПользователя=0;

Для Каждого ЭлементМассива из МассивЛогинов Цикл
	ЛогинИБ=ЭлементМассива; 
	Если НЕ ЛогинИБ="" Тогда		
		ЛогинПользователя=СокрЛП(ЛогинИБ);
//Комутирум Active Directory для извлечения данных о пользователе
		КомандаАДО    = Новый COMОбъект("ADODB.Command");
		СоединениеАДО = Новый COMОбъект("ADODB.Connection");
		СоединениеАДО.Provider = "ADSDSOObject";
		Попытка
			СоединениеАДО.Open("Active Directory Provider");    
		Исключение
			Сообщить("Ошибка при открытии Active Directory Provider: " + ОписаниеОшибки());
			Возврат;
		КонецПопытки;
		
		КомандаАДО.ActiveConnection = СоединениеАДО;
		
//Получаем имя домена к которому принадлежит данный компьютер 
		Попытка
			RootDSE = ПолучитьCOMОбъект("LDAP://RootDSE");
		Исключение
			Сообщить("Ошибка ПолучитьCOMОбъект(LDAP://RootDSE): " + ОписаниеОшибки());
			Возврат;
		КонецПопытки;
		СчетчикДоменов=0;
		ПолноеИмяПользователя="";
		ИндексДомена=0;
		ФлагЦиклаДомена=0;
		ФлагПользователя=0;
		Для Каждого ЭлементМассива из МассивДоменов Цикл
			ТекущийДомен=ЭлементМассива;
//			Если ВРег(ТекущийДомен)="KRG" Тогда
//				ТекущийДомен="DC=krg,DC=mrg,DC=ru";
//			Иначе
				ТекущийДомен=ТекущийДомен+".local";
//			КонецЕсли;
			
			CommandText = " 
			|SELECT 
			|    AdsPath
			|FROM 'LDAP://" +ТекущийДомен + "'
			|WHERE 
			|    objectCategory = 'user'
			|    and objectClass = 'person'
			|    and SAMAccountName = '" + ЛогинПользователя + "'
			|";
			
			Попытка
				ВыборкаАДО = СоединениеАДО.Execute( CommandText); 
				ПутьОбъекта = ВыборкаАДО.Fields("AdsPath").Value;
				ОбъектАД = ПолучитьCOMОбъект(ПутьОбъекта);
				ЛогинАД= ОбъектАД.sAMAccountName;
				ПолноеИмяПользователя=ОбъектАД.cn;
				Если ЛогинАД=""  Тогда                                                  //Проверяем выборку на пустое значение , если ЛогинАД пуст пропускаем эту строку 
					ФлагЦиклаДомена=1;
				КонецЕсли;
			Исключение
				ФлагЦиклаДомена=1;
			КонецПопытки;
			Если  ФлагЦиклаДомена=0 Тогда                                               //Проверяем был ли найден пользователь в домене 
				
				НомерПользователя=НомерПользователя+1;
						
				Строка=ПользователиАД.Добавить();
				Строка.ЛогинИБ =ЛогинИБ ;
				Строка.Номер=НомерПользователя;
				Строка.Домен=ТекущийДомен;                                        
				Строка.Логин =ЛогинАД ;
				Строка.ФИО=ПолноеИмяПользователя;
				
				Сообщить("Пользователь"+ПолноеИмяПользователя+" найден в АД."); 
				
				
				ИмяДомена="";
				ЛогинАД="";
				ПолноеИмяПользователя="";
				ВыборкаАДО.Close();
				Прервать;
			КонецЕсли;	
			ФлагЦиклаДомена=0;
			ИндексДомена=ИндексДомена+1;
		КонецЦикла;		
		ФлагПользователя=0;
		СоединениеАДО.Close();
	КонецЕсли;	
КонецЦикла;

КонецПроцедуры

 

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

См. также

Infostart Toolkit: Инструменты разработчика 1С 8.3 на управляемых формах

Инструментарий разработчика Роли и права Запросы СКД Платформа 1С v8.3 Управляемые формы Запросы Система компоновки данных Конфигурации 1cv8 Платные (руб)

Набор инструментов программиста и специалиста 1С для всех конфигураций на управляемых формах. В состав входят инструменты: Консоль запросов, Консоль СКД, Консоль кода, Редактор объекта, Анализ прав доступа, Метаданные, Поиск ссылок, Сравнение объектов, Все функции, Подписки на события и др. Редактор запросов и кода с раскраской и контекстной подсказкой. Доработанный конструктор запросов тонкого клиента. Продукт хорошо оптимизирован и обладает самым широким функционалом среди всех инструментов, представленных на рынке.

10000 руб.

02.09.2020    126265    683    389    

737

Автоподбор ролей для профилей и групп доступа в любых типовых базах 1С УТ 11, КА 2, ERP2, Розница 2/3, УНФ 16/3, БП 3, ЗУП 3 и подобных (УФ, Платформа 8.3.14+)

Инструменты администратора БД Роли и права 8.3.14 1С:Розница 2 1С:Управление нашей фирмой 1.6 1С:Документооборот 1С:Зарплата и кадры государственного учреждения 3 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х 1С:Зарплата и Управление Персоналом 3.x 1С:Управление нашей фирмой 3.0 1С:Розница 3.0 Платные (руб)

Роли… Вы тратите много времени и сил на подбор ролей среди около 2400 в ERP или 1500 в Рознице 2, пытаясь понять какими правами они обладают? Вы все время смотрите права в конфигураторе или отчетах чтоб создать нормальные профили доступа? Вы хотите наглядно видеть какие права дает профиль и редактировать все в простом виде? А может хотите просто указать подсистему и дать права на просмотр и добавление на объекты и не лезть в дебри прав и чтоб обработка сама подобрала нужные роли? Все это теперь стало возможно! Обновление от 15.12.2023, версия 1.1.

14400 руб.

06.12.2023    3706    19    1    

40

Infostart УДиФ: Управление данными и формами 1С

Инструменты администратора БД Инструментарий разработчика Роли и права Платформа 1С v8.3 Конфигурации 1cv8 Россия Платные (руб)

Расширение позволяет без изменения кода конфигурации выполнять проверки при вводе данных, скрывать от пользователя недоступные ему данные, выполнять код в обработчиках. Не изменяет данные конфигурации, легко устанавливается практически на любую конфигурацию на управляемых формах.

10000 руб.

10.11.2023    4616    12    2    

38

Запрет доступа к данным по зарплате для БП 3.0 и КА 2.5

Зарплата Роли и права Платформа 1С v8.3 Бухгалтерский учет Управление правами 1С:Бухгалтерия 3.0 1С:Комплексная автоматизация 2.х Молдова Россия Казахстан Бухгалтерский учет Платные (руб)

Расширение позволяет максимально полно ограничить доступ пользователей к данным по заработной плате, а именно закрывает доступ к документам начисления и выплаты заработной платы, не позволяет просматривать бухгалтерские отчеты по счету учета зарплаты а также убирает зарплатные проводки из журнала проводок. Расширение запрещает просматривать платежные документы на выплату зарплаты, так же не доступны регламентные отчеты в ПФР и ИФНС. Расширение предлагает готовые настроенные профили "Бухгалтер без зарплаты", "Только просмотр без зарплаты".

5700 руб.

27.05.2021    33238    206    89    

166

Роли для кладовщика

Логистика, склад и ТМЦ Роли и права Платформа 1С v8.3 Бухгалтерский учет Управление правами 1С:Бухгалтерия 3.0 Россия Бухгалтерский учет Управленческий учет Платные (руб)

Расширение, которое позволяет использовать отдельные роли для доступа к складским документам, для доступа к документам раздела "Производство" и для доступа к документам раздела "Покупки".

2520 руб.

21.05.2019    1692641    553    192    

133

Расширение для разграничения доступа к контрагентам и обработка для группового назначения доступа для Бухгалтерии (RLS) 3.0.143.42

Роли и права Платформа 1С v8.3 1С:Бухгалтерия 3.0 Россия Бухгалтерский учет Платные (руб)

Расширение предназначено для Бухгалтерии предприятия (версии ПРОФ и КОРП). Типовая конфигурация остается на поддержке. С помощью расширения менеджер по продажам будет иметь доступ к контрагентам и списку их документов только в случае, если он является для них ответственным. Пользователю с полными правами также доступна обработка «Назначение ответственных» для группового добавления/удаления ответственного в карточке контрагента. Есть версия данного расширения для клиентов Fresh - в магазине расширений (Fresh)

9360 руб.

14.09.2022    5858    7    4    

9

Универсальная система оповещений в базе или по почте по произвольным условиям, расписанием, ролям и пользователям (Расширение / конфигурация для платформ 8.3.6+, для ЛЮБЫХ баз)

Роли и права Платформа 1С v8.3 Конфигурации 1cv8 1С:Управление торговлей 11 Платные (руб)

Данная система разработана как альтернатива стандартной системе напоминаний. Но имеет ряд существенных преимуществ: отображение в базе или с отправкой по почте, свое расписание, возможность фильтрации по ролям и пользователям, формирование своих запросов и макетов, шаблоны писем, работа в фоне. А также может блокировать работу пользователей при заданных условиях. Может работать в составе любой конфигурации. Имеется справка с описанием возможностей. (Обновление от 20.02.2024, версия 2.2, расширение)

19200 руб.

29.11.2019    24817    14    8    

33
Оставьте свое сообщение