13 KiB
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
- 대상 PC Active 수신:
사용 순서 — Active
- 대상 PC: 설정 → 원격 접속 허용 → 켜기, 접속 비밀번호 입력, Active 수신 켜기, 방식·포트 선택 → 확인
- 관리 PC: 설정 → 관리 대상 PC → 다른 PC 관리 켜기 → 연결 방향 Active, 대상 IP, 같은 방식·포트, 비밀번호 입력 → [연결 테스트] → [추가] → 확인
- 초기화면에 대상 PC 묶음이 나타나고, hostname은 자동으로 채워짐
사용 순서 — Passive
- 관리 PC: 설정 → 관리 대상 PC
- 다른 PC 관리 켜기, Passive 수신 방식 / 포트 확인 (기본: 지정 포트 9990, Passive 대상이 하나라도 있을 때만 열림)
- 연결 방향 Passive 선택 → 접속 코드가 자동으로 만들어짐 ([새 코드]로 다시 만들기)
- 대상 PC의 접속 비밀번호 입력 → [추가] → 확인
- 초기화면에
Passive 접속코드묶음이 "연결 중…"으로 나타남
- 대상 PC: 설정 → 원격 접속 허용
- 켜기, 접속 비밀번호 입력 (관리 PC에 넣은 것과 같게)
- Passive 접속 칸에 관리 PC 주소, 접속 코드, 방식·포트(관리 PC의 Passive 수신과 같게) 입력 → [추가] → 확인
- 여러 관리 PC에 동시에 접속하도록 여러 줄 등록 가능
- 대상 PC가 접속하면 관리 PC의 묶음 제목이
IP / hostname (Passive)로 바뀜 - 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
- 설정 → 원격 접속 허용 → 켜기, 접속 비밀번호
- 중계 서버 접속: 서버 주소 확인 → [등록 코드로 등록] → 서버 관리자에게 받은 코드 입력 → 중계 서버 사용 켜기 → 확인
- 내 PC 제목 줄에
중계 서버 온라인표시
관리 PC
- 설정 → 관리 대상 PC → 다른 PC 관리 켜기
- 중계 서버 로그인: 서버 주소, 아이디, 비밀번호 → [로그인] (첫 로그인이면 새 비밀번호를 정함) → 확인
- 권한이 있는 대상 PC가 초기화면에
이름 (중계)/이름 (직접)묶음(초록색)으로 자동으로 나타남 - 묶음 제목 줄의 [비밀번호] 에 그 대상 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에서 사용
- 초기화면에서 원격 PC 제목 줄의 [원격관리] 클릭
- 무작위 숫자 6자리 입력 (원격관리는 설정과 관계없이 항상 입력, 붙여넣기 불가)
- 대상 PC에서 승인하면 원격관리 창이 열림
- 모니터 1 / 모니터 2 … / 전체: 볼 모니터 선택 (주 모니터에
(주)표시) - 창을 열면 바로 제어가 시작됨 (제어 허용 시), 상태 줄에
● 제어 중또는보기 전용과 초당 장수 표시 - 창 안에서 클릭·드래그·휠·키보드 입력이 대상 PC로 전달됨 (창을 떠나면 눌린 키는 자동으로 뗌)
- [연결 끊기] 또는 창 닫기로 종료
- 모니터 1 / 모니터 2 … / 전체: 볼 모니터 선택 (주 모니터에
- 화면은 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·방화벽은 실패함)