Каталог решений - Ошибка аутентификации клиента средствами операционной системы: Аутентификационный контекст клиента отсутствует в рабочем процессе

Ошибка аутентификации клиента средствами операционной системы: Аутентификационный контекст клиента отсутствует в рабочем процессе

Ошибка аутентификации клиента средствами операционной системы: Аутентификационный контекст клиента отсутствует в рабочем процессе

В наличии

Устранение ошибки «Ошибка аутентификации клиента средствами операционной системы: Аутентификационный контекст клиента отсутствует в рабочем процессе», при вызове метода «УстановитьСоединенение()».

Категория:

Описание

Проблема: При установке соединения с внешним источником, возникает ошибка: "Ошибка аутентификации клиента средствами операционной системы: Аутентификационный контекст клиента отсутствует в рабочем процессе".

Решение: 

1. Если требуется выполнить аутентификацию от имени пользователя операционной системы (доменная авторизация):

Внимание! Важно учитывать, на какой стороне выполняете подключение к внешнему источнику, а именно, если выполняется соединение на стороне "Толстого клиента", пользователем для авторизации на внешнем источнике будет выступать "пользователь Windows" от имени которого был запущен клиент. Если подключение будет выполняться "На сервере", пользователем для авторизации будет выступать "пользователь — Windows" от имени которого выполняется служба кластера 1С.

 

СУБД = "MSSQLServer"; // Внешний источник MS SQL
ИмяСервераСУБД = "computer"; // Имя компьютера в локальной сети
ИмяБазыДанныхНаСУБД = "sample"; // Имя базы данных на сервере MS SQL

// Описание параметров подключения
Соединение = Новый ПараметрыСоединенияВнешнегоИсточникаДанных;
Соединение.СУБД = ПараметрыСоединения.СУБД;
Соединение.АутентификацияОС = Неопределено; // Включаем доменную авторизацию. Важно! Установка в значение "Истина", приведёт к вышеназванной ошибке
Соединение.СтрокаСоединения = СтрШаблон("Driver={SQL Server};Server=%1;Database=%2", ИмяСервераСУБД, ИмяБазыДанныхНаСУБД);

// Перезапись всех параметров соединения - новыми (параметры соединения кэшируются, для этого всегда требуется повторная установка, если меняются параметры авторизации)
ВнешнийИсточник.УстановитьОбщиеПараметрыСоединения(Соединение);
ВнешнийИсточник.УстановитьПараметрыСоединенияПользователя(ИмяПользователя(), Соединение);
ВнешнийИсточник.УстановитьПараметрыСоединенияСеанса(Соединение);

// Выполняем авторизацию
ВнешнийИсточник.УстановитьСоединение();

 

2. Если для авторизации на внешнем источнике необходимо использовать логин и пароль:

 

СУБД = "MSSQLServer"; // Внешний источник MS SQL
ИмяСервераСУБД = "computer"; // Имя компьютера в локальной сети
ИмяБазыДанныхНаСУБД = "sample"; // Имя базы данных на сервере MS SQL
ИмяПользователяНаСУБД = "sa";
ПарольПользователяНаСУБД = "qwerty";

// Описание параметров подключения
Соединение = Новый ПараметрыСоединенияВнешнегоИсточникаДанных;
Соединение.СУБД = ПараметрыСоединения.СУБД;
Соединение.АутентификацияОС = Ложь; // Отключаем доменную авторизацию
Соединение.ИмяПользователя = ИмяПользователяНаСУБД;
Соединение.Пароль = ПарольПользователяНаСУБД;
Соединение.СтрокаСоединения = СтрШаблон("Driver={SQL Server};Server=%1;Database=%2", ИмяСервераСУБД, ИмяБазыДанныхНаСУБД);

// Перезапись всех параметров соединения - новыми (параметры соединения кэшируются, для этого всегда требуется повторная установка, если меняются параметры авторизации)
ВнешнийИсточник.УстановитьОбщиеПараметрыСоединения(Соединение);
ВнешнийИсточник.УстановитьПараметрыСоединенияПользователя(ИмяПользователя(), Соединение);
ВнешнийИсточник.УстановитьПараметрыСоединенияСеанса(Соединение);

