Имя: Пароль:
1C
 
Как отличить терминального пользователя от физического,кодом?
,
0 bambucho
 
19.10.17
11:05
Как кодом отличить терминального пользователя от физического (локально запустившего конфу)?
Что нужно запросить у ОС,например через API или м.б. другими простыми способами.
1 Мимохожий Однако
 
19.10.17
11:07
Я>^
2 Доминошник
 
19.10.17
11:09
&НаКлиенте
Процедура КакПолучитьИмяКомпьютера()
     Сообщить(ИмяКомпьютера());
КонецПроцедуры
3 bambucho
 
19.10.17
11:10
(2) Имя у терминального пользователя такое же,как и у физического.Проверенно в серверной RemoteAPP и на патченных ОС.
4 Гипервизор
 
19.10.17
11:11
(0)(2) А если зайти локально на сервере?
5 bambucho
 
19.10.17
11:11
(3) то же самое,возвращает одинаковое имя компьютера
6 Филиал-msk
 
19.10.17
11:13
(0) Посмотреть в переменные среды
7 kauksi
 
19.10.17
11:13
Функция ПолучитьИмяКомпьютераТО() Экспорт
   //((заменим на имя физического компа
    //типовой код комментируем.
    //Если мИмяКомпьютера = Неопределено Тогда
    //    мИмяКомпьютера = ВРег(ИмяКомпьютера());
    //КонецЕсли;
     Если мИмяКомпьютера = Неопределено Тогда
        WSS = Новый COMОбъект("WScript.Shell");
        WSSE = WSS.Environment("Process");
        мИмяКомпьютера = ВРег(WSSE.Item("ClientName"));
        Если ПустаяСтрока(мИмяКомпьютера) Тогда
            мИмяКомпьютера = ВРег(ИмяКомпьютера());
        КонецЕсли;
    КонецЕсли;
//если зайти в терминальной сессии консольно, то получим "CONSOLE",
// в этом случае применяем типовую функцию
    Если мИмяКомпьютера = "CONSOLE" Тогда  
        мИмяКомпьютера = ВРег(ИмяКомпьютера());
    КонецЕсли;
    //))
    Возврат мИмяКомпьютера;
КонецФункции // ПолучитьИмяКомпьютераТО()
8 kauksi
 
19.10.17
11:15
Функция ПолучитьИмяКомпьютераТО()

    Если мИмяКомпьютера = Неопределено Тогда
        мИмяКомпьютера = ВРег(ИмяКомпьютера());
                         WshShell = Новый COMОбъект("WScript.Shell");
                        
                         ИмяКомпьютераКлиента = WshShell.expandEnvironmentStrings("%CLIENTNAME%");
                        
                         ИмяСессии = WshShell.expandEnvironmentStrings("%SESSIONNAME%");
                          
                         Если ИмяСессии="Console" Тогда
                             //Имя Компьютера будет равно имени терминального сервера
                         Иначе    
                              //Терминальный клиент
                              мИмяКомпьютера = мИмяКомпьютера + "_"+ ИмяКомпьютераКлиента;
                         КонецЕсли;
              
    КонецЕсли;

    Возврат мИмяКомпьютера;
КонецФункции
9 Fish
 
19.10.17
11:16
(5) Это как? А у меня разные показывает - если пользователь запустил 1С локально - то имя локального компьютера, если терминально - то имя терминального сервера. ЧЯДНТ?
10 bambucho
 
19.10.17
11:16
ок,попробую пока эти примеры переварить)
11 бомболюк
 
19.10.17
11:17
через GetSystemMetrics как то делается
12 bambucho
 
19.10.17
11:25
(9) Еще раз перепроверил,у Server 2008r2:RemoteApp,например в списке пользователей указывает имя сервера,как у физически запустившего конфу (УТ10),так и терминалки.
13 Fish
 
19.10.17
11:40
(12) А, ты про RemoteApp. А я про запуск клиента 1С на локальном компе. О разном говорили :)
14 bambucho
 
19.10.17
12:49
(13) Да,я про терминалки,толстые/тонкие клиенты запущенные на других машинах,идентифицируются (имена ПК) платформой нормально.
15 bambucho
 
19.10.17
12:50
секас в том,что бы обработку работы со сканером,заставить не реагировать на терминальных пользователей (что бы не отключать пистолет на время работы с базой,иначе ошибка "...Занять")
16 kauksi
 
19.10.17
13:02
ну так код выше... кто терминально зашел у них будет ИмяИхкомпа_ИмяПользователя, а кто локально на сервере сидит Console_ИмяПользователя. В форме списка ТорговоеОборудование сними галку ТолькоПросмотр, и делай как тебе надо
17 1c_progr
 
19.10.17
13:26
мИмяКомпьютера = ВРег(ИмяКомпьютера());

Попытка
    WshShell = Новый COMОбъект("WScript.Shell");
    ИмяКомпьютераКлиента = WshShell.expandEnvironmentStrings("%CLIENTNAME%");
Исключение
    ИмяКомпьютераКлиента = "";
КонецПопытки;
ИмяКомпьютераКлиента = ВРЕГ(СокрЛП(ИмяКомпьютераКлиента));
Если НЕ ИмяКомпьютераКлиента = "%CLIENTNAME%" И НЕ ИмяКомпьютераКлиента = "CONSOLE" И ЗначениеЗаполнено(ИмяКомпьютераКлиента) Тогда
    мИмяКомпьютера = мИмяКомпьютера + "_"+ ИмяКомпьютераКлиента;
КонецЕсли;
18 bambucho
 
19.10.17
13:27
(16) в Ут10 нет такой галки,только вкл/выкл
19 patapum
 
19.10.17
13:32
(15) Сделать в ярлыках параметры запуска, в сеансе читать, нет? Идея навскидку, сам не пробовал.
20 bambucho
 
19.10.17
13:35
(19) тоже вариант,но КМК встроенные механизмы платформы один х. потянут имя ПК,т.к. в алгоритмы ТО опираются на имя ПК...
попробую доработать ф.ПодключитьКлиента
...вчера нафантазировал около 8 решений
21 bambucho
 
19.10.17
13:36
(20) в стеке вызовов она после открытия РТиУ
22 bambucho
 
19.10.17
17:23
(17) БОМБА! корректно определяет (конкотенирует) имя терм клиента с именем машины,на которой запущен 1с.

Попробую вставить определение имени в механизм регистрации настроек и работы с ТО.
23 uno-group
 
19.10.17
17:47
А нефик на сервер локально народ пускать.
24 bambucho
 
19.10.17
18:12
ГОООООЛЛЛЛ!!!! (всякие свисты--фейрверки)!
На тестовой связке работает (вроде) работает как надо!
25 bambucho
 
19.10.17
18:13
(23) так сервер является касса...кризис на...
приходится жестко дешманить
Оптимист верит, что мы живем в лучшем из миров. Пессимист боится, что так оно и есть.