Java 앱이 RDP 세션을 통해 실행되고 있는지 확인하시겠습니까?

StackOverflow https://stackoverflow.com/questions/2015193

  •  19-09-2019
  •  | 
  •  

문제

내 Swing 앱이 Windows RDP 세션에서 실행되고 있는지 어떻게 알 수 있나요?

Java 전용 솔루션이 선호되지만 앱은 Windows에서 실행되도록 보장되므로 쉘아웃해도 괜찮습니다.

도움이 되었습니까?

해결책

나는 이것을 끌어 내기 위해 기본 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 문서에서 나온 것입니다 wtsgetActiveConsolessessionID, 말한다 :

반환 값

실제 콘솔에 첨부 된 세션의 세션 식별자. 실제 콘솔에 첨부 된 세션이없는 경우 (예 : 실제 콘솔 세션이 첨부 또는 분리되는 과정에있는 경우)이 기능은 0xffffffff를 반환합니다.

다른 팁

위의 답변은 효과가 있을 수 있지만 불필요하게 복잡해 보입니다.RDP 세션을 감지하려면 Windows 'sessionname' 환경 변수를 읽으면 됩니다.이 환경 변수의 값은 일반 로컬 세션의 경우 'Console'입니다.RDP 세션의 경우 'RDP'라는 문구가 포함됩니다.그걸 확인하는 것만으로도 충분히 쉽습니다.

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

Windows7 64비트에서 테스트 및 작동이 확인되었습니다.이 기술에서 내가 발견한 한 가지 문제는 JVM이 시작된 후에 System.getenv()에서 읽은 환경 변수 값이 변경되지 않는 것으로 보인다는 것입니다.따라서 JVM 프로세스가 콘솔 세션에 의해 시작되었지만 RDP 세션에 의해 액세스된 경우 System.getenv("sessionname")에 대한 추가 호출은 여전히 ​​'콘솔'을 반환합니다.

NativeCall ( http://johannburkard.de/software/nativecall/ )

ClassPath에서 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());
  }
}
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top