bestsource

원격 데스크톱 연결 검색 중

bestsource 2023. 6. 3. 08:34
반응형

원격 데스크톱 연결 검색 중

프로그램에 원격 데스크톱 세션 내에서 프로그램이 실행되고 있는지 또는 .NET 2.0에서 프로그램이 정상적으로 실행되고 있는지 감지할 수 있는 방법이 있습니까?제가 하려고 하는 것은, 사람들이 들어오고 나가는 시간을 기록하고 추적할 수 있는 시계 애플리케이션을 만드는 것입니다.하지만 제 생각에 이 특정한 사람은 직장이나 집에서 컴퓨터에 원격으로 접속하여 기록을 하고 있습니다.

원격 데스크톱 액세스를 제거하는 것은 옵션이 아니며 이 문제를 해결할 수 있는 방법이 있습니까?원격 데스크톱 세션을 탐지할 수 있는 방법이 있다면 이를 프로그램에 구현하여 원격으로 로그인하지 못하도록 할 것입니다.

소문에 의하면,

System.Windows.Forms.SystemInformation.TerminalServerSession

원격 데스크톱 세션(또는 VNC 세션)에 대해 참이 됩니다.

하지만 확실하게 하기 위해 테스트할 것입니다 ;-)

시스템에 대한 참조를 추가하지 않으려는 경우.창문들.Forms.dll은 위에서 제안한 대로 기본 시스템 호출을 PINvoke를 통해 직접 호출할 수도 있습니다.

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

SystemMetric 열거는 PInvoke.net - SystemMetric(0x1000 값만 사용할 수 있음)에서 찾을 수 있으며 GetSystemMetrics 서명은 PInvoke.net - GetSystemMetrics에서 찾을 수 있습니다.

저는 이것을 RDP와 VNC로 테스트했습니다. 전자(관리/콘솔 모드)에서도 작동하고 후자는 감지하지 못합니다.

Windows Store 앱의 경우 다음을 사용할 수 있습니다.

Windows.System.RemoteDesktop.InteractiveSession.IsRemote

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

시스템 변수 %sessionname%는 로컬인 경우 콘솔을 반환하고 원격인 경우 RDP*를 반환합니다.

isRDP = [System.Environment]
    .GetEnvironmentVariable("SESSIONNAME").StartsWith("RDP-")

WPF 애플리케이션에는 다음과 같은 것이 있습니다. System.Windows.SystemParameters.IsRemoteSession 그리고. System.Windows.SystemParameters.IsRemotelyControlled.

저도 며칠 전에 비슷한 문제가 있었습니다.이 문제를 해결하기 위해 수행한 작업은 일부 원격 데스크톱 애플리케이션알려진 기본 포트(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
                       );
}

메서드가 있는 파일의 시작 부분에 라이브러리와 함께 사용 문을 넣는 것을 잊지 마십시오.

예를 들어 원격 데스크톱 연결의 기본 포트인 3389 포트나 VNC 연결의 기본 포트인 5900 포트와 같은 매개 변수를 전달하면 됩니다.

이 메소드는 C# 4.0 기능으로 생성되지만 C# 이전 버전에서 완벽하게 수행할 수 있습니다.Net 또는 Visual Basic.

제가 이전에 언급한 두 가지 애플리케이션만 확인하면 되기 때문에 이것은 저에게 효과가 있었습니다.

도움이 되길 바랍니다.

모든 원격 로그인 프로그램에는 로컬 컴퓨터에서 실행 중인 서비스 또는 프로그램이 필요합니다.질문자는 자신의 로컬 컴퓨터에서 VNC 및 해당 클론 서비스 또는 프로그램을 실행할 수 있는 경우에만 해당 서비스 및 해당 클론에 대해 걱정하면 됩니다.원격 데스크톱 사용에 필요하지 않으며 모든 운영 체제에 대한 원격 데스크톱 클라이언트가 있습니다.원격 데스크톱이 작동하는 경우 VNC 서버가 필요하지 않습니다.

또한 VNC 클론은 서버 시스템에 관리자로 설치하지 않으면 로그인할 수 없습니다.사용자가 다른 사용자처럼 프로세스를 실행하지 못하게 하는 한 유일한 문제는 다른 직원 중 한 명이 문제가 있는 직원으로 로그인하고 있는지 여부입니다.만약 그렇다면, 어떤 기술적인 해결책도 충분하지 않을 것입니다.로그인할 때 사용해야 하는 직원별로 개별 카드가 있더라도 문제가 있는 직원은 친구에게 카드를 줄 수 있습니다.

GetSystemMetrics(SystemMetric)를 사용하는 것에 대한 참고 사항입니다.세션에서 GPU의 RemoteFX 가상화를 사용하는 경우 SM_REMOTESESSION) 자체가 윈도우즈 8 / 서버 2012 이상에 대한 신뢰성을 중지했습니다.

Microsoft는 RDS를 "공식적"으로 탐지하는 방법을 "원격 데스크톱 서비스 환경 탐지"에 설명합니다(마지막으로 업데이트된 5월 31일).

시스템 메트릭 호출 및 레지스트리 검사 사용으로 구성됩니다.

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

그 기사의 코드 샘플은 C++뿐이지만, 단지 레지스트리 검색이라는 점을 고려하면, 사람들이 다른 언어로 복제하는 것이 너무 속임수라고 생각하지 않을 것이라고 생각합니다.

저는 적어도 그 중 일부를 희망하고 싶습니다.업스레드에 언급된 넷 내장 함수들은 이를 완전히 따르고 있지만 :

  • 시스템 매개 변수.IsRemoteSession은 여기서 "Maps to SM_REMOTESESSION"으로 표시됩니다.시스템 메트릭 가져오기"를 참조하십시오.

  • 시스템 매개 변수.IsRemoteControlled(원격으로 제어됨)는 여기에서 동일하게 표시됩니다.

그래서 저는 낙관적이지 않습니다.

잠시 후에 자세한 확인을 하고 결과를 게시하도록 하겠습니다.

만약 당신이 VNC가 걱정된다면, 오픈 TCP 연결을 확인하는 것이 가능할 것으로 보입니다.netstat명령 프롬프트에 다음을 입력합니다.

netstat -n -a -p tcp

포트 5900이 "ESTABLISHED"인지 확인합니다.물론 5900은 기본 연결 포트이므로 설정된 포트에 따라 달라집니다.

거기서 코드구루에서 사용법을 설명하는 이 게시물을 찾았습니다.netstatc# 프로그램에서:

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

언급URL : https://stackoverflow.com/questions/973802/detecting-remote-desktop-connection

반응형