# 📶 모바일 핫스팟 제어 도구
Windows 11의 모바일 핫스팟을 **설정 앱을 열지 않고** 켜고, 끄고, 계속 살려두는 도구입니다.
Windows 내부 API(`NetworkOperatorTetheringManager`)를 직접 호출하므로 창을 띄워 클릭하는 방식이 아닙니다.
> 🎯 **`hotspot.exe` 하나만 내려받으면 됩니다.** Python도, 다른 설치도 필요 없습니다.
> 나머지 bat 파일 7개는 전부 편의를 위한 껍데기입니다.
---
# 📥 내려받기
아래 첨부 파일을 **한 폴더**에 받으세요.
| 파일 | 크기 | 역할 |
|---|---|---|
| 💻 **`hotspot.exe`** | 9.2MB | **본체. 이것만 있어도 다 됩니다** |
| 🧭 `핫스팟 관리자.bat` | 432byte | 메뉴 띄우기 |
| 🟢 `핫스팟 켜기.bat` | 152byte | 바로 켜기 |
| 🔴 `핫스팟 끄기.bat` | 154byte | 바로 끄기 |
| 🔍 `핫스팟 상태보기.bat` | 199byte | 상태만 보기 (관리자 권한 불필요) |
| 🔁 `핫스팟 자동유지.bat` | 170byte | 꺼지면 다시 켜기 |
| 📌 `시작할때 자동실행 등록.bat` | 162byte | 로그온 시 자동 실행 등록 |
| 🧹 `시작할때 자동실행 해제.bat` | 166byte | 자동 실행 해제 |
> 🔒 bat 파일들은 `hotspot.exe` 와 **같은 폴더**에 있어야 합니다.
> exe 만 다른 곳으로 옮기면 bat 은 동작하지 않습니다.
> **bat 없이 exe 하나만 받아도 모든 기능을 쓸 수 있습니다.**
---
# 🚀 기본 사용법 — `hotspot.exe`
## 1단계. 더블클릭
**`hotspot.exe` 를 더블클릭하세요.** 이게 전부입니다.
1. UAC 창이 뜹니다 → **예**
2. 검은 콘솔 창이 새로 열리면서 메뉴가 나옵니다
3. 번호를 누르고 Enter
프로그램이 스스로 관리자 권한을 요청하고, 작업이 끝나면 결과를 볼 수 있게 창을 붙잡아 둡니다.
별도로 "관리자 권한으로 실행"을 고를 필요가 없습니다.
> 💡 더블클릭으로 실행했는지, 터미널에서 실행했는지를 프로그램이 스스로 구분합니다.
> 더블클릭일 때만 권한 승격과 창 유지가 자동으로 켜집니다.
## 2단계. 메뉴에서 고르기
```
==============================================
모바일 핫스팟 관리자
==============================================
상태: 꺼짐 | SSID: DESKTOP-XXXXXXX 8253 | 연결된 기기: 0/8
[1] 켜기
[2] 끄기
[3] 상태 새로고침
[4] 자동 유지 시작 (꺼지면 다시 켜기)
[5] 이름/비밀번호 변경
[6] 로그온 시 자동 실행 등록
[7] 로그온 시 자동 실행 해제
[0] 종료
번호 선택:
```
| 번호 | 설명 |
|---|---|
| **1 / 2** | 즉시 켜거나 끕니다. 이미 그 상태면 아무 일도 하지 않습니다. |
| **3** | 상태를 다시 읽습니다. |
| **4** | 켠 뒤 30초마다 감시합니다. `Ctrl+C` 로 메뉴에 복귀. |
| **5** | SSID와 비밀번호를 바꿉니다. 비워두고 Enter 치면 기존 값 유지. |
| **6 / 7** | 로그온 자동 실행을 등록/해제합니다. |
| **0** | 종료. |
> 🔑 비밀번호는 Wi-Fi 규격상 **8~63자** 여야 합니다. 벗어나면 적용을 거부하고 이유를 알려줍니다.
---
# 🖱 bat 파일로 쓰기 (원클릭)
메뉴를 거치지 않고 바로 실행하고 싶을 때 씁니다. 하는 일은 `hotspot.exe` 를 대신 불러 주는 것뿐입니다.
| 파일 | 실행하는 명령 | 관리자 권한 |
|---|---|---|
| 🧭 `핫스팟 관리자.bat` | `hotspot.exe menu --elevate` | 필요 |
| 🟢 `핫스팟 켜기.bat` | `hotspot.exe on --elevate --pause` | 필요 |
| 🔴 `핫스팟 끄기.bat` | `hotspot.exe off --elevate --pause` | 필요 |
| 🔍 `핫스팟 상태보기.bat` | `hotspot.exe status --pause` | **불필요** |
| 🔁 `핫스팟 자동유지.bat` | `hotspot.exe watch --interval 30 --elevate` | 필요 |
| 📌 `시작할때 자동실행 등록.bat` | `hotspot.exe install --elevate --pause` | 필요 |
| 🧹 `시작할때 자동실행 해제.bat` | `hotspot.exe uninstall --elevate --pause` | 필요 |
---
# 🔢 명령줄로 쓰기
메뉴 없이 바로 실행하려면 명령을 인자로 넘깁니다.
```bat
hotspot.exe on
```
| 명령 | 하는 일 | 관리자 권한 |
|---|---|---|
| *(생략)* | `menu` 와 동일 — 더블클릭 시 기본값 | 필요 |
| `menu` | 대화형 메뉴 | 필요 |
| `status` | 상태 · SSID · 연결 기기 수 출력 | **불필요** |
| `on` | 켜기 | 필요 |
| `off` | 끄기 | 필요 |
| `toggle` | 켜져 있으면 끄고, 꺼져 있으면 켜기 | 필요 |
| `config --ssid 이름 --password 비밀번호` | 이름/비밀번호 변경 | 필요 |
| `watch --interval 30` | 켠 뒤 계속 감시하며 유지 | 필요 |
| `install` | 로그온 자동 실행 등록 | 필요 |
| `uninstall` | 로그온 자동 실행 해제 | 필요 |
**옵션**
| 옵션 | 기본값 | 하는 일 |
|---|---|---|
| `--elevate` / `--no-elevate` | 더블클릭일 때만 켜짐 | 관리자 권한이 아니면 UAC를 띄워 스스로 다시 실행 |
| `--pause` / `--no-pause` | 더블클릭일 때만 켜짐 | 끝난 뒤 Enter 를 기다림 (창이 즉시 닫히는 것 방지) |
| `--interval N` | `30` | 감시 주기(초) |
예시:
```bat
hotspot.exe config --ssid 내핫스팟 --password mypassword123
```
터미널이나 스크립트에서 부르면 UAC도 뜨지 않고 멈추지도 않으므로, 그대로 파이프로 넘기거나
종료 코드를 검사할 수 있습니다. 성공은 `0`, 실패는 `1` 입니다.
> 💡 `config` 는 핫스팟이 켜져 있으면 설정 변경이 거부되므로,
> **껐다 → 적용 → 다시 켜기** 순서로 알아서 처리한 뒤 원래 상태로 되돌립니다.
## 🪄 바탕화면 바로가기 만들기
자주 쓰는 동작은 바로가기로 만들어 두면 클릭 한 번으로 끝납니다.
1. `hotspot.exe` 우클릭 → **바로가기 만들기**
2. 만들어진 바로가기 우클릭 → **속성**
3. **대상** 칸 맨 뒤에 명령을 덧붙입니다:
```
"C:\...\hotspot.exe" on
```
4. **고급** → **관리자 권한으로 실행** 체크
5. 이름을 "핫스팟 켜기" 등으로 바꿔 바탕화면이나 시작 메뉴에 둡니다
---
# 🔁 자동 유지 모드가 필요한 이유
Windows는 **접속한 기기가 하나도 없으면 몇 분 뒤 핫스팟을 스스로 꺼버립니다.**
설정 앱의 "전원 절약" 옵션을 꺼도 상황에 따라 다시 꺼지는 경우가 있습니다.
자동 유지 모드는 30초마다 상태를 확인해서, 꺼져 있으면 즉시 다시 켭니다.
```
[16:20:01] 감시 모드 시작 (주기 30초). Ctrl+C 로 종료.
[16:25:31] 꺼진 것을 감지 — 다시 켭니다
[16:25:33] 핫스팟 켜기 성공
```
절전에서 깨어나거나 랜이 재연결되는 중에 일시적으로 실패하면, 오류를 기록하고
연결 프로필을 다시 잡은 뒤 계속 감시합니다. 중간에 죽지 않습니다.
---
# 📌 로그온할 때 자동으로 켜기
메뉴에서 **[6]** 을 고르거나, `시작할때 자동실행 등록.bat` 을 실행하거나, 명령줄에서:
```bat
hotspot.exe install
```
| 항목 | 값 |
|---|---|
| 작업 이름 | `모바일핫스팟자동켜기` |
| 트리거 | 로그온 시 |
| 권한 | 최고 권한으로 실행 |
| 동작 | `hotspot.exe watch --interval 30` |
등록 직후 바로 시작하려면:
```bat
schtasks /Run /TN "모바일핫스팟자동켜기"
```
해제는 메뉴 **[7]**, `시작할때 자동실행 해제.bat`, 또는 `hotspot.exe uninstall` 입니다.
> 🔒 등록된 작업은 `hotspot.exe` 의 **절대 경로**를 기억합니다.
> exe 를 옮겼다면 해제 후 다시 등록해 주세요.
---
# 🚨 문제 해결
| 증상 | 원인과 해결 |
|---|---|
| `공유할 인터넷 연결을 찾지 못했습니다` | Wi-Fi나 이더넷에 **먼저 연결**하세요. 공유할 원본 회선이 있어야 합니다. |
| `Wi-Fi 어댑터가 꺼져 있음` | 비행기 모드가 켜져 있거나 Wi-Fi 어댑터가 비활성 상태입니다. |
| `통신사/정책이 테더링을 차단함` | 모바일 요금제나 회사 정책이 테더링을 막고 있습니다. |
| `공유할 인터넷 연결이 제한됨` | 원본 회선이 인터넷에 실제로 나가지 못하는 상태입니다. |
| 터미널에서 `관리자 권한이 아닙니다` 경고 후 실패 | `--elevate` 를 붙이거나, 관리자 터미널에서 실행하세요. |
| 창이 뜨자마자 사라짐 | 터미널에서 부른 경우입니다. `--pause` 를 붙이세요. |
| bat 을 눌렀는데 아무 일도 안 일어남 | `hotspot.exe` 와 **같은 폴더**에 있는지 확인하세요. |
| 백신이 `hotspot.exe` 를 차단 | PyInstaller 로 만든 실행 파일의 흔한 오탐입니다. 예외로 등록하거나, 댓글로 알려주시면 파이썬 소스를 드립니다. |
| 한글이 깨져 보임 | 콘솔 글꼴을 굴림체 대신 **맑은 고딕**이나 **D2Coding** 으로 바꿔 보세요. |
---
# 🧩 동작 원리
```
더블클릭
└─ hotspot.exe
└─ 콘솔에 붙은 프로세스 수로 더블클릭 여부 판단
└─ 필요하면 ShellExecuteW 로 UAC 승격
└─ WinRT NetworkOperatorTetheringManager
└─ Windows 모바일 핫스팟
```
핵심 흐름은 이렇습니다.
1. `NetworkInformation.GetInternetConnectionProfile()` 로 **공유할 회선**을 찾습니다.
못 찾으면 테더링 가능한 프로필을 직접 훑는 대체 경로로 넘어갑니다.
2. 그 프로필로 `NetworkOperatorTetheringManager` 를 만듭니다.
3. `StartTetheringAsync()` / `StopTetheringAsync()` 를 호출하고,
반환된 상태 코드를 **한글 원인 설명으로 번역**해서 보여줍니다.
## 🧠 더블클릭을 어떻게 알아내나
`GetConsoleProcessList()` 로 지금 콘솔에 붙어 있는 프로세스 수를 셉니다.
| 실행 방법 | 붙은 프로세스 | 판단 |
|---|---|---|
| 탐색기에서 더블클릭 | `hotspot.exe` 하나 | 더블클릭 → 승격·창유지 자동 |
| cmd / bat / PowerShell | 셸 + `hotspot.exe` = 2개 이상 | 터미널 → 아무것도 자동으로 하지 않음 |
덕분에 같은 exe 하나로 더블클릭용과 스크립트용을 겸할 수 있습니다.
## 🧠 bat 파일이 영어로만 되어 있는 이유
배치 파일 안에서 `chcp` 로 코드페이지를 바꾸면 cmd 의 파서가 파일 위치를 잃고
**나머지 줄을 잘못 읽습니다.** 한글 메뉴가 깨지고 엉뚱한 명령으로 실행되는 문제가
실제로 발생했습니다. 그래서 bat 은 ASCII 만 담고, 한글 화면은 전부 `hotspot.exe` 가
출력합니다. Windows 콘솔에 붙어 있을 때 Python 은 `WriteConsoleW` 로 유니코드를
직접 쓰므로 인코딩을 건드릴 필요가 없습니다.
## 🧠 bat 이 전체 경로로 exe 를 부르는 이유
`NoDefaultCurrentDirectoryInExePath` 환경 변수가 설정된 시스템에서는
`cd` 로 폴더를 옮겨도 cmd 가 **현재 폴더의 exe 를 실행하지 않습니다.**
그래서 모든 bat 이 `%~dp0hotspot.exe` 처럼 절대 경로를 씁니다.
---
# 🔋 알려진 제약
- 🪟 **Windows 10 / 11 전용** 입니다. WinRT 테더링 API에 의존합니다.
- 📡 노트북의 **Wi-Fi 어댑터가 AP 모드를 지원**해야 합니다. 대부분 지원하지만 일부 구형 칩셋은 안 됩니다.
- 🔌 `status` 를 뺀 모든 동작은 **관리자 권한**이 필요합니다.
- 🧯 동시 접속 기기 수 상한(보통 8대)은 Windows가 정하며 이 도구로 바꿀 수 없습니다.
---
# 🧹 제거
1. `시작할때 자동실행 해제.bat` (또는 `hotspot.exe uninstall`) 로 예약 작업을 지웁니다.
2. 받은 파일을 삭제합니다.
레지스트리나 시스템 폴더에는 아무것도 쓰지 않습니다.
콘텐츠를 불러오는 중..
![TrPak [시간Time, 공간Space, 사람Human)] 중등 사회과 교수학습, 문화재 정보 교육포털](https://www.trpak.kr/data/logo/logo_1763375261.png)

댓글목록
trpak님의 댓글
안될 때는 '작업스케줄러의 목록'을 삭제하고 다음으로 할수도 있다.
_____________
■ 배치 파일 대신 순수 파워셸(.ps1) 파일 사용하기
.bat 파일 대신 .ps1 파일로 만들면 문법 오류 없이 깔끔하게 실행됩니다.
1단계: 파워셸 스크립트 파일(.ps1) 만들기
- 기존에 만들었던 hotspot_on.bat 파일은 삭제합니다.
- 바탕화면 빈 곳 우클릭 ▶ [새로 만들기] ▶ [텍스트 문서]를 만듭니다.
- 메모장을 열고 아래 코드를 그대로 복사해서 붙여넣습니다.
[Windows.Networking.Connectivity.NetworkInformation,Windows.Networking.Connectivity,ContentType=WindowsRuntime] | Out-Null
$profile = [Windows.Networking.Connectivity.NetworkInformation]::GetInternetConnectionProfile()
if ($profile -ne $null) {
$tethering = [Windows.Networking.NetworkOperators.NetworkOperatorTetheringManager]::CreateFromConnectionProfile($profile)
if ($tethering.TetheringOperationalState -ne 'Started') {
$tethering.StartTetheringAsync() | Out-Null
}
}
- 상단 [파일] ▶ [다른 이름으로 저장]을 누릅니다.
- 파일 이름을 hotspot_on.ps1 로 입력하고, 파일 형식을 모든 파일(*.*)로 바꾼 뒤 바탕화면에 저장합니다. (끝에 꼭 .ps1로 끝나야 합니다)
2단계: 파일이 정상 작동하는지 수동 테스트하기
- 새로 만든 hotspot_on.ps1 파일을 마우스 우클릭합니다.
- [PowerShell에서 실행]을 누릅니다.
- 잠시 후 모바일 핫스팟이 켜지는지 확인합니다. (이때 인터넷이 연결된 상태여야 합니다)
3단계: 작업 스케줄러에 다시 등록하기
수동으로 실행했을 때 핫스팟이 잘 켜진다면, 작업 스케줄러 연결 방식만 .ps1 파일에 맞게 수정해 주시면 됩니다.
- Win + R ▶ taskschd.msc 입력 후 작업 스케줄러 실행
- 기존에 만들어둔 작업이 있다면 우클릭 ▶ [삭제]합니다.
- 우측 [기본 작업 만들기] 클릭 ▶ 이름 입력 ▶ 트리거(로그온할 때) 선택.
- 동작 단계에서:
* 프로그램/스크립트: powershell.exe 입력
* 인수 추가(옵션): -ExecutionPolicy Bypass -File "저장한 파일 경로\hotspot_on.ps1" 입력
(예: -ExecutionPolicy Bypass -File "C:\Users\사용자이름\Desktop\hotspot_on.ps1")
- 마침을 누른 뒤, 해당 작업 우클릭 ▶ [속성] ▶ [가장 높은 권한으로 실행]에 체크하고 저장합니다.
_____________
이렇게 해도 안되면 PowerShell 실행 권한 해제를 한다.
파워셸 보안 정책을 한 번만 풀면 .ps1 파일 우클릭 실행이 정상 작동합니다.
윈도우 검색창에 cmd 검색 후 [관리자 권한으로 실행]을 클릭합니다.
아래 명령어를 그대로 복사해서 붙여넣고 Enter를 누릅니다.
DOS
powershell Set-ExecutionPolicy -ExecutionPolicy Unrestricted -Scope CurrentUser -Force
이제 작성해둔 hotspot_on.ps1 파일을 우클릭 후 [PowerShell에서 실행]을 다시 눌러봅니다.