Как узнать запущена ли программа терминальным сервером или "просто так" ?

IApple
Дата: 14.05.2014 11:55:06
Как узнать запущена ли программа терминальным сервером из терминальной сессии ?
bazile
Дата: 14.05.2014 12:34:21
IApple, попробуй через переменную окружения SESSIONNAME или GetSystemMetrics(SM_REMOTESESSION).

Зачем тебе это необходимо?
IApple
Дата: 14.05.2014 14:14:31
bazile, Для кустарной защиты программы. Сейчас лицензия на рабочее место для программы привязана к железу и винде. Но если ея юзать на терминальном сервере, то можно зайти под одной лицензией кучей народу из терминальных сессий...
ЕвгенийВ
Дата: 14.05.2014 14:28:34
IApple
bazile, Для кустарной защиты программы. Сейчас лицензия на рабочее место для программы привязана к железу и винде. Но если ея юзать на терминальном сервере, то можно зайти под одной лицензией кучей народу из терминальных сессий...

Системный мьютекс с именем, зависящим от лицензии.
Запуск одного экземпляра приложения на c#
bazile
Дата: 14.05.2014 14:29:19
IApple, так а цель какая? Не давать запустить больше одной копии на одном компьютере? Если да, то используй глобальный мьютекс:

bool createdNew;
var appMutex = new Mutex(true, "Global\\MyMutex", out createdNew);
if (createdNew)
{
    // Это первый экземпляр
    
    // Код приложения
    // ........

    // Освобождаем mutex перед завершением работы
    appMutex.ReleaseMutex();
}
else
{
    // Запущен другой экземпляр
    // Выводим сообщение и завершаем приложение
    // mutex освобождать не надо!
}


Префикс Global\ обеспечивает видимость именованного мьютекса во всех терминальных сессиях. Вместо MyMutex подставь свое более уникальное имя. Например, добавь GUID.
bazile
Дата: 14.05.2014 14:35:30
ЕвгенийВ
Системный мьютекс с именем, зависящим от лицензии.

Хороший пример. Только надо помнить что по умолчанию для имени mutex используется префикс Local\ и значит в разных терминальных сессиях можно будет запустить свою копию приложения.
IApple
Дата: 14.05.2014 15:03:45
Спасибо, тестирую GetSystemMetrics(SM_REMOTESESSION)
Нет, цели ограничить количество одновременно запущеных экземпляров приложения нет. Просто необходимо учесть в лицензии, позволять ли программе работать под терминалом или нет... Типа "нетерминальная" лицензия - рупь, "терминальная" - три...
E-doc
Дата: 15.05.2014 07:35:20
Есть еще такое свойство : System.Windows.Forms.SystemInformation.TerminalServerSession.
Если true - то программа запущена в терминальной сессии.
bazile
Дата: 15.05.2014 11:57:56
E-doc
Есть еще такое свойство : System.Windows.Forms.SystemInformation.TerminalServerSession.
Декомплятор показывает что он вызывает GetSystemMetrics(SM_REMOTESESSION) так что мы на правильном пути.

Спасибо E-doc за напоминание о существовании этого класса.
IApple
Дата: 15.05.2014 14:20:54
Работают оба способа, всем спасибо за советы.
Мне лично больше нравицца System.Windows.Forms.SystemInformation.TerminalServerSession,
поскольку тогда нет необходимости самому привязываться к user32.dll:
[System.Runtime.InteropServices.DllImport("user32.dll")]
public static extern int GetSystemMetrics(int nIndex);