Как определить что сеанс запущен в терминальной сессии

1. sound 537 22.04.10 11:48 Сейчас в теме
Как средствами 1С (или вообще windows или как то еще) определить что сеанс запущен в терминальной сессии?
По теме из базы знаний
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. sound 537 22.04.10 12:28 Сейчас в теме
В общем-то проблема такая: на терминальном сервере нужно настроить сканер штрих кодов для разных пользователей. При входе через mstsc галочка "последовательные порты" стоит, то есть порты "перекидываются".
Теперь про 1С: Конфа стоит УТ. Там есть регистр "ТорговоеОборудование", в котором в ресурсах пишется "Компьютер", но не пишется Пользователь. То есть когда заходим под User1, открываем обработку "ТОНастройка", настраиваем в ней к какому Ком порту подключен сканер и все работает. Далее к серверу подключается другой пользователь, входит в 1С под User2, все также настраивает только на "свой" Ком порт и у него тоже все рабоает. Кароче работает все до перезупуска 1С (кто последний настраивал, того настройки и останутся в регистре), но комп то у них 1, а ком порты разные.
При записи в регистр пишется имя компа, которое возвращает функция "ПолучитьИмяКомпьютераТО" из обработки "ТОСервер", вот ее код:

Функция ПолучитьИмяКомпьютераТО() Экспорт
	Если мИмяКомпьютера = Неопределено Тогда
		мИмяКомпьютера = ВРег(ИмяКомпьютера());
	КонецЕсли;
	Возврат мИмяКомпьютера;
КонецФункции // ПолучитьИмяКомпьютераТО()


Пока у меня терминальный сервер 1. Извратился так:

Функция ПолучитьИмяКомпьютераТО() Экспорт
	Если мИмяКомпьютера = Неопределено Тогда
		мИмяКомпьютера = ВРег(ИмяКомпьютера());
		Если мИмяКомпьютера = ИмяМоегоЕдинственногоСервера Тогда
			мИмяКомпьютера = мИмяКомпьютера + "_" + ВРег(ИмяПользователя());
		КонецЕсли;
	КонецЕсли;
	Возврат мИмяКомпьютера;
КонецФункции // ПолучитьИмяКомпьютераТО()
Показать


В принципе все работает, но хотелось бы на все будущие терминальные сервера наложить это условие а написать что-то типа:
	Если ЭтоТерминальнаяСессия Тогда
		мИмяКомпьютера = мИмяКомпьютера + "_" + ВРег(ИмяПользователя());
	КонецЕсли;


Осталось написать функцию "ЭтоТерминальнаяСессия" :)

ЗЫ: Если кто-то знает менее извращенный способ, подскажите плиз.
ЗЗЫ: Да кстати, так получилось, что в качестве терминального сервера выступает WinXP, но это уже совсем другая история :)
3. Noy 1079 22.04.10 15:35 Сейчас в теме
ну как вариант смотри переменную среды SessionName
для консоли будет Console, для терминальной: RDP-ХХХХХ
4. sound 537 23.04.10 09:15 Сейчас в теме
(3) вот про это я даже не подумал. Спасибо за подсказку!
5. sound 537 23.04.10 10:00 Сейчас в теме
Если кому интересно...

// Получение переменных окружения 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
КонецФункции // ЭтоТерминальнаяСессия()

И в итоге получилось

Функция ПолучитьИмяКомпьютераТО() Экспорт

	Если мИмяКомпьютера = Неопределено Тогда
		мИмяКомпьютера = ВРег(ИмяКомпьютера());
		Если ЭтоТерминальнаяСессия() Тогда
			мИмяКомпьютера = мИмяКомпьютера + "_" + ВРег(ИмяПользователя());
		КонецЕсли;
	КонецЕсли;

	Возврат мИмяКомпьютера;

КонецФункции // ПолучитьИмяКомпьютераТО()

Показать
smellofsky; piffoff; Spartan; +3 Ответить
9. 1st 244 12.12.23 19:30 Сейчас в теме
(5) Интересный способ, спасибо. Немного упростил код:
Функция ЭтоТерминальнаяСессия() Экспорт
	Попытка
		WShell=Новый COMОбъект("WScript.Shell");
		ЗначениеПеременнойОкружения = WShell.ExpandEnvironmentStrings("%SESSIONNAME%");
   	Исключение
           	ЗначениеПеременнойОкружения = "";
   	КонецПопытки;
	Возврат (Лев(ЗначениеПеременнойОкружения,3)= "RDP");
КонецФункции 
Показать
6. vevd 08.12.16 17:17 Сейчас в теме
ПолучитьЗначениеПеременнойОкружения(Имя) Имя ?
7. vevd 08.12.16 17:24 Сейчас в теме
очень интересно. и нужно из запроса на сервере, из ошибки вынимать имя пользователя, затем по имени узнать "Сеанс терминальной сессии"
8. vevd 08.12.16 17:37 Сейчас в теме
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот