Вход | Регистрация
 
1С:Предприятие :: 1С:Предприятие 8 общая

Определить аутентификацию пользователя

Определить аутентификацию пользователя
Я
   Mikhail Volkov
 
02.11.20 - 17:35
Обычно пользователи заходят в базы с ОС-аутентификацией без ввода пароля. Но когда какие-то проблемы, заходят с 1С-аутентификацией, вводят пароль, и работают... Иногда возникают ситуации необходимости Com-соединения с другой базой, тогда важно, чтобы у пользователя была ОС-аутентификация. Хотелось, чтобы заранее просматривая ЖР определять у кого у пользователей проблемы с ОС-аутентификацией.
Как-то нужно было знать с какого компьютера зашел пользователь, дописывал его в запись ЖР:
Функция ПервоначальнаяИнициализация(ЕстьПраваАдминистратора,ОбнаруженПервыйЗапуск,НеобходимоОбновлениеБазыДанных) Экспорт
    
    Пользователь = ПараметрыСеанса.Пользователь;
    ИмяПользователя = ИмяПользователя();
    ПолноеИмяПользователя = ПолноеИмяПользователя();
    
    // Переопределим текущий компьютер (в клиентской сессии пользователя он может
    // отличным от того что был определен в УстановкаПараметровСеанса)
    Состояние("Обновляем информацию о компьютере ...");
    Имя = мвДоработки.ПолучитьИмяКомпьютераТО();    //+МВ 10.10.2017
    Если Не ПустаяСтрока(Имя) Тогда
        ЗаписьЖурналаРегистрации("Терминальный вход пользователя: " + СокрЛП(Пользователь.Код),
                                 УровеньЖурналаРегистрации.Информация,
                                 ?(ТипЗнч(Пользователь) = Тип("СправочникСсылка.Пользователи"), Пользователь.Метаданные(), Неопределено),
                                 Пользователь,
                                 "с компьютера: " + Имя);
Хотелось бы, в эту запись писать аутентификацию пользователя. Как?
   Beduin
 
1 - 02.11.20 - 17:43
АутентификацияОС из объекта ПользовательИнформационнойБазы
   Mikhail Volkov
 
2 - 02.11.20 - 20:33
(1) Оказывается у меня уже есть функция (писал когда-то):
// Возвращает Истина, если пользователь имеет аутентификацию ОС

//
Функция АутентификацияWindows(Пользователь = Неопределено) Экспорт
    Возврат Не ПустаяСтрока(мвДоработкиНаСервере.ПользовательИБ(Пользователь).ПользовательОС);
КонецФункции// АутентификацияWindows()


Но она неправильно работает:
Тип: Строка.
Содержит строку, идентифицирующую пользователя операционной системы при установленном свойстве АутентификацияОС.
Формат строки: \\ИмяДомена\ИмяПользователя.
При установке наличие пользователя в операционной системе не проверяется.

т.е. если в Аутентификация ОС что-то прописано, но неправильно (домены поменялись), то все равно даст Истина. Хотя пользователь зашел с 1С-аутентификацией.
   УдавВПопугаях
 
3 - 03.11.20 - 08:10
а если проверять есть ли указанный домен и пользователь в нем через AD и писать это в ЖР?
   Mikhail Volkov
 
4 - 03.11.20 - 10:29
(3) Ну если пользователь зашел с 1С-аутентификацией, а у него прописана ОС-аутентификация, тогда проверять что неправильно. Учетные записи и домены сисадмины меняют, не предупреждая. Надо вовремя заметить проблему с ОС-аутентификацией пользователя, пока не появились проблемы  Com-соединений!
   УдавВПопугаях
 
5 - 03.11.20 - 10:39
ну так посмотреть при начале работы учетку, проверить корректность такого \\домена\пользователя и если нет, то оставить запись в журнале, отправить смску, запустить голубиную почту, что пользователь не прошел проверку подлинности windows по доменной учетке и делать выводы. да можно рег. заданием проверять корректность всех пользователей, вопрос в удобности обработки такой информации?
   ДенисЧ
 
6 - 03.11.20 - 10:40
(4) "Учетные записи и домены сисадмины меняют, не предупреждая"

Прописать им лекарство. Сразу начнут и предпруждать, и согласовывать.
   Mikhail Volkov
 
7 - 03.11.20 - 12:00
(5) > проверить корректность такого \\домена\пользователя
Как, средствами 1С? Боюсь, что это не просто... Может пользователь временно сел за включенный компьютер, или другие ситуации... Пока столкнулся со старыми именами доменов и учеток.
   Mikhail Volkov
 
8 - 03.11.20 - 12:01
+ за чужой включенный компьютер
   УдавВПопугаях
 
9 - 03.11.20 - 12:02
(7) есть коды общения с AD, где то были у меня, искать надо
   УдавВПопугаях
 
10 - 03.11.20 - 12:05
вот что то похожее
" Боюсь, что это не просто"
ничего там сложного нет, запросами

https://www.koderline.ru/expert/instruktsii/article-instruktsiya-integratsiya-1s-i-microsoft-active-directory/
   УдавВПопугаях
 
11 - 03.11.20 - 12:08
если озадачиться, то можно наверно на автомат перевести, типа синхронизировать домен с базой, но признак конечно нужен, может в AD где то УИДы есть, смотреть изучать надо
   УдавВПопугаях
 
12 - 03.11.20 - 12:11
такое даже встретил, пока смотрел
Глобальный контекст (Global context)
ПользователиОС (OSUsers)
Синтаксис:

ПользователиОС()
Возвращаемое значение:

Тип: ТаблицаЗначений; Массив.
Информация возвращается в виде таблицы значений, в колонках которой содержится следующая информация:
ИмяДомена (DomainName) - имя домена (тип Строка); 
ИмяСервера (ServerName) - имя компьютера, являющегося контроллером домена (тип Строка); 
Пользователи (Users) - массив строк с именами пользователей домена; 
Локальный (Local) - признак того, что этому домену принадлежат локальные пользователи данного компьютера.
Описание:

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

Доступность:

Тонкий клиент, толстый клиент.
Примечание:

При использовании в тонком клиенте, информация возвращается в виде массива структур со свойствами (аналогичными колонкам возвращаемой таблицы значений
   vde69
 
13 - 03.11.20 - 12:24
   Mikhail Volkov
 
14 - 03.11.20 - 12:43
(12) (13) Это все хорошо после для устранения проблем с ОС-аутентификацией пользователя. Мне надо его выявить: входит пользователь в базу, в ЖР пишется его имя (еще добавил с какого компа). Хочу еще добавить с какой аутентификацией он зашел. Есть такая возможность?
   Вафель
 
15 - 03.11.20 - 12:53
если зашел не с аут. ОС, то в ЖР пишется ошибка.
релиз 8.3.17
   Mikhail Volkov
 
16 - 03.11.20 - 13:04
(15) К сожалению 8.3.10.2466
   УдавВПопугаях
 
17 - 03.11.20 - 13:32
это тролинг?
   УдавВПопугаях
 
18 - 03.11.20 - 13:39
в стандартном варианте запись в журнал добавляется точно в таком же виде, даже более избыточном
   УдавВПопугаях
 
19 - 03.11.20 - 13:41
и даже тип аутентифкации по этой записи можно определить
но зачем оно нужно, если потом придется лопатить журнал, анализировать там что то, этот ручной вариант досттупен по умолчанию, что тогда в нем не устраивает
   УдавВПопугаях
 
20 - 03.11.20 - 13:49
пойди в журнал и посмотри, с каким типом он авторизовался в последний раз
кстати, а КОМ тоже сам пароль вводит, если не прошла ОС проверку, ведь надо же запись в журнале оставить?
   Mikhail Volkov
 
21 - 03.11.20 - 14:35
(19) > и даже тип аутентифкации по этой записи можно определить
Как? Там только: Дата и время, Пользователь (его код), Компьютер (терминал), Приложение (толстый клиент), Сеанс (номер), Событие (в (0), и что добавлю), и Представление данных (полное имя пользователя).
   Mikhail Volkov
 
22 - 03.11.20 - 14:38
(20) В журнале регистрации нет аутентификации пользователя в 8.3.10.2466, хочу добавить.
   УдавВПопугаях
 
23 - 03.11.20 - 16:38
это все стрёмности новых платформ)
   Mikhail Volkov
 
24 - 03.11.20 - 17:34
(23) Значит на 8.3.10.2466 аутентификацию пользователя не получить?
   vde69
 
25 - 03.11.20 - 20:50
1. можно запретить обычную авторизацию и оставить только доменную, такой режим является предпочтительным. Если админы меняют домен - пусть меняют и в 1с, это можно сделать скриптом, или рег заданием
2. если все-же необходима обычная авторизация - то при старте идем в АД и проверяем виндовую учетку на предмет ее активность, если активна - то пофиг как он зашел, если не активна - что то делаем
   Mikhail Volkov
 
