Определить, запущено ли приложение Java через сеанс RDP? - PullRequest
2 голосов
/ 06 января 2010

Как я могу определить, запущено ли мое приложение Swing из сеанса Windows RDP?

Предпочитается только решение на Java, но приложение гарантированно будет работать на Windows, так что я в порядке с обработкой.

Ответы [ 3 ]

4 голосов
/ 24 апреля 2011

Приведенные выше ответы могут работать, но кажутся излишне сложными. Вы можете просто прочитать переменную среды windows 'sessionname', чтобы обнаружить сеансы RDP. Значение этой переменной среды будет «Консоль» для обычного локального сеанса. Для сеанса RDP он будет содержать фразу «RDP». Достаточно просто проверить это.

public static boolean isRemoteDesktopSession() {
   System.getenv("sessionname").contains("RDP");
}

Проверено и подтверждено работа под Windows7 64bit. Одна проблема, с которой я столкнулся при использовании этого метода, заключается в том, что значения переменных среды, считанные из System.getenv (), не изменяются после запуска JVM. Поэтому, если процесс JVM был запущен сеансом консоли, но затем к нему обратился сеанс RDP, дальнейшие вызовы System.getenv ("sessionname") по-прежнему возвращают "Console."

4 голосов
/ 06 января 2010

Я думаю, вам придется вызывать собственные библиотеки Windows, чтобы осуществить это. Попробуйте что-то вроде этого:

import com.sun.jna.Library;
import com.sun.jna.Native;
import com.sun.jna.ptr.IntByReference;
import com.sun.jna.win32.*; 
import com.sun.jna.examples.win32.Kernel32;

...

public static boolean isLocalSession() {
  Kernel32 kernel32;
  IntByReference pSessionId;
  int consoleSessionId;
  Kernel32 lib = (Kernel32) Native.loadLibrary("kernel32", Kernel32.class);
  pSessionId = new IntByReference();

  if (lib.ProcessIdToSessionId(lib.GetCurrentProcessId(), pSessionId)) {
    consoleSessionId = lib.WTSGetActiveConsoleSessionId();
    return (consoleSessionId != 0xFFFFFFFF && consoleSessionId == pSessionId.getValue());
  } else return false;
}

Это странное условие для consoleSessionId взято из документации для WTSGetActiveConsoleSessionId , которая гласит:

Возвращаемое значение

Идентификатор сеанса, который подключен к физической консоли. Если к физической консоли не подключен сеанс (например, если сеанс физической консоли находится в процессе подключения или отсоединения), эта функция возвращает 0xFFFFFFFF.

1 голос
/ 06 января 2010

Попробуйте с NativeCall (http://johannburkard.de/software/nativecall/)

Все, что вам нужно, это 2 баночки плюс 1 DLL в вашем пути к классам.

Быстрый тест:

import java.io.IOException;
import com.eaio.nativecall.*;

public class WindowsUtils {

public static final int SM_REMOTESESSION = 4096;  // remote session

  public static boolean isRemote() throws SecurityException, UnsatisfiedLinkError, 
  UnsupportedOperationException, IOException 
  {
    NativeCall.init();
    IntCall ic = null;
    ic = new IntCall("user32", "GetSystemMetrics"); 
    int rc = ic.executeCall(new Integer(SM_REMOTESESSION));
    if (ic != null) ic.destroy();
    return (rc > 0);
  }

  public static void main(String ... args) throws Exception {
    System.out.println(WindowsUtils.isRemote());
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...