윈도우 2. Windows 11 24H2 에서 WlanQueryInterface 가 ERROR_ACCESS_DENIED 를 줄 때: 위치 권한과 Wi-Fi API - PCMEISTER 기술 노트
본문 글자 크기

윈도우 2. Windows 11 24H2 에서 WlanQueryInterface 가 ERROR_ACCESS_DENIED 를 줄 때: 위치 권한과 Wi-Fi API

앞 글에서 원격 수리용 WinPE 로 고객 PC 의 Wi-Fi 프로필을 넘기는 이야기를 했습니다. 네 번째 시험에서 PE 화면에 이렇게 나왔습니다.

Windows에서 넘겨받은 Wi-Fi 정보가 없습니다.

윈도우에 있을 때 프로필을 하나도 못 꺼냈다는 뜻입니다. 앞선 시험에서는 잘 넘어왔는데 달라진 게 하나 있었습니다. 이번 윈도우는 우리가 새로 깔아 준 Windows 11 25H2 였습니다.

“지금 연결된 프로필” 은 WlanQueryInterface 에 wlan_intf_opcode_current_connection 을 넣어 물어보고 있었는데, 이 호출이 ERROR_ACCESS_DENIED(5) 를 돌려주고 있었습니다. 관리자 권한으로 돌리는데도요.

찾아보니 Windows 11 24H2 부터 Wi-Fi 정보를 주는 API 일부가 위치 권한 아래로 들어갔습니다. 주변 Wi-Fi 목록이나 BSSID 로 위치를 알아낼 수 있으니, 위치 서비스가 꺼져 있으면 데스크톱 앱에도 안 준다는 겁니다. Microsoft Learn 의 “Changes to API behavior for Wi-Fi access and location” 문서에 정리돼 있고, WlanGetAvailableNetworkList, WlanGetNetworkBssList, WlanScan 도 같이 걸립니다.

그리고 우리가 까는 윈도우는 무인 설치 응답 파일에서 ProtectYourPC 를 3 으로 두어서, 위치를 포함한 개인정보 옵션이 꺼진 채로 시작합니다. 그러니 우리가 설치한 PC 에서는 항상 0개였던 겁니다. 앞선 시험의 노트북 윈도우는 위치가 켜져 있었던 것으로 보입니다. 고객 PC 도 24H2 이상에서 위치를 꺼 두었다면 똑같이 막힙니다.


고객에게 위치를 켜 달라고 할 수는 없으니 위치와 상관없는 API 로 돌아갔습니다. 저장된 프로필 목록과 내용은 WlanGetProfileList, WlanGetProfile 로 읽을 수 있고, 이 둘은 위치 권한과 상관없이 동작합니다. 문제는 그중 어느 것이 “지금 연결된” 것인지입니다. 그래서 세 단계로 고르게 했습니다.

  1. current_connection 조회가 되면 그 프로필 하나를 넘깁니다. 위치가 켜진 PC 는 예전처럼 됩니다.
  2. 거부되면 지금 연결된(Up) 무선 어댑터의 네트워크 이름을 봅니다. Get-NetConnectionProfile 이 주는 이름은 SSID 이거나, 같은 이름을 두 번째 만났을 때 붙는 “SSID 2” 같은 모양이라 둘 다 맞춰 봅니다. 프로필 이름이나 SSID 와 맞으면 그 하나를 넘깁니다.
  3. 그래도 모르면 그 어댑터에 저장된 프로필을 우선순위 순서대로 최대 10개까지 다 넘깁니다. PE 쪽은 차례로 연결을 시도하니 하나만 맞으면 됩니다.
Get-NetConnectionProfile | Where-Object InterfaceAlias -like '*Wi-Fi*' | Select-Object Name, InterfaceAlias

무선이 연결돼 있지 않은 PC 는 예전처럼 아무것도 넘기지 않습니다.

3단계에서는 비밀번호가 든 프로필이 여러 개 넘어가지만, 같은 PC 디스크 안에서 옮기는 것이고 지원이 끝나면 지웁니다. 고친 판은 같은 노트북으로 다시 시험할 차례입니다.

같은 이유로 netsh wlan show interfaces 나 netsh wlan show networks 도 24H2 에서는 위치가 꺼져 있으면 거부될 수 있습니다. 스크립트에서 이 명령으로 SSID 를 읽고 있었다면 한 번 확인해 보세요.

윈도우 시리즈의 글

완료 글 30개 인터넷