Как определить что сеанс запущен в терминальной сессии
По теме из базы знаний
Ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
В общем-то проблема такая: на терминальном сервере нужно настроить сканер штрих кодов для разных пользователей. При входе через mstsc галочка "последовательные порты" стоит, то есть порты "перекидываются".
Теперь про 1С: Конфа стоит УТ. Там есть регистр "ТорговоеОборудование", в котором в ресурсах пишется "Компьютер", но не пишется Пользователь. То есть когда заходим под User1, открываем обработку "ТОНастройка", настраиваем в ней к какому Ком порту подключен сканер и все работает. Далее к серверу подключается другой пользователь, входит в 1С под User2, все также настраивает только на "свой" Ком порт и у него тоже все рабоает. Кароче работает все до перезупуска 1С (кто последний настраивал, того настройки и останутся в регистре), но комп то у них 1, а ком порты разные.
При записи в регистр пишется имя компа, которое возвращает функция "ПолучитьИмяКомпьютераТО" из обработки "ТОСервер", вот ее код:
Пока у меня терминальный сервер 1. Извратился так:
В принципе все работает, но хотелось бы на все будущие терминальные сервера наложить это условие а написать что-то типа:
Осталось написать функцию "ЭтоТерминальнаяСессия" :)
ЗЫ: Если кто-то знает менее извращенный способ, подскажите плиз.
ЗЗЫ: Да кстати, так получилось, что в качестве терминального сервера выступает WinXP, но это уже совсем другая история :)
Теперь про 1С: Конфа стоит УТ. Там есть регистр "ТорговоеОборудование", в котором в ресурсах пишется "Компьютер", но не пишется Пользователь. То есть когда заходим под User1, открываем обработку "ТОНастройка", настраиваем в ней к какому Ком порту подключен сканер и все работает. Далее к серверу подключается другой пользователь, входит в 1С под User2, все также настраивает только на "свой" Ком порт и у него тоже все рабоает. Кароче работает все до перезупуска 1С (кто последний настраивал, того настройки и останутся в регистре), но комп то у них 1, а ком порты разные.
При записи в регистр пишется имя компа, которое возвращает функция "ПолучитьИмяКомпьютераТО" из обработки "ТОСервер", вот ее код:
Функция ПолучитьИмяКомпьютераТО() Экспорт
Если мИмяКомпьютера = Неопределено Тогда
мИмяКомпьютера = ВРег(ИмяКомпьютера());
КонецЕсли;
Возврат мИмяКомпьютера;
КонецФункции // ПолучитьИмяКомпьютераТО()
Пока у меня терминальный сервер 1. Извратился так:
Функция ПолучитьИмяКомпьютераТО() Экспорт
Если мИмяКомпьютера = Неопределено Тогда
мИмяКомпьютера = ВРег(ИмяКомпьютера());
Если мИмяКомпьютера = ИмяМоегоЕдинственногоСервера Тогда
мИмяКомпьютера = мИмяКомпьютера + "_" + ВРег(ИмяПользователя());
КонецЕсли;
КонецЕсли;
Возврат мИмяКомпьютера;
КонецФункции // ПолучитьИмяКомпьютераТО()
ПоказатьВ принципе все работает, но хотелось бы на все будущие терминальные сервера наложить это условие а написать что-то типа:
Если ЭтоТерминальнаяСессия Тогда
мИмяКомпьютера = мИмяКомпьютера + "_" + ВРег(ИмяПользователя());
КонецЕсли;
Осталось написать функцию "ЭтоТерминальнаяСессия" :)
ЗЫ: Если кто-то знает менее извращенный способ, подскажите плиз.
ЗЗЫ: Да кстати, так получилось, что в качестве терминального сервера выступает WinXP, но это уже совсем другая история :)
Если кому интересно...
// Получение переменных окружения Windows
Функция ПолучитьЗначениеПеременнойОкружения(Имя) Экспорт
Попытка
Ctrl = Новый COMОбъект("MSScriptControl.ScriptControl");
Ctrl.Language = "vbscript";
Ctrl.AddCode("
|Function SpecialFolders(Name)
|Set Shell = CreateObject(""Wscript.Shell"")
|SpecialFolders = Shell.ExpandEnvironmentStrings(Name)
|End Function");
ИмяПапки = Ctrl.Run("SpecialFolders", "%" + СокрЛП(Имя) + "%");
Исключение
ИмяПапки = Неопределено;
КонецПопытки;
Возврат ИмяПапки;
КонецФункции // ПолучитьЗначениеПеременнойОкружения()
// Определить, что это терминальная сессия
Функция ЭтоТерминальнаяСессия() Экспорт
ИмяСессии = ВРег(ПолучитьЗначениеПеременнойОкружения("SESSIONNAME"));
Возврат Найти(ИмяСессии, "RDP") > 0
КонецФункции // ЭтоТерминальнаяСессия()
И в итоге получилось
Функция ПолучитьИмяКомпьютераТО() Экспорт
Если мИмяКомпьютера = Неопределено Тогда
мИмяКомпьютера = ВРег(ИмяКомпьютера());
Если ЭтоТерминальнаяСессия() Тогда
мИмяКомпьютера = мИмяКомпьютера + "_" + ВРег(ИмяПользователя());
КонецЕсли;
КонецЕсли;
Возврат мИмяКомпьютера;
КонецФункции // ПолучитьИмяКомпьютераТО()
Показать
(5) Интересный способ, спасибо. Немного упростил код:
Функция ЭтоТерминальнаяСессия() Экспорт
Попытка
WShell=Новый COMОбъект("WScript.Shell");
ЗначениеПеременнойОкружения = WShell.ExpandEnvironmentStrings("%SESSIONNAME%");
Исключение
ЗначениеПеременнойОкружения = "";
КонецПопытки;
Возврат (Лев(ЗначениеПеременнойОкружения,3)= "RDP");
КонецФункции
Показать
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот