JJServiceManagerEnt/README.md

13 KiB

JJServiceManager (Ent)

Windows 서비스 기동/종료 관리 프로그램 (C# WPF, .NET 8)

  • v1.1부터 다른 PC의 등록된 서비스를 원격으로 모니터링·기동·종료할 수 있습니다.
  • v2.0부터 원격관리(화면 보기 / 키보드·마우스 제어) 와 Active / Passive 접속 방향 선택이 추가되었습니다.
  • (개발 중) 중계 서버 (JJServiceManagerRelay): 모든 PC가 서버로만 접속하면 서로 연결 (먼저 직접, 안 되면 중계), 계정·권한·감사 로그.

실행 파일

파일 크기 필요 조건
JJServiceManagerEnt.exe (런타임 필요판) 약 2MB .NET 8 Desktop Runtime (x64) 설치
JJServiceManagerEnt.exe (단독 실행판) 약 65MB 없음

항상 관리자 권한으로 실행됩니다 (실행할 때 UAC 창이 한 번 뜹니다).

화면

초기화면

  • 추가: 내 PC의 Windows 서비스 전체 목록에서 관리할 서비스 선택
  • 삭제: 체크한 내 PC 서비스를 목록에서 제외 (Windows 서비스 자체는 건드리지 않음, 원격 서비스는 삭제 불가)
  • Start / Stop: 체크한 서비스(원격 포함)를 차례로 시작/중지
  • Windows 강제종료 / Windows 재시작: 확인창에 표시된 무작위 숫자 6자리를 그대로 입력해야만 실행 (붙여넣기 불가, 설정에서 버튼 숨김 가능)
  • 설정, 종료(JJServiceManager 완전 종료, 서비스는 그대로 유지)
  • 서비스 목록
    • 전체 탭: PC별 묶음 ("내 PC", "192.168.0.10 / SERVER01", "192.168.0.20 / SERVER02 (Passive)" …), PC별 접기/펼치기
    • PC 탭 추가 콤보박스: 고른 PC만 보여주는 탭을 옆에 추가, ✕로 닫기 (다음 실행 때도 유지)
    • 원격 서비스 앞에는 IP/hostname 표시 (Passive 대상은 뒤에 (Passive))
    • 원격 PC 제목 줄의 [원격관리]: 그 PC 화면 보기 / 키보드·마우스 제어 (아래 "원격관리" 참고)
    • 서비스마다 Start / Stop / Status / Log, 상태 자동 갱신 (초록=실행 중, 빨강=중지됨)
  • 서비스 줄 우클릭(내 PC): 로그 파일 지정 / 로그 폴더 지정 / 경로 해제
  • 하단 로그: 작업 기록 (번호 + 체크박스)
    • 전체선택 / 전체취소 / 복사(체크한 줄)
    • 화면클리어: 새 로그를 화면 맨 위부터 출력, 위로 스크롤하면 이전 로그가 보임, 번호는 이어짐
    • 로그 클리어: 화면의 로그를 모두 지우고 번호를 1번부터 다시 시작
    • 로그 파일은 어떤 경우에도 지우지 않음
  • Esc: 설정에 따라 트레이로 / 완전 종료 (창의 X 버튼도 같음)

추가 선택 화면

  • 설명 / 상태 / 이름 / 시작유형 열, 열 제목을 누르면 정렬(▲▼)
  • 전체선택 / 전체취소 / 선택완료, 검색
  • 이미 등록된 서비스는 노란색 + 체크된 상태로 표시

로그창

  • 내 PC: 로그 파일 또는 폴더(가장 최근 수정 파일 자동 추적) 지정
  • 원격: 대상 PC에서 지정한 로그를 실시간으로 받아서 표시 (연결이 끊겼다 다시 붙으면 새 로그부터 이어서)
  • 인코딩 자동/UTF-8/CP949, 띄우기 방식: 개별 창 / 탭 / 좌우 분할 비교

원격 모니터링

모든 PC에 같은 프로그램을 설치하고, 설정에서 역할을 각각 켜고 끕니다. 한 PC가 두 역할을 동시에 할 수 있습니다.

역할 설정 탭 하는 일
대상 원격 접속 허용 관리 PC에 이 PC에 등록된 서비스만 보여주고 Start/Stop 실행, 원격관리 허용 여부 결정
관리 관리 대상 PC 등록한 PC의 서비스를 초기화면에 표시, Start/Stop, 로그 보기, 원격관리

접속 방향 (대상 PC마다 선택)

방향 누가 접속하나 쓰는 경우 연결 방법
Active 관리 PC → 대상 PC 관리 PC가 대상 PC에 직접 접속할 수 있을 때 대상 PC의 IP·포트
Passive 대상 PC → 관리 PC 대상 PC가 방화벽·공유기 뒤에 있어서 들어갈 수 없을 때 접속 코드 (예: 3HY7-6TEH)
  • Passive는 대상 PC가 관리 PC로 먼저 접속한 뒤, 연결 안에서는 Active와 똑같이 동작합니다 (서비스 목록, Start/Stop, 로그, 원격관리).
  • 관리 PC는 접속 코드로 어느 대상 PC인지 구분합니다. 코드가 맞지 않는 접속은 거부합니다.
  • 연결이 끊기면 양쪽 모두 자동으로 다시 연결합니다.

통신 방식

방식 Active 기본 포트 (대상 PC) Passive 기본 포트 (관리 PC) 설명
SSH (프로그램 내장) 2222 2224 OpenSSH 설치 없이 프로그램 안의 SSH 서버 사용
지정 포트 (TLS) 9988 9990 프로그램끼리 TLS로 암호화해 통신
  • 인증: 대상 PC에서 정한 접속 비밀번호 (대상 PC에는 해시로만 저장, 관리 PC에는 Windows 계정으로 암호화해 저장)
  • 서버 지문(인증서) 확인은 하지 않음 (암호화만)
  • 비밀번호를 5분 동안 10번 넘게 틀리면 잠시 접속 거부
  • Windows 방화벽 규칙을 자동으로 열고 닫음
    • 대상 PC Active 수신: JJServiceManager Remote
    • 관리 PC Passive 수신: JJServiceManager Passive

사용 순서 — Active

  1. 대상 PC: 설정 → 원격 접속 허용 → 켜기, 접속 비밀번호 입력, Active 수신 켜기, 방식·포트 선택 → 확인
  2. 관리 PC: 설정 → 관리 대상 PC → 다른 PC 관리 켜기 → 연결 방향 Active, 대상 IP, 같은 방식·포트, 비밀번호 입력 → [연결 테스트] → [추가] → 확인
  3. 초기화면에 대상 PC 묶음이 나타나고, hostname은 자동으로 채워짐

사용 순서 — Passive

  1. 관리 PC: 설정 → 관리 대상 PC
    • 다른 PC 관리 켜기, Passive 수신 방식 / 포트 확인 (기본: 지정 포트 9990, Passive 대상이 하나라도 있을 때만 열림)
    • 연결 방향 Passive 선택 → 접속 코드가 자동으로 만들어짐 ([새 코드]로 다시 만들기)
    • 대상 PC의 접속 비밀번호 입력 → [추가] → 확인
    • 초기화면에 Passive 접속코드 묶음이 "연결 중…"으로 나타남
  2. 대상 PC: 설정 → 원격 접속 허용
    • 켜기, 접속 비밀번호 입력 (관리 PC에 넣은 것과 같게)
    • Passive 접속 칸에 관리 PC 주소, 접속 코드, 방식·포트(관리 PC의 Passive 수신과 같게) 입력 → [추가] → 확인
    • 여러 관리 PC에 동시에 접속하도록 여러 줄 등록 가능
  3. 대상 PC가 접속하면 관리 PC의 묶음 제목이 IP / hostname (Passive)로 바뀜
  4. Active 수신이 필요 없으면 대상 PC에서 Active 수신을 꺼도 됨 (포트를 열지 않음)

숫자 6자리 확인

설정 → 일반에서 내 PC / 원격 Start/Stop 각각 켜고 끔 (기본: 내 PC 끔, 원격 켬). 여러 서비스를 한꺼번에 Start/Stop할 때는 한 번만 입력합니다.

중계 서버 (JJServiceManagerRelay)

NAS 등에 띄운 중계 서버(https://jjsm.joynala.com)를 거치면 대상 PC·관리 PC 모두 포트를 열 필요가 없습니다. 같은 내부망이거나 대상 PC의 Active 포트가 열려 있으면 직접 연결하고, 안 되면 서버가 중계합니다. 서버 설치: JJServiceManagerRelay/docs/NAS설치.md

대상 PC

  1. 설정 → 원격 접속 허용 → 켜기, 접속 비밀번호
  2. 중계 서버 접속: 서버 주소 확인 → [등록 코드로 등록] → 서버 관리자에게 받은 코드 입력 → 중계 서버 사용 켜기 → 확인
  3. 내 PC 제목 줄에 중계 서버 온라인 표시

관리 PC

  1. 설정 → 관리 대상 PC → 다른 PC 관리 켜기
  2. 중계 서버 로그인: 서버 주소, 아이디, 비밀번호 → [로그인] (첫 로그인이면 새 비밀번호를 정함) → 확인
  3. 권한이 있는 대상 PC가 초기화면에 이름 (중계) / 이름 (직접) 묶음(초록색)으로 자동으로 나타남
  4. 묶음 제목 줄의 [비밀번호] 에 그 대상 PC의 접속 비밀번호를 입력 (기기마다 한 번, 암호화 저장)

권한과 보안

  • 서버 권한 4가지: 보기 / 서비스 제어 / 화면 보기 / 화면 제어 (관리자는 모두)
  • 서버는 연결마다 권한 티켓에 서명하고, 대상 PC가 직접 서명을 확인해 그 권한을 넘는 요청은 거부
  • 실제 권한 = 서버 권한 ∩ 대상 PC 설정 (화면 보기 허용 등)
  • 중계 통로 안에서도 관리 PC ↔ 대상 PC가 TLS를 다시 맺으므로 서버는 내용·비밀번호를 볼 수 없음
  • 대상 PC가 실제로 실행한 Start/Stop·원격 화면은 서버 감사 로그에 남음 (지우는 기능 없음)

[서버 관리] 탭 (관리자 계정으로 로그인했을 때 설정에 나타남)

화면 기능
계정 추가 / 비밀번호 초기화 / 역할 / 사용·사용 안 함 / 메모
권한 사용자 선택 → 기기별 4가지 권한 체크 (바로 저장)
기기 온라인·IP·Active 수신·버전, 이름 바꾸기, 사용 안 함, 삭제
등록 코드 새 코드 발급 (1시간 / 24시간 / 7일 / 30일, 메모), 취소
감사 로그 기간·사용자·기기·작업으로 조회, 더 보기, 복사
연결 기록 직접/중계, 시간, 트래픽

원격관리 (화면 보기 / 키보드·마우스 제어)

대상 PC 설정 (원격 접속 허용 탭 → 원격관리)

항목 설명
화면 보기 허용 관리 PC에서 이 PC 화면을 볼 수 있음
화면 및 키보드·마우스 제어 허용 관리 PC에서 이 PC를 마우스·키보드로 조작할 수 있음 (화면 보기가 켜져 있어야 함)
연결 시 승인 필요 원격관리를 시작할 때마다 이 PC에 승인 창을 띄움 (30초 안에 누르지 않으면 자동 거부)
  • 허용을 끄면 이미 연결된 원격관리도 바로 끊기거나(보기) 조작이 막힙니다(제어).
  • 원격관리 중에는 대상 PC 화면 맨 위 가운데에 빨간 표시 막대("원격 제어 중: 관리 PC")가 항상 나타납니다. 막대의 [연결 끊기] 를 누르면 즉시 종료됩니다.

관리 PC에서 사용

  1. 초기화면에서 원격 PC 제목 줄의 [원격관리] 클릭
  2. 무작위 숫자 6자리 입력 (원격관리는 설정과 관계없이 항상 입력, 붙여넣기 불가)
  3. 대상 PC에서 승인하면 원격관리 창이 열림
    • 모니터 1 / 모니터 2 … / 전체: 볼 모니터 선택 (주 모니터에 (주) 표시)
    • 창을 열면 바로 제어가 시작됨 (제어 허용 시), 상태 줄에 ● 제어 중 또는 보기 전용과 초당 장수 표시
    • 창 안에서 클릭·드래그·휠·키보드 입력이 대상 PC로 전달됨 (창을 떠나면 눌린 키는 자동으로 뗌)
    • [연결 끊기] 또는 창 닫기로 종료
  • 화면은 JPEG로 압축해 최대 약 8장/초로 보내고, 바뀌지 않은 화면은 보내지 않습니다.
  • Ctrl+Alt+Del, Windows 키 조합, UAC 창(보안 데스크톱)은 원격으로 조작할 수 없습니다.

테스트용 중복 실행

같은 PC에서 여러 개를 띄워 원격 기능을 시험할 때:

JJServiceManagerEnt.exe --instance 2
  • 창 제목에 [테스트 인스턴스 2] 표시
  • 설정 폴더를 따로 씀: %AppData%\JJServiceManager_instance2
  • 기본 포트가 인스턴스 번호만큼 밀림 (인스턴스 N: Active 지정 포트 9988+N-1, SSH 2222+N-1 / Passive 수신 지정 포트 9990+N-1, SSH 2224+N-1)
    • 번호가 2 이상 차이 나는 인스턴스끼리는 포트가 겹칠 수 있으니 설정에서 포트를 바꿔 쓰세요.
  • 시작 프로그램 작업 이름, 방화벽 규칙 이름, 중복 실행 방지도 인스턴스별로 따로 씀
  • 코드에서 [테스트용 중복 실행] 주석이 붙은 부분이 이 기능입니다.

설정

탭 항목
일반 컴퓨터 시작시 기동, 단축키(기본 Ctrl+Shift+A), 서비스 시작시 로그보기, 로그창 띄우기, Esc, Windows 종료키, 숫자 확인(내 PC/원격)
원격 접속 허용 켜기/끄기, 접속 비밀번호, Active 수신(방식·포트), Passive 접속 목록(관리 PC 주소·접속 코드·방식·포트), 원격관리(화면 보기 / 제어 / 승인), 이 PC의 IP 안내
관리 대상 PC 다른 PC 관리 켜기/끄기, Passive 수신 방식·포트, 대상 목록(연결 방향, 대상 IP 또는 접속 코드, 방식·포트, 비밀번호), hostname 자동, 연결 테스트(Active)

저장 위치

  • 설정: %AppData%\JJServiceManager\settings.json
  • 작업 로그: %AppData%\JJServiceManager\logs\yyyy-MM-dd.log (추가만 하고 삭제하지 않음)

빌드

.NET 8 SDK 설치 후 build.bat 실행 → publish 폴더에 두 가지 exe 생성

  • 화면 정의는 Views/*.xaml이며 실행 시 읽어들입니다 (XAML 컴파일 없음).
  • 원격 통신: Core/Remote/ (SSH 라이브러리: Microsoft.DevTunnels.Ssh, MIT)
  • 원격관리 화면 캡처·입력: Core/Remote/ScreenCapture.cs, 화면: Windows/RemoteScreenWindows.cs
  • 관리자 권한 없이 시험할 때: dotnet publish ... -p:TestBuild=true (asInvoker 매니페스트, 서비스 Start/Stop·방화벽은 실패함)