// Выполняем авторизацию
ВнешнийИсточник.УстановитьСоединение();

 

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

1. Всегда выполняю подключение к внешнему источнику только "на сервере".

2. Запрос данных из внешнего источника выполняю в "фоновом задании", для того что — бы устранить "бесконечное" ожидание данных из внешнего источника в случае внештатной ситуации, а так же "динамически" менять допустимое время на получение данных от внешнего источника для разных запросов.

3. Использовать одну функцию через которую выполняются все запросы к внешним источникам.

Пример:

1. Текст общего модуля "ВнешнийИсточник" (Сервер):

 

////////////////////////////////////////////////////////////////////////////////
// Механизмы чтения данных из внешних источниках
// Выполняется только на сервере.
//
////////////////////////////////////////////////////////////////////////////////
#Область ПрограммныйИнтерфейс

// Чтение данных из внешнего источника
//
// Параметры:
//  ВнешнийИсточник  - ВнешниеИсточникиДанныхМенеджер - Внешний источник для которого выполняется подключение
//  ТекстЗапроса     - Строка - Текст запроса к внешнему источнику
//  ПараметрыЗапроса - Структура - Параметры запроса: "Ключ" - имя параметра, "Значение" - значение параметра
//  ТекстОшибки      - Строка - В значение переменной будет передан текст ошибки
//  Таймаут          - Число - Максимально разрешенное время на выполнение запроса (по умолчанию 60 секунд)
//
// Возвращаемое значение:
//  Неопределено, РезультатЗапроса - Результат выборки внешнего источника
//
Функция ПрочитатьДанные(ВнешнийИсточник, ТекстЗапроса, ПараметрыЗапроса, ТекстОшибки, Таймаут = 60) Экспорт
	
	АдресХранилища = ПоместитьВоВременноеХранилище(Неопределено, Новый УникальныйИдентификатор);
	ПараметрыФоновогоЗадания = Новый Массив;
	ПараметрыФоновогоЗадания.Добавить(ВнешнийИсточник);
	ПараметрыФоновогоЗадания.Добавить(ТекстЗапроса);
	ПараметрыФоновогоЗадания.Добавить(ПараметрыЗапроса);
	ПараметрыФоновогоЗадания.Добавить(АдресХранилища);
	
	ФоновоеЧтениеДанных = ФоновыеЗадания.Выполнить("АР_ВнешниеИсточникиСервер.ФоновоеЧтениеДанных", ПараметрыФоновогоЗадания, , "Чтение данных из внешнего источника");
	ФоновоеЧтениеДанных.ОжидатьЗавершенияВыполнения(Таймаут);
	ФоновоеЧтениеДанных = ФоновыеЗадания.НайтиПоУникальномуИдентификатору(ФоновоеЧтениеДанных.УникальныйИдентификатор);
	Если ФоновоеЧтениеДанных.Состояние = ПредопределенноеЗначение("СостояниеФоновогоЗадания.Активно") Тогда
		
		ФоновоеЧтениеДанных.Отменить();
		
		ТекстОшибки = "Превышен интервал ожидания чтения данных из внешнего источника";
		ЗаписьЖурналаРегистрации("ВнешниеИсточники.Таймаут", УровеньЖурналаРегистрации.Предупреждение, , , ТекстОшибки);
		
		Возврат Неопределено;
		
	КонецЕсли;
	
	РезультатЧтения = ПолучитьИзВременногоХранилища(АдресХранилища);
	УдалитьИзВременногоХранилища(АдресХранилища);
	
	Если РезультатЧтения = Неопределено Тогда
		
		ИнформацияОбОшибке = ФоновоеЧтениеДанных.ИнформацияОбОшибке;
		ТекстОшибки = ?(ИнформацияОбОшибке = Неопределено, "",
			ОбработкаОшибок.КраткоеПредставлениеОшибки(ФоновоеЧтениеДанных.ИнформацияОбОшибке));
		
		ТекстОшибки = СтрШаблон(
			"Не удалось выполнить чтение данных ""%1""",
			?(ПустаяСтрока(ТекстОшибки), "Не удалось получить результат выполнения операции, выполните перезапуск программы 1С:Предприятие", ТекстОшибки));
		
		Возврат Неопределено;
		
	КонецЕсли;
	
	ТекстОшибки = РезультатЧтения.ТекстОшибки;
	
	Возврат РезультатЧтения.Результат;
	
