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

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

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

Прописать им лекарство. Сразу начнут и предпруждать, и согласовывать.
7 Mikhail Volkov
 
03.11.20
12:00
(5) > проверить корректность такого \\домена\пользователя
Как, средствами 1С? Боюсь, что это не просто... Может пользователь временно сел за включенный компьютер, или другие ситуации... Пока столкнулся со старыми именами доменов и учеток.
8 Mikhail Volkov
 
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) - признак того, что этому домену принадлежат локальные пользователи данного компьютера.
Описание:

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

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

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

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

с группой так

если укажешь группу будет искать только в одной группе, если группу оставить пустую ищет во всем АД, в твоем случае группу оставляешь пустой...
31 Mikhail Volkov
 
04.11.20
12:45
(30) А ИмяПользователя - это имя пользователя в ОС?
32 vde69
 
04.11.20
13:34
(31) это виндовый логин без имени домена
33 Mikhail Volkov
 
04.11.20
14:27
(30) ИмяГруппы = Неопределено - не работает, или ""?
Так делал:
    Попытка  
        objNameSpace = ПолучитьCOMОбъект("WinNT://" + СокрЛП(ИмяДомена)); // + "/" + СокрЛП(ИмяГруппы) + ", Group");  
        Для каждого item Из objNameSpace.Members() Цикл  
            Результат.Добавить(item.Name);  
        КонецЦикла;
    Исключение  
        Результат.Очистить();
        Сообщить("Пользователи домена: " + ИмяДомена + " не найдены", СтатусСообщения.Внимание);
    КонецПопытки;  
Тоже не найдены!?
34 Mikhail Volkov
 
04.11.20
15:20
Ох, да их 37 групп! Как мне без групп искать?
35 vde69
 
04.11.20
15:27
36 vde69
 
04.11.20
15:28
37 Mikhail Volkov
 
04.11.20
18:04
Пока так:
// Возвращает Истина, если пользователь имеет аутентификацию ОС
//
Функция АутентификацияWindows(Пользователь = Неопределено, Ошибка = "") Экспорт
    ИмяДоменаПользователяОС = СокрЛП(мвДоработкиНаСервере.ПользовательИБ(Пользователь).ПользовательОС);
    Если ПустаяСтрока(ИмяДоменаПользователяОС) Или Найти(Сред(ИмяДоменаПользователяОС, 3), "\") = 0 Тогда
        Возврат Ложь;
    КонецЕсли;
    ИмяПользователяОС = СтрЗаменить(ИмяДоменаПользователяОС,"\","/");
    Попытка
        ПользовательОС = ПолучитьCOMОбъект("WinNT:" + ИмяПользователяОС + ",user");
//        Сообщить("Найден пользователь домена: " + Сред(ИмяДоменаПользователяОС, 3, Найти(Сред(ИмяДоменаПользователяОС, 3), "\")) + ПользовательОС.FullName, СтатусСообщения.Внимание);
        Возврат Истина;    
    Исключение
        Ошибка = " Пользователь домена: " + ИмяДоменаПользователяОС + " не найден.";
//        Сообщить(Ошибка, СтатусСообщения.Внимание);
    КонецПопытки;  
    Возврат Ложь;
КонецФункции // АутентификацияWindows()

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

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

конечно надо переделать на сервисы, но оно работает уже 13 лет :)
40 Mikhail Volkov
 
05.11.20
05:26
Кстати, Текущий пользователь ОС - как его определить, хотя бы для последних платформ? Для случая (27) моя проверка (37) сработает правильно. А вот достал старый архив Альфа-Авто, в нем у пользователей в Аутентификация ОС прописаны старый домен, но не отключен. И моя проверка дала Истина, хотя заходил в эту базу с 1С-аутентификацией. Поэтому желательно вставить в проверку условие равенства Возврат ИмяДоменаПользователяОС = ИмяТекущийПользовательОС;
Но как его получить?
41 Mikhail Volkov
 
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) Тогда
                ЗаписьЖурналаРегистрации("Для пользователя: " + СокрЛП(Пользователь.Код),
                                         УровеньЖурналаРегистрации.Предупреждение,
                                         ?(ТипЗнч(Пользователь) = Тип("СправочникСсылка.Пользователи"), Пользователь.Метаданные(), Неопределено),
                                         Пользователь,
                                         "неверно указана учетная запись ОС: " + ИмяДоменаПользователяОС + ", не соответствует пользователю ОС: " + СокрЛП(ТекущийПользовательОС));
            КонецЕсли;
        КонецЕсли;    //-МВ

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