26 - 04.11.20 - 06:47
(25) > при старте идем в АД и проверяем виндовую учетку на предмет ее активность
Это наверно сложно, и главное долго..? Была подобная мысль проверять при старте на Com-соединение, но оно почти минуту устанавливается - отказался, Com-соединения редко бывает нужны.
   Mikhail Volkov
 
27 - 04.11.20 - 08:16
(23) Не, в новых платформах тоже не показывает с какой аутентификацией зашел пользователь. Смотрю ЖР базы на 8.3.16.1359. У меня как пользователя не стоит галочка Аутентификация ОС, поле ОС-аутентификации пустое. Захожу в базу с 1С-аутентификацией (обычно из конфигуратора). А в ЖР открываю событие своего входа в базу, и вижу: свое имя (код), и Текущий пользователь ОС Домен\Имя - правильные, но откуда он это взял? Т.е. не показатель как зашел пользователь.
   vde69
 
28 - 04.11.20 - 08:40
(26) это не сложно и не долго, библиотеку я давал ранее.
кода строчек 30 надо будет написать и выполняется он намного быстрее одной секунды
   Mikhail Volkov
 
29 - 04.11.20 - 11:44
(28) Если Не ПустаяСтрока(мвДоработкиНаСервере.ПользовательИБ(Пользователь).ПользовательОС) Тогда из нее (2) извлекаю Имя домена и имя пользователя в ОС. По функции ПользовательВГруппеДомена(ИмяДомена, ИмяГруппы, ИмяПользователя) для результата Истина определяю, что ОС-аутентификацией у пользователя все нормально, вероятно что по ней зашел? Только в ней ИмяПользователя - это имя пользователя в ОС? И что за ИмяГруппы? Когда заполняешь в конфигураторе поле Аутентификация ОС видны только домены и пользователи.
   vde69
 
30 - 04.11.20 - 11:57
все параметры этих функций это отборы, если не заполнено отбор не используется.

с группой так

если укажешь группу будет искать только в одной группе, если группу оставить пустую ищет во всем АД, в твоем случае группу оставляешь пустой...
 
 Рекламное место пустует
   Mikhail Volkov
 
31 - 04.11.20 - 12:45
(30) А ИмяПользователя - это имя пользователя в ОС?
   vde69
 
32 - 04.11.20 - 13:34
(31) это виндовый логин без имени домена
   Mikhail Volkov
 
33 - 04.11.20 - 14:27
(30) ИмяГруппы = Неопределено - не работает, или ""?
Так делал:
    Попытка  
        objNameSpace = ПолучитьCOMОбъект("WinNT://" + СокрЛП(ИмяДомена));// + "/" + СокрЛП(ИмяГруппы) + ", Group");   

        Для каждого item Из objNameSpace.Members() Цикл   
            Результат.Добавить(item.Name);  
        КонецЦикла; 
    Исключение  
        Результат.Очистить(); 
        Сообщить("Пользователи домена: " + ИмяДомена + " не найдены", СтатусСообщения.Внимание);
    КонецПопытки;  
Тоже не найдены!?
   Mikhail Volkov
 
34 - 04.11.20 - 15:20
Ох, да их 37 групп! Как мне без групп искать?
   vde69
 
35 - 04.11.20 - 15:27
   vde69
 
36 - 04.11.20 - 15:28
   Mikhail Volkov
 
37 - 04.11.20 - 18:04
Пока так:
// Возвращает Истина, если пользователь имеет аутентификацию ОС

//
Функция АутентификацияWindows(Пользователь = Неопределено, Ошибка = "") Экспорт
    ИмяДоменаПользователяОС = СокрЛП(мвДоработкиНаСервере.ПользовательИБ(Пользователь).ПользовательОС);
    Если ПустаяСтрока(ИмяДоменаПользователяОС) Или Найти(Сред(ИмяДоменаПользователяОС, 3), "\") = 0 Тогда
        Возврат Ложь;
    КонецЕсли;
    ИмяПользователяОС = СтрЗаменить(ИмяДоменаПользователяОС,"\","/");
    Попытка
        ПользовательОС = ПолучитьCOMОбъект("WinNT:" + ИмяПользователяОС + ",user");
//        Сообщить("Найден пользователь домена: " + Сред(ИмяДоменаПользователяОС, 3, Найти(Сред(ИмяДоменаПользователяОС, 3), "\")) + ПользовательОС.FullName, СтатусСообщения.Внимание);

        Возврат Истина;    
    Исключение
        Ошибка = " Пользователь домена: " + ИмяДоменаПользователяОС + " не найден.";
//        Сообщить(Ошибка, СтатусСообщения.Внимание);

    КонецПопытки;  
    Возврат Ложь;
КонецФункции// АутентификацияWindows()


Но не факт, что правильно: остались старые домены, в них не действующие учетки - их эта проверка воспринимает как правильные.
   Сияющий в темноте
 
38 - 04.11.20 - 19:53
Кстати,если Com-соединение на сервере,то оно из-под учетки сервера и вся ваша доменная аутентификация идет лесом.
   vde69
 
39 - 04.11.20 - 20:05
(38) не правда... у меня например такая схема сейчас работает

IIS с виндовс авторизацией > asp скрипт серверный > COM соединение с базой 1с под виндовой учеткой пользователя зашедшего на web страничку.

конечно надо переделать на сервисы, но оно работает уже 13 лет :)
   Mikhail Volkov
 
40 - 05.11.20 - 05:26
Кстати, Текущий пользователь ОС - как его определить, хотя бы для последних платформ? Для случая (27) моя проверка (37) сработает правильно. А вот достал старый архив Альфа-Авто, в нем у пользователей в Аутентификация ОС прописаны старый домен, но не отключен. И моя проверка дала Истина, хотя заходил в эту базу с 1С-аутентификацией. Поэтому желательно вставить в проверку условие равенства Возврат ИмяДоменаПользователяОС = ИмяТекущийПользовательОС;
Но как его получить?
   Mikhail Volkov
 
41 - 05.11.20 - 16:48
Вроде нашел в https://forum.infostart.ru/forum9/topic10769/, но громоздко получилось:
Функция ПервоначальнаяИнициализация(ЕстьПраваАдминистратора,ОбнаруженПервыйЗапуск,НеобходимоОбновлениеБазыДанных) Экспорт
    
    Пользователь = ПараметрыСеанса.Пользователь;
    ИмяПользователя = ИмяПользователя();
    ПолноеИмяПользователя = ПолноеИмяПользователя();
    
    // Переопределим текущий компьютер (в клиентской сессии пользователя он может

    // отличным от того что был определен в УстановкаПараметровСеанса)

    Состояние("Обновляем информацию о компьютере ...");
    Имя = мвДоработки.ПолучитьИмяКомпьютераТО();    //+МВ 10.10.2017

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

        //+МВ 05.11.2020 Проверим правильность имени домена\пользователя ОС, совпадает ли с ТекущийПользовательОС

        Если АутентификацияОС Тогда
            СоединенияИнформационнойБазы = ПолучитьСоединенияИнформационнойБазы();
            Фильтр = Новый Структура("Событие", "_$Session$_.Authentication");    
            ТЗ = Новый ТаблицаЗначений;
            ВыгрузитьЖурналРегистрации(ТЗ, Фильтр, "Сеанс, Данные, Дата", , 200);
            ТЗ.Сортировать("Дата Убыв"); 
            ТекущийПользовательОС = Неопределено;
            Для Каждого Соединение Из СоединенияИнформационнойБазы Цикл
                НайденнаяСтрока = ТЗ.Найти(Соединение.НомерСеанса, "Сеанс");
                Если НайденнаяСтрока <> Неопределено Тогда
                    ДанныеСобытия = НайденнаяСтрока.Данные;
                    Если ДанныеСобытия.Свойство("ТекущийПользовательОС") Тогда
                        Если Соединение.Пользователь.Имя = СокрЛП(Пользователь.Код) Тогда
                            ТекущийПользовательОС = ДанныеСобытия.ТекущийПользовательОС;
                        //    Сообщить(СокрЛП(Пользователь.Код) + " - " + ТекущийПользовательОС);

                            Прервать;
                        КонецЕсли;
                    КонецЕсли;
                КонецЕсли;
            КонецЦикла;
            Если ТекущийПользовательОС <> Неопределено И СокрЛП(ТекущийПользовательОС) <> Сред(ИмяДоменаПользователяОС, 3) Тогда
                ЗаписьЖурналаРегистрации("Для пользователя: " + СокрЛП(Пользователь.Код),
                                         УровеньЖурналаРегистрации.Предупреждение,
                                         ?(ТипЗнч(Пользователь) = Тип("СправочникСсылка.Пользователи"), Пользователь.Метаданные(), Неопределено),
                                         Пользователь,
                                         "неверно указана учетная запись ОС: " + ИмяДоменаПользователяОС + ", не соответствует пользователю ОС: " + СокрЛП(ТекущийПользовательОС));
            КонецЕсли;
        КонецЕсли;    //-МВ


Проще нельзя?
   Mikhail Volkov
 
42 - 06.11.20 - 11:27
Проще нет метода определить ТекущийПользовательОС?


Список тем форума
Рекламное место пустует  Рекламное место пустует
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.