КонецФункции // ПрочитатьДанные()

#КонецОбласти

#Область СлужебныйПрограммныйИнтерфейс

// Системная процедура для чтения данных в фоновом задании (используйте функцию "ПрочитатьДанные")
//
// Параметры:
//  ВнешнийИсточник  - ВнешниеИсточникиДанныхМенеджер - Внешний источник для которого выполняется подключение
//  ТекстЗапроса     - Строка - Текст запроса к внешнему источнику
//  ПараметрыЗапроса - Структура - Параметры запроса: "Ключ" - имя параметра, "Значение" - значение параметра
//  Автоцентр        - СправочникСсылка.Автоцентры - Автоцентр по которому будет определен SQL - сервер для подключения
//  АдресХранилища   - Строка - Адрес во временном хранилище куда будет помещен результат выполнения
//
Процедура ФоновоеЧтениеДанных(ВнешнийИсточник, ТекстЗапроса, ПараметрыЗапроса, АдресХранилища) Экспорт
	
	СтруктураПараметровВозврата = Новый Структура("Результат, ТекстОшибки", Неопределено, "");
	Если УстановитьСоединение(ВнешнийИсточник, СтруктураПараметровВозврата.ТекстОшибки) Тогда
		
		Запрос = Новый Запрос(ТекстЗапроса);
		Если НЕ ПараметрыЗапроса = Неопределено Тогда
		
			Для Каждого Параметр Из ПараметрыЗапроса Цикл
				
				Запрос.УстановитьПараметр(Параметр.Ключ, Параметр.Значение);
				
			КонецЦикла;
		
		КонецЕсли;
		
		// Чтение в попытке на случай если запрос некорректный
		Попытка
			
			УстановитьПривилегированныйРежим(Истина);
				
				СтруктураПараметровВозврата.Результат = Запрос.Выполнить();
				
			УстановитьПривилегированныйРежим(Ложь);
			
		Исключение
			
			СтруктураПараметровВозврата.ТекстОшибки = СтрШаблон("Не удалось выполнить чтение данных ""%1""",
				ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке()));
			
		КонецПопытки;
		
		УстановитьПривилегированныйРежим(Истина);
			
			ВнешнийИсточник.РазорватьСоединение();
			
		УстановитьПривилегированныйРежим(Ложь);
		
	КонецЕсли;
	
	ПоместитьВоВременноеХранилище(СтруктураПараметровВозврата, АдресХранилища);
	
КонецПроцедуры // ФоновоеЧтениеДанных()

#КонецОбласти

#Область СлужебныеПроцедурыИФункции

// Подключение к базе данных внешнего источника
//
// Параметры:
//  ВнешнийИсточник - ВнешниеИсточникиДанныхМенеджер - Внешний источник для которого выполняется подключение
//  ТекстОшибки     - Строка - В значение переменной будет передан текст ошибки
//
// Возвращаемое значение:
//  Булево - Результат подключения
//
Функция УстановитьСоединение(ВнешнийИсточник, ТекстОшибки)
	
	ПараметрыСоединения = ПолучитьПараметры(ВнешнийИсточник);
	Если ПараметрыСоединения = Неопределено ИЛИ ПустаяСтрока(ПараметрыСоединения.БазаДанных) Тогда
		
		ТекстОшибки = СтрШаблон("Не установлены параметры соединения с сервером внешних источников ""Параметры обмена данными""");
		Возврат Ложь;
		
	КонецЕсли;
	
	// Описание параметров подключения
	Соединение = Новый ПараметрыСоединенияВнешнегоИсточникаДанных; //@skip-check type-not-used-in-operator-new
	Соединение.СУБД = ПараметрыСоединения.СУБД;
	Соединение.СтрокаСоединения = СтрШаблон("Driver={SQL Server};Server=%1;Database=%2",
		ПараметрыСоединения.СерверБазДанных, ПараметрыСоединения.БазаДанных);
	
	// Переданы параметры подключения
	Если НЕ ПустаяСтрока(ПараметрыСоединения.Логин) Тогда
		
		Соединение.АутентификацияОС = Ложь;
		Соединение.ИмяПользователя = ПараметрыСоединения.Логин;
		Соединение.Пароль = ПараметрыСоединения.Пароль;
		
	КонецЕсли;
	
	УстановитьПривилегированныйРежим(Истина);
		
		ВнешнийИсточник.УстановитьОбщиеПараметрыСоединения(Соединение);
		ВнешнийИсточник.УстановитьПараметрыСоединенияПользователя(ИмяПользователя(), Соединение);
		ВнешнийИсточник.УстановитьПараметрыСоединенияСеанса(Соединение);
		
	УстановитьПривилегированныйРежим(Ложь);
	
	// Нет связи с сервером SQL или неверный логин и пароль
	Попытка
		
		УстановитьПривилегированныйРежим(Истина);
			
			ВнешнийИсточник.УстановитьСоединение();
			
		УстановитьПривилегированныйРежим(Ложь);
		
	Исключение
		
		ТекстОшибки = СтрШаблон(
			"Не удалось установить соединение с внешним источником, сервер ""%1"", база данных ""%2"", по причине ""%3""",
			ПараметрыСоединения.СерверБазДанных, ПараметрыСоединения.БазаДанных,
			ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке()));
		
		Возврат Ложь;
		
	КонецПопытки;
	
	Возврат Истина;
	
