2008-10-01 5 views
22

프로그램이 원격 데스크톱 (터미널 서비스)에서 실행될 때 프로그램이 확인할 수있는 방법이 있습니까?프로그램이 원격 데스크톱에서 실행 중인지 확인하십시오.

원격 데스크톱 세션에서 실행 중일 때 프로그램에서 "비활성 시간 초과"를 사용하고 싶습니다. 사용자는 원격 데스크톱 세션을 열어 두는 것으로 유명하기 때문에 지정된 시간 동안 사용하지 않으면 프로그램이 종료되기를 바랍니다. 그러나 RD 사용자가 아닌 사용자가 비활성 시간 제한을 사용하지 못하도록하고 싶습니다.

답변

10

여기에 C#을 내가 사용하는 관리되는 코드입니다 :

/// <summary> 
/// Indicates if we're running in a remote desktop session. 
/// If we are, then you MUST disable animations and double buffering i.e. Pay your taxes! 
/// 
/// </summary> 
/// <returns></returns> 
public static Boolean IsRemoteSession 
{ 
    //This is just a friendly wrapper around the built-in way 
    get 
    { 
     return System.Windows.Forms.SystemInformation.TerminalServerSession; 
    } 
} 
5

다음 작품을 당신이 당신의 응용 프로그램에 대해 알고 싶은 경우에 어떤 세션에서 실행되는 :

BOOL IsRemoteSession(void) 
{ 
    return GetSystemMetrics(SM_REMOTESESSION); 
} 

그러나 일반적으로 모든 프로세스 ID에는 해당되지 않습니다.


임의의 세션에서 실행될 수있는 임의의 프로세스에 대해 알고 싶다면 아래 방법을 사용할 수 있습니다.

먼저 ProcessIdToSessionId을 호출하여 프로세스 ID를 세션 ID로 변환 할 수 있습니다. 세션 ID를 받으면 WTSQuerySessionInformation으로 전화를 걸 수 있습니다. 값이 WTSIsRemoteSessionWTSInfoClass을 지정할 수 있으며이 경우 응용 프로그램이 원격 데스크톱 연결인지 여부에 대한 정보를 제공합니다.

BOOL IsRemoteSession(DWORD sessionID) 
{ 
    //In case WTSIsRemoteSession is not defined for you it is value 29 
    return WTSQuerySessionInformation(WTS_CURRENT_SERVER_HANDLE, sessionID, WTSIsRemoteSession, NULL, NULL); 
} 
+0

프로세스가 다른 세션에있을 수있는 상황은 무엇입니까? 내가 서비스에 대해 물어 보거나 다른 로그인 된 사용자로 실행중인 경우이게 있습니까? –

+0

/console 스위치를 사용하지 않고 로컬 컴퓨터 또는 RDP를 통해 새 로그인을하면 새 세션이 만들어집니다. 새 세션이 만들어지면 생성 된 모든 프로세스가 기본적으로 해당 세션에서 시작됩니다. Win32 API CreateProcessAsUser를 통해 프로세스를 만들 때 세션을 대상으로 지정할 수도 있습니다. –

관련 문제