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

23.01.20

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

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

Скачать файл

ВНИМАНИЕ: Файлы из Базы знаний - это исходный код разработки. Это примеры решения задач, шаблоны, заготовки, "строительные материалы" для учетной системы. Файлы ориентированы на специалистов 1С, которые могут разобраться в коде и оптимизировать программу для запуска в базе данных. Гарантии работоспособности нет. Возврата нет. Технической поддержки нет.

Наименование По подписке [?] Купить один файл
Соответствие пользователей Информационной Базы и Актив Директория.:
.epf 12,02Kb
12
12 Скачать (1 SM) Купить за 1 850 руб.

Обработка предназначена для работы в клиент-серверных базах и тестировалась на платформе 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();
	КонецЕсли;	
КонецЦикла;

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

 

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

См. также

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

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

12000 руб.

02.09.2020    169341    937    403    

905

Инструменты администратора БД Роли и права Системный администратор Программист Пользователь 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, пытаясь понять какими правами они обладают? Вы все время смотрите права в конфигураторе или отчетах чтоб создать нормальные профили доступа? Вы хотите наглядно видеть какие права дает профиль и редактировать все в простом виде? А может хотите просто указать подсистему и дать права на просмотр и добавление на объекты и не лезть в дебри прав и чтоб обработка сама подобрала нужные роли? Все это теперь стало возможно! Обновление от 18.09.2024, версия 1.2

18000 руб.

06.12.2023    10016    48    5    

78

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

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

5940 руб.

27.05.2021    38967    281    98    

215

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

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

15000 руб.

10.11.2023    11402    40    27    

66

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

Расширение для 1С:Бухгалтерия 3.0, которое позволяет использовать отдельные роли для доступа к складским документам, для доступа к документам раздела "Производство" и для доступа к документам раздела "Покупки".

4560 руб.

21.05.2019    1695307    575    194    

137

Ценообразование, анализ цен Роли и права Системный администратор Платформа 1С v8.3 Управление правами 1С:Управление нашей фирмой 1.6 1С:Управление нашей фирмой 3.0 Россия Платные (руб)

Расширение возможностей программы 1С УНФ. Функционал расширения - разграничение всевозможных прав пользователей и контроль при совершении различных действий.

3000 руб.

23.02.2018    59198    164    262    

156

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

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

19200 руб.

29.11.2019    25887    17    8    

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