Единственный способ который я знаю. Это если стоит аунтификация пользователя.
(18) Это вернет имя пользователя ОС, который ассоциирован с пользователем информационной базы. Если стоит еще галочка Аутентификация 1С:Предприятия, то можно войти под другим пользователем ОС, но под заданным пользователем 1С путем ввода его логина/пароля.
Т.е. пользователь ОС Иванов может войти под пользователем 1С Сидоров, зная его пароль
Это то, что прописано в базе у пользователя в поле Аутентификация ОС. Эти данные могут быть неправильными, устаревшими (например, имя домена или учетки сменилось).
В журнале регистрации где фиксируется вход пользователя на платформах 8.3.17 и выше пишется имя пользователя и Текущий пользователь ОС, даже при отключенной Аутентификация ОС пользователя. Вот его ТекущийПользовательОС как получить?
&НаСервереБезКонтекста
Функция ИмяТекущегоПользователяОСНаСервере()
ТекущийПользовательОС = Неопределено;
Фильтр = Новый Структура;
Фильтр.Вставить("Пользователь", ИмяПользователя());
Фильтр.Вставить("Событие", "_$Session$_.Authentication");
Фильтр.Вставить("Сеанс", НомерСеансаИнформационнойБазы());
ТЗ = Новый ТаблицаЗначений();
ВыгрузитьЖурналРегистрации(ТЗ, Фильтр, "Данные", , 1);
Если ТЗ.Количество() > 0 Тогда
Данные = ТЗ[0].Данные;
Если Данные <> Неопределено Тогда
Данные.Свойство("ТекущийПользовательОС", ТекущийПользовательОС);
КонецЕсли;
КонецЕсли;
Возврат ТекущийПользовательОС
КонецФункции
А подскажите, возможно ли сопоставить активных пользователей базы с именами пользователей Windows?
Есть функция ПользователиОС(), но она возвращает таблицу всех пользователей домена, а мне нужно именно сопоставить их с активными пользователями базы
(21) deniseek77, я не смог ничего нужного там найти. Если не используется аутентификация Windows, то Свойство ПользовательОС пусто, а у меня практически никто не использует данный вид аутентификации. у меня клиент-серверный режим работы, может как-то к серверу 1с можно обратиться за данной информацией?
платформа, кстати, 8.2 у меня, а то не сразу заметил, что там в названии темы 8.0/8.1
в принципе, если подобное реализовано в 8.3, то нет проблем перейти на неё
(22) TeMochkiN, а почему вы решили, что пользователь 1С в вашем варианте ДОЛЖЕН соответствовать пользователю Windows ?
Если в двух разных тетрадках записано "Иванов Иван Иваныч", то значит ли это, что речь идёт об одном и том же человеке?
(23) taiba, в смысле? мне нужно просто получить соответствие "Пользователь 1С - Пользователь Windows" в любом сеансе, т.к. в двух разных сеансах под одним и тем же пользователем 1С могут быть разные пользователи Windows. банальный пример двое каких-нибудь диспетчеров, работающих под одной учетной записью 1С "Диспетчер", но под разными учетными записями Windows - "Петров Петр Петрович" и "Иванов Иван Иванович"
(24) TeMochkiN, По существу - встроенніми средствами - никак. И это логично, т.к. не должно быть привязки к ОС и её пользователям напрямую. И зачем вам именно такое сопоставление без авторизации Win-пользователей? Может решение стоит искать на другом уровне?
(25) [quote]Может решение стоит искать на другом уровне?[/quote]
та придется видимо согласовать с сисадмином использование аутентификации Windows, но очень жаль, конечно, что встроенных средств таких нет.
(27) taiba, я хотел посылать системное сообщение с помощью внешней обработки через стандартную программу Windows msg.exe определенному пользователю ОС.
(29) taiba, нууу я читал, что для этого конфу придется править, т.к. это осуществимо только с помощью фоновых заданий, а мне проще системную утилиту юзнуть в данном случае, нежели извращаться фоновыми заданиями ради отправки сообщения)))
Процедура глОбработкиОжидания() Экспорт
Если СокрЛП(Константы.СообщениеПользователям.Получить())<>"" Тогда
НовоеСообщение = Новый СообщениеПользователю();
НовоеСообщение.Текст = СокрЛП(Константы.СообщениеПользователям.Получить());
НовоеСообщение.Сообщить();
КонецЕсли;
КонецПроцедуры
ну и внешнюю обаботку с двумя кнопками и текстовым полем в которое пихнете текст соощения для обновления константы
что то типо такого в код модуля формы обработки засуньте
(32) unoDosTres, это конечно очень хорошо, но я не понял, каким образом вашим способом вывести сообщение конкретному пользователю? Константа у всех общая, обработчик будет подключаться для всех пользователей, следовательно после установки сообщения, оно выведется для всех пользователей.
А ссылка во втором вашем сообщении отправляет на эту же страницу.
(24) TeMochkiN, Если не установлена Windows аутентификация, пользователя ОС можно вытащить из ЖурналаРегистрации, сопоставив затем эту выборку со списком активных пользователей через номер сеанса:
СоединенияИнформационнойБазы = ПолучитьСоединенияИнформационнойБазы();
Фильтр = Новый Структура("Событие", "_$Session$_.Authentication");
ТЗ = Новый ТаблицаЗначений;
ВыгрузитьЖурналРегистрации(ТЗ, Фильтр, "Сеанс, Данные, Дата", , 200);
ТЗ.Сортировать("Дата Убыв");
Для Каждого Соединение Из СоединенияИнформационнойБазы Цикл
НайденнаяСтрока = ТЗ.Найти(Соединение.НомерСеанса, "Сеанс");
Если НайденнаяСтрока <> Неопределено Тогда
ДанныеСобытия = НайденнаяСтрока.Данные;
Если ДанныеСобытия.Свойство("ТекущийПользовательОС") Тогда
User = ДанныеСобытия.ТекущийПользовательОС;
ИначеЕсли ДанныеСобытия.Свойство("ПользовательОС") Тогда
User = ДанныеСобытия.ПользовательОС;
КонецЕсли;
КонецЕсли;
Сообщить(Соединение.Пользователь.Имя + " - " + User);
КонецЦикла;
Показать
Процедура ВыгрузитьЖурналРегистрации(ТЗ, Фильтр, "Сеанс, Данные, Дата", , 200) выгружает колонки Сеанс, Данные и Дата для последних 200 событий, соответствующих фильтру. Если указать большее число или вообще его не указывать, это сильно скажется на времени выгрузки и работе всей системы.
со ссылкой действительно ошибся
http://infostart.ru/public/179185/ вот эта должна быть,
да действительно это отправка всем пользователям
а касательно отдельных пользователей, придется заморочится(чуток больше добавить), допустим в обработчик ожидания опять таки кинуть проверку на заполненность константы, и создать РС с измерением пользователь и булевым ресурсом , всем пользователям в регистре у которых соответственно стоит истина отправлять сообщение, как то так
ну а вообще если вам нужно было получить пользователяОС, то на инфостарте есть статья, использования WHS в 1с, почитатейте
http://infostart.ru/public/165702/
Очень нужно программно определить текущего пользователя ОПЕРАЦИОННОЙ СИСТЕМЫ (не путать с пользователем 1С).
Папки с пользователя схраняться как я понимаю тут: <C:\Documents and Settings>
Мне нужно считать инфу из одной из этих папок, для чего и нужно узнать пользователяОС.
(1) У вас постановка задачи не верная ) Если нужно найти профиль текущего юзера, то это вовсе не значит что нужно знать имя этого самого пользователя )
Про переменные среды слыхали? )
%USERPROFILE%
вроде когда пользователей заводишь в 1С-ке, можно указывать типа авторизацию через винду, может это поможет? чисто теория, если 1С в этом варианте проверяет пользователя по его авторизации в винде, вот вам и ответ на ваш вопрос
5) Постановка задачи четкая: узнать текущего пользователя ОС средствами 1С.
Пользователи 1С вообще тут не причем (!!!),
6) тем более аунтентификация windows в конфигураторе отключена.
Имя (или профиль -> однох_йственно) должно совпадать с именем одной из папок в <C:\Documents and Settings>
могу предложить включить аутентификацию пользователя. другой вариант, поискать ВК, может где реализовано, или покапать в области виндовского скрипта, либо писать свою ВК, а в ней уже получая доступ к WinAPI получить то что вам нужно
Вот жешь! ) Для тех кто в танке, предлагаю выполнить такой vbs-скрипт:
Set WshShell=CreateObject("WScript.Shell")
MsgBox WshShell.ExpandEnvironmentStrings("%UserProfile%")
Как это написать 1С, я думаю, объяснять не надо? Это банально...
А вообще, автор, ты чего там (в этом каталоге) найти хочешь?... Список баз? Настройки? Может не надо велосипедов уже?...
Тема такая. Я хочу через сом соеденение считать инфу из разных баз. Пользователи сами флажками будут отмечать базы для анализа. Вот зачем я все это спрашивал.
(59) Отличная идея! Правда если кто-то особо умный переименует пользователя в управлении компьютером или в консоли, то имя папки в %appdata% останется старое. Редкость, конечно, неимоверная, но сталкивался.
TeMochkiN, раз вы планируете использовать msg.exe, подумайте о том, что он по умолчанию запрещен и отключен. И чтобы его включить, надо править политики и проследить, чтобы везде применилось, включая ваши рабочие места. А на Win10 его может вообще не быть.
И еще проблема - пользователь может быть одинаковый на разных компьютерах. Как один и тот же, зашедший под своей учеткой на разных машинах, так и просто одинаковый локальный Admin везде.
Короче, есть нюансы.
Посмотрите лучше, как сделано рабочее место кассира. Как говорится, всё уже придумано до нас.
Там система идентифицирует и пользователя и имя компьютера, и привязывает настройки оборудования ко всему этому делу. Сделайте по аналогии и показывайте сообщение прямо из 1С, если имя компьютера и пользователь совпадают (и не трогайте этот проблемный msg.exe, сохраните себе нервы).
Простой способ получить пользователя ОС.
Если этот код вызвать с сервера, то будет получен пользователь, под которым крутится сервер, а если - с клиента, то пользователя, который вошел в базу, не важно стоит Аутентификация ОС или нет:
СетьОбъект = Новый COMОбъект("WScript.Network");
ИмяПользователяОС = СетьОбъект.UserName;
Вариант из #16 мне не подошёл потому, что он возвращает текущего пользователя ОС. Как минимум при отладке в базу заходишь под другим пользователем. Столкнулся с тем, что