Обнаружение подключения к удаленному рабочему столу - PullRequest
48 голосов
/ 10 июня 2009

В любом случае в программе можно обнаружить, запускается ли программа изнутри сеанса удаленного рабочего стола или программа работает нормально .NET 2.0? То, что я пытаюсь сделать, - это создать приложение для синхронизации времени, которое будет следить за входом и выходом человека и отслеживать его. Но этот конкретный человек, я подозреваю, подключается к своему компьютеру на работе, из дома и включается и выключается.

Любые идеи, как я могу решить эту проблему (и удаление удаленного доступа к рабочему столу не вариант)? Моя идея состоит в том, что если есть способ обнаружения сеансов удаленного рабочего стола, я просто внедрю это в программу и не позволю им синхронизироваться удаленно.

Ответы [ 9 ]

48 голосов
/ 10 июня 2009

предположительно,

System.Windows.Forms.SystemInformation.TerminalServerSession

будет верно для сеанса удаленного рабочего стола (или сеанса VNC)

но я бы проверил это; -)

16 голосов
/ 13 апреля 2012

Если вы не хотите добавлять ссылку на System.Windows.Forms.dll только для этого (как предложено выше), то вы также можете вызывать базовый системный вызов напрямую через PInvoke, например:

    int result = GetSystemMetrics(SystemMetric.SM_REMOTESESSION);
    bool isRemoteSession = (result != 0);

Перечисление SystemMetric можно найти по адресу PInvoke.net - SystemMetric (но вы можете просто использовать значение 0x1000); в то время как подпись для GetSystemMetrics на PInvoke.net - GetSystemMetrics .

Я проверял это с RDP и VNC - работает с первым (также режим администратора / консоли), не обнаруживает второе.

8 голосов
/ 03 декабря 2013

Для приложений Магазина Windows вы можете использовать это:

Windows.System.RemoteDesktop.InteractiveSession.IsRemote
8 голосов
/ 10 июня 2009

http://www.appdeploy.com/messageboards/tm.asp?m=21420&mpage=1&key=&#21420

Системная переменная% sessionname% вернет Console, если она локальная, или RDP *, если она удаленная.

isRDP = [System.Environment]
    .GetEnvironmentVariable("SESSIONNAME").StartsWith("RDP-")
3 голосов
/ 14 декабря 2012

Ну, у меня была похожая проблема несколько дней назад. Для решения этой проблемы я воспользовался тем, что некоторые приложения удаленного рабочего стола используют известный порт по умолчанию , по крайней мере VNC и / или Подключение к удаленному рабочему столу Microsoft . Поэтому я создал метод, который сообщает, используется ли порт, следующим образом:

/* Libraries needed */
using System.Linq;
using System.Net.NetworkInformation;

/*....
  ....
  ....*/

private static bool IsPortBeingUsed(int port)
{
    return IPGlobalProperties.GetIPGlobalProperties().
                GetActiveTcpConnections().
                    Any(
                            tcpConnectionInformation => 
                            tcpConnectionInformation.LocalEndPoint.Port == port
                       );
}

Не забудьте поместить оператор using с библиотеками в начало файла, где находится метод.

Вам просто нужно передать, например, параметр, такой как 3389 порт , который является портом по умолчанию для Подключение к удаленному рабочему столу , или 5900 порт , который является порт по умолчанию для VNC-соединений .

Метод создан с использованием C # 4.0 функций, но его вполне можно сделать с более старой версией C # .Net или Visual Basic.

Это сработало для меня, поскольку мне нужно было проверить только два приложения, о которых я упоминал ранее.

Надеюсь, это поможет.

3 голосов
/ 19 июня 2012

Для всех программ удаленного входа требуется служба или программа, запущенная на локальном компьютере. Спрашивающему нужно беспокоиться только о VNC и его клонах, если этим службам или программам разрешено запускаться на его локальной машине. Они не нужны для использования удаленного рабочего стола, и для всех операционных систем существуют клиенты удаленного рабочего стола. Если удаленный рабочий стол работает, сервер VNC не требуется.

Кроме того, клоны VNC не смогут войти в систему, если вы не установите их в качестве администратора на сервере. Пока вы не разрешаете пользователям запускать процессы как другие пользователи, единственная проблема заключается в том, если один из ваших других сотрудников вошел в систему как проблемный. И если это так, никакое техническое решение не будет достаточным. Даже если у вас есть индивидуальные карточки для каждого сотрудника, которые необходимо использовать для входа в систему, проблемный сотрудник может просто подарить карту своему другу.

2 голосов
/ 10 июня 2009

Если вас беспокоит VNC, похоже, можно было бы проверить открытые соединения TCP с помощью netstat В командной строке введите:

netstat -n -a -p tcp

и проверьте, не установлен ли порт 5900 «УСТАНОВЛЕН». Конечно, 5900 является портом подключения по умолчанию, поэтому он будет зависеть от того, какой порт установлен.

Оттуда я нашел это сообщение на CodeGuru , в котором объясняется, как использовать netstat в вашей программе на c #:

string sCommand = "netstat";
string sArgs = "";
System.Diagnostics.ProcessStartInfo psi = new System.Diagnostics.ProcessStartInfo (sCommand, sArgs);

psi.UseShellExecute = false;
psi.RedirectStandartOutput = true;

System.Diagnostics.Process proc = null;
proc = System.Diagnostics.Process.Start(psi);
proc.WaitForExit();

// Read the first 4 lines. They don't contain any information we need to get
for (int i = 0; i < 4; i++)
    proc.StandardOutput.ReadLine();

while (true)
{
    string strLine = proc.StandardOutput.ReadLine();
    if (strLine == null)
        break;

    // Analyze the line 
    // Line is in following structure:
    // Protocol (TCP/UDP)   Local Address(host:port) Foreign Address(host:port) State(ESTABLISHED, ...)
}
1 голос
/ 01 октября 2018

Для приложений WPF есть System.Windows.SystemParameters.IsRemoteSession и System.Windows.SystemParameters.IsRemotelyControlled.

0 голосов
/ 15 октября 2018

Просто замечание о том, что использование GetSystemMetrics (SystemMetric.SM_REMOTESESSION) само по себе перестало быть надежным для Windows 8 / Server 2012 и выше, если в сеансе используется виртуализация графического процессора RemoteFX.

«Официальный» метод обнаружения RDS описан Microsoft здесь: Обнаружение среды служб удаленных рабочих столов (Последнее обновление: 31 мая 18).

Он состоит из использования вызова SystemMetrics и проверки реестра в

HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Terminal Server\GlassSessionId

Примеры кода в этой статье предназначены только для C ++, но, учитывая, что это всего лишь поиск в реестре, я не думаю, что люди найдут его слишком хитрым для репликации на других языках.

Я хотел бы надеяться, что, по крайней мере, некоторые из встроенных функций .Net, упомянутых выше, следуют этому полностью, но:

так что я не оптимистичен.

Я постараюсь сделать некоторые подробные проверки в ближайшее время и опубликовать результаты.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...