|
Определить аутентификацию пользователя | ☑ | ||
---|---|---|---|---|
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
|
Проще нет метода определить ТекущийПользовательОС?
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |