c# 응용프로그램 원격 제어?

안녕하세요 직장 생활 2년차 초보 프로그래머입니다.
현재 C# WPF,Winform 을 이용하여 로컬에서 응용프로그램을 사용하는데요,

요청사항이 원격에서 여러 장비의 응용프로그램들을 제어하고 싶다고 하는데

현재 프로그램을 어떻게 구성해야 하는지 도저히 감이 안잡혀서요…

방법이 있을까요…?

질문을 좀 더 구체적으로 해주실 수 있나요? 모호한 점이 있습니다.

로컬 컴퓨터에서 WPF 또는 윈폼으로 개발한 응용프로그램이 동작 한다고 이해하면 될까요?

원격에서 로컬 컴퓨터에 연동된 장비를 제어하고 싶은데, 이를 개발된 응용프로그램을 통해서 가능하게 하고 싶다고 이해하면 될까요?

로컬의 응용프로그램이 수정할 수 없는 응용프로그램인지 개발되고 소스코드가 있어서 변경 가능한 응용프로그램인지에 따라 불가능하거나 가능하고 어떻게 가능한지가 결정될 것 같고요,

제어하고자 하는 장비에 따라 원격 제어의 방법 또한 달라질 수 있어서 관련된 상세한 정보를 공유해주셔야 합니다.

2 Likes

넵 로컬 컴퓨터에서 WPF 또는 윈폼으로 개발한 응용프로그램이 동작하고 소스코드가 있어서 변경 가능한 응용프로그램입니다.

메인 프로그램에서 각각의 PC에서 로컬로 동작하는 응용프로그램을 뷰를 통해 보거나 버튼을 클릭하여 제어할 수 있게 하고자 합니다.

저도 @dimohy 의견처럼 내용이 조금 불명확해 보입니다.

우선 View를 통해서 본다는 내용이 있는데
이 내용이 명확하지 않습니다.
chrome remote나 team viewer 처럼 원격을 원하시는 건지
프로그램 처리 데이터가 보이면 되는건지 확실치 않습니다.

remote 방식은 기존 솔루션 쓰는게 더 수월할거 같습니다.

다른 방법을 말씀 드리면

요청이 여러 장비의 응용프로그램들을 제어하고 싶다고 하셨는데
Client(N) - Server(1) - Admin(1 or N)
구조로 설계 하고

Client 에서 Server에 접속 하고
Admin에서 Server에 접속 하고

Admin에서 Server에 명령 전달 하면
Server에서 Client에 전송해서
Client에서 수신 해서 처리 하는 방식으로 하면 될거 같습니다.

Client View의 경우는 Client에서 처리 되는 데이터를
Server에 보내고
Admin에서 가져다 View 하는 방식으로 처리 하면 될거 같습니다.

1 Like

응용프로그램 <—> 원격 서버 <—> 원격 제어 App

제 생각을 글로 전달하기가 너무 어렵네요…

각 pc의 응용프로그램을 관리하는 모니터링 페이지를 만드려고 하는데요
각 응용프로그램의 데이터 등은 http api 를 통해 받고자 하는데,

모니터링 페이지에 응용프로그램의 제어를 현재 UI를 그대로 받아와서 제어 하고 싶습니다(Teamview 처럼)

그러면 현재 WPF,Winform으로 개발된 응용프로그램에 API와 화면을 받아오는 기능을 어떻게 추가해야 할지 궁금합니다. ASP.net을 이용하는건지 blazor를 이용해서
웹호스팅을하여 모니터링 페이지에서 Webviewer로 받아오면 되는지요…

로컬 PC에서는 최대한 응용프로그램 처럼 바탕화면에서 EXE파일로 실행되게 하고자합니다.

  1. 가장 간단한 방법은 그냥 TeamViewer 같은 원격제어 프로그램 쓰라고 하는것
  2. 클라이언트 프로그램 UI를 서버 UI와 동일하게 구성하고 서버 에서 접속한 클라이언트 PC로 데이타를 전송해 주면 클라이언트에서 해당 데이타를 받아서 처리해 주면 됩니다.
    반대의 경우 클라이언트에서 특정 명령을 날리면 서버에서 받아서 그 명령을 수행하면 됩니다.
    화면 UI 자체를 데이타로 넘겨서 처리하는 방법은 쉽지 않을 겁니다.

이런 기능 직접 만들 필요없이 상용 서비스 사용하시는 것이 가장 효율적입니다. 찾아보시면 팀뷰어말고 국내에도 여러 상용 원격 제어 프로그램들이 있는데 상대방에서 수락할 필요 없이 지정된 숫자의 컴퓨터를 중앙에서 관리 목적으로 원격제어하는 기능이 별도 상품으로 있습니다. 보통 이런 상품들은 제어할 컴퓨터 대수로 비용이 산정됩니다.

많은 분들께서 답을 달아주신 것처럼, 화면을 공유하는 원격 제어 기능은 만약 고객이 100% C#/CLR 기반으로 동작하는 .NET용 코드를 만들어달라는 명확한 요구 사항을 요청한게 아니라면, 쉽게 도입할 수 있는 수단이 OS 자체 기능부터 상용 솔루션까지 무척 폭넓은 제품들이 이미 시장에 많이, 그리고 널리 나와있습니다. 다만 각 제품들마다 특성이 있어서, 어떤 것을 어떻게 사용할 것인가는 충분히 제품들을 PoC/벤치마킹해본 후 연동 방법을 결정하셔야 하겠습니다.

일반적으로 다음의 제품들이 많이 쓰입니다.

  • Windows RDP: Windows OS에 기본 내장되어있고, 과거에는 터미널 서비스로 불렸습니다. RDP는 보통 현재 컴퓨터 앞에 앉아있는 사람과는 분리된 가상의 화면을 만들어주는 방식으로 원격 제어를 시작합니다.
    • 여기서 더 나아가서, 가상 데스크톱, VDI로 구현하는 것이 목표라고 한다면, Windows Virtual Desktop, Terminal Server Sesion Host 같은 Windows Server의 고급 기능도 검토해볼 수 있습니다.
  • VNC: 추가 라이선스를 요구하는 제품도 있지만, 대개는 GNU/GPL로 코드에 대한 라이선스만 요구하기 때문에 큰 부담없이 사용할 수 있습니다. 다만 다른 상용 제품들에 비해 화면 전송이 느리고 프레임 드랍이 심할 수 있습니다.
  • TeamViewer: 서비스 이용 주체가 개인이라면 무료이지만, 어떤 형태로든 회사에서 사용하는 것이 확인되면 반드시 라이선스 구입을 해야 합니다. IP 주소를 몰라도 TeamViewer 중계 서버를 이용해서 통신할 수 있으므로 연결 편의성이 좋은 편입니다.
  • RustDesk: TeamViewer의 오픈 소스판 대체제이며, TeamViewer와 같은 기능을 사용하기 원하는 곳에서 PoC를 많이 해보는 제품입니다.
  • Google Chrome Remote Desktop: Google 계정을 중심으로 원격지 컴퓨터에 Remote Desktop Host를 설치한 후 Google 계정으로 인증하고, 제어하는 쪽 컴퓨터에서도 같은 Google 계정으로 로그인하면 IP 주소를 몰라도 원격 제어가 가능합니다.

그리고 Windows는 2000, XP 이후로 컴퓨터를 사용하는 사람이 단 한명이라도 반드시 로그온을 거쳐야 합니다. 그래서 컴퓨터가 시작되면 같이 실행되어야할 서비스형 프로그램은 주로 NT 서비스로 만들어서 배포하지만, 사용자와 상호 작용이 필요한 원격 데스크톱류 프로그램들은 NT 서비스로 개발해서 배포하는 것이 어렵습니다.

그래서 Sysinternals의 AutoLogon 같은 유틸리티를 이용하여 자동 로그온시킬 사용자의 비밀 번호를 LSA (Local Security Authority) 스토리지에 보관한 후 로그온하는 대안을 적용하기도 하니 참고하시면 좋겠습니다. (단, 이 경우 컴퓨터 앞에 앉은 사용자가 LSA 스토리지 API를 사용하는 방법을 아는 엔지니어라면, LSA 스토리지를 접근할 수 있게 되므로 컴퓨터의 물리 보안, 그리고 원격 접속 보안을 신경써야 합니다.)

2 Likes