КонецФункции // УстановитьСоединение()

// Параметры подключения к внешнему источнику
//
// Параметры:
//  ВнешнийИсточник - ВнешниеИсточникиДанныхМенеджер - Внешний источник для которого выполняется подключение
//
// Возвращаемое значение:
//  Структура - Параметры авторизации.
//    Описание структуры параметров:
//    * СУБД            - Строка - Допустимый тип внешнего источника.
//    * СерверБазДанных - Строка - Имя компьютера в локальной сети.
//    * БазаДанных      - Строка - Имя базы данных на сервере.
//    * Логин           - Строка - Имя пользователя на внешнем источнике (если не указано - выполняется доменная авторизация).
//    * Пароль          - Строка - Пароль пользователя на внешнем источнике.
// 
Функция ПолучитьПараметры(ВнешнийИсточник)
	
	ПараметрыСоединения = Новый Структура;
	ПараметрыСоединения.Вставить("СУБД", "MSSQLServer");
	ПараметрыСоединения.Вставить("Логин", "");
	ПараметрыСоединения.Вставить("Пароль", "");	

	Если ВнешнийИсточник = ВнешниеИсточникиДанных.ПоУмолчанию Тогда

		ПараметрыСоединения.СерверБазДанных = "sql";
		ПараметрыСоединения.БазаДанных = "default";

	КонецЕсли;

	Возврат ПараметрыСоединения; 

КонецФункции // ПолучитьПараметры()

#КонецОбласти

 

2. Пример выполнения запроса к внешнему источнику:

 

ТекстЗапроса =
"ВЫБРАТЬ
|	ADExplorer.НаименованиеПолное КАК НаименованиеПолное,
|	ADExplorer.АдресЭлектроннойПочты КАК АдресЭлектроннойПочты
|ИЗ
|	ВнешнийИсточникДанных.ПоУмолчанию.Таблица.ADExplorer КАК ADExplorer
|ГДЕ
|	ADExplorer.ИмяПользователя = &ИмяПользователя";

ТекстОшибки = "";
Результат = АР_ВнешниеИсточникиСервер.ПрочитатьДанные(ВнешниеИсточникиДанных.ПоУмолчанию, ТекстЗапроса,
	Новый Структура("ИмяПользователя", "admin"), ТекстОшибки);

Если НЕ ПустаяСтрока(ТекстОшибки) Тогда
	
	ЗаписьЖурналаРегистрации("АвтоматическоеСозданиеУчетныхЗаписей", УровеньЖурналаРегистрации.Ошибка, , ,
		ТекстОшибки);
	
	Возврат;
	
КонецЕсли;

ВыборкаИзРезультатаЗапроса = Результат.Выбрать();
ВыборкаИзРезультатаЗапроса.Следующий();

 

has been added to your cart:
Оформление заказа