Обнаружение подключения к удаленному рабочему столу

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

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

Ответ 1

якобы,

System.Windows.Forms.SystemInformation.TerminalServerSession

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

но я бы проверял это, чтобы убедиться: -)

Ответ 2

Если вы не хотите добавлять ссылку на 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 - работает с первым (режим admin/console), не обнаруживает последнего.

Ответ 4

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

Windows.System.RemoteDesktop.InteractiveSession.IsRemote

Ответ 5

Хорошо, у меня была аналогичная проблема несколько дней назад. Что я сделал для ее устранения, воспользовался тем, что в каком-то приложении удаленного рабочего стола используется известный порт по умолчанию, не менее 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.

Метод создается с помощью С# 4.0, но он может быть отлично выполнен с более старой версией С#.Net или Visual Basic.

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

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

Ответ 6

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

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

Ответ 7

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

netstat -n -a -p tcp

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

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

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, ...)
}