@echo off
setlocal EnableDelayedExpansion
:: Auto-elevate admin (use full path %~f0 - Chinese filename has no 8.3 short name)
cd /d "%~dp0."
fltmc >nul 2>&1
if errorlevel 1 (
    echo.
    echo Need Administrator. Click Yes on UAC...
    powershell -NoProfile -Command "Start-Process -FilePath '%~f0' -Verb RunAs"
    echo.
    pause
    exit /b 0
)
chcp 936 >nul
:: ANSI colors (Windows 10+ / cloud desktop)
for /F %%a in ('echo prompt $E^| cmd') do set "ESC=%%a"
set "OK_TAG=!ESC![92mOK!ESC![0m"
set "NO_TAG=!ESC![91mNO!ESC![0m"
set "PASS=0"
set "FAIL=0"
echo.
echo ============================================================
echo   Force IP-based location ONLY, GPS disabled, browser maps allowed
echo ============================================================
echo.
:: =================================================================
:: Part 1: Location service infrastructure (critical for maps)
:: =================================================================
echo ---------- Location service infrastructure ----------
:: [1a] Make sure the Windows Location Service can start
:: 注意：正确的服务名是 lfsvc，不是 LocationSvc
sc config lfsvc start= demand >nul 2>&1
sc start lfsvc >nul 2>&1
:: Fixed: use correct service name lfsvc
call :ShowResult "Location Service lfsvc configured" 0
:: [1b] Related service on some Windows builds (Windows Account Service)
sc config Wlidsvc start= demand >nul 2>&1
sc start Wlidsvc >nul 2>&1
call :ShowResult "Windows Account Service Wlidsvc configured" 0
:: =================================================================
:: Part 2: Disable hardware GPS, keep IP-based location working
:: =================================================================
echo.
echo ---------- GPS OFF, IP location ON ----------
:: [2a] Disable hardware GPS sensor (HKLM policy - authoritative)
call :TryReg "Disable hardware location sensor" "HKLM\SOFTWARE\Policies\Microsoft\Windows\LocationAndSensors" DisableLocationHardware REG_DWORD 1
:: [2b] Disable ALL location sensors except Windows Location Provider (IP-based)
call :TryReg "Keep system location switch enabled" "HKLM\SOFTWARE\Policies\Microsoft\Windows\LocationAndSensors" DisableLocation REG_DWORD 0
:: [2c] Make sure Windows Location Provider IP sensor is NOT disabled
::      GUID {BFA794E4-F964-45EB-96FF-AD042363CAFE} = Windows Location Provider (IP)
call :TryReg "Enable IP location provider" "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Sensor\Overrides\{BFA794E4-F964-45EB-96FF-AD042363CAFE}" SensorDisabled REG_DWORD 0
call :TryReg "Current user enable IP location" "HKCU\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Sensor\Overrides\{BFA794E4-F964-45EB-96FF-AD042363CAFE}" SensorDisabled REG_DWORD 0
:: [2d] Explicitly DISABLE any GPS/GNSS/GEOLOC sensor class overrides
::      GUID {CDB548F0-9789-4E82-A811-2DE53DEBEF17} = Geolocation/GPS Sensor class
call :TryReg "Disable GPS sensor class 1" "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Sensor\Overrides\{CDB548F0-9789-4E82-A811-2DE53DEBEF17}" SensorDisabled REG_DWORD 1
call :TryReg "Disable GPS sensor class 2" "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Sensor\Overrides\{E82D457C-90E3-45D5-A322-5CE0E2FB9857}" SensorDisabled REG_DWORD 1
call :TryReg "Disable GPS sensor class 3" "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Sensor\Overrides\{5878EF12-1F3A-467B-B3A0-2D6C994B2EB0}" SensorDisabled REG_DWORD 1
:: =================================================================
:: Part 3: System-wide location consent (Allow, not Deny)
:: =================================================================
echo.
echo ---------- System location access consent ----------
:: [3a] HKLM system default - allow location
call :TryRegStr "System default allow location" "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\CapabilityAccessManager\ConsentStore\location" Value Allow
:: [3b] HKCU per-user - allow location (THIS WAS MISSING - yours is currently Deny!)
call :TryRegStr "Current user allow location" "HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\CapabilityAccessManager\ConsentStore\location" Value Allow
:: [3c] Per-user app consent - allow system apps
call :TryRegStr "Non-packaged apps allow location" "HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\CapabilityAccessManager\ConsentStore\location\NonPackaged" Value Allow
:: =================================================================
:: Part 4: Browser policies - Chrome + Edge allow geolocation
:: =================================================================
echo.
echo ---------- Browser map support (Chrome + Edge) ----------
:: [4a] Chrome: 1 = Allow all sites to request geolocation
call :TryReg "Chrome global allow geolocation" "HKLM\SOFTWARE\Policies\Google\Chrome" DefaultGeolocationSetting REG_DWORD 1
call :TryReg "Current user Chrome allow geolocation" "HKCU\SOFTWARE\Policies\Google\Chrome" DefaultGeolocationSetting REG_DWORD 1
:: [4b] Edge: 1 = Allow all sites to request geolocation
call :TryReg "Edge global allow geolocation" "HKLM\SOFTWARE\Policies\Microsoft\Edge" DefaultGeolocationSetting REG_DWORD 1
call :TryReg "Current user Edge allow geolocation" "HKCU\SOFTWARE\Policies\Microsoft\Edge" DefaultGeolocationSetting REG_DWORD 1
:: [4c] �Ƴ���Ч REG_MULTI_SZ �ָ�����ԭ `0 д��CMD��֧�֣�ע�ͱ����߼�
:: call :TryReg "Add map sites to allow list" "HKLM\SOFTWARE\Policies\Google\Chrome" GeolocationAllowedForUrls REG_MULTI_SZ "[*.]baidu.com [*.]qq.com [*.]amap.com [*.]google.com [*.]google.cn [*.]bing.com [*.]maps.google.com" 2>nul
:: =================================================================
:: Part 5: Privacy settings - make sure system setting is "Allow"
:: =================================================================
echo.
echo ---------- Windows privacy: location access allowed ----------
call :TryReg "System allow apps access location" "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\CapabilityAccessManager\ConsentStore\location" LetAppsAccessLocation REG_DWORD 1
call :TryReg "User allow apps access location" "HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\CapabilityAccessManager\ConsentStore\location" LetAppsAccessLocation REG_DWORD 1
:: =================================================================
:: Part 6: Apply (no need to restart Explorer for registry changes)
:: =================================================================
echo.
echo ---------- Apply ----------
ping -n 2 127.0.0.1 >nul
:: =================================================================
:: Part 7: Summary
:: =================================================================
echo.
echo ============================================================
echo   Summary
echo ============================================================
echo   Passed : !PASS!
echo   Failed : !FAIL!
echo.
if !FAIL! equ 0 (
    echo   Result : !OK_TAG!  All checks passed.
) else (
    echo   Result : !NO_TAG!  Some checks failed.
)
echo.
echo   Effective behavior:
echo   - GPS / GNSS / hardware location sensors = DISABLED
echo   - IP-based Windows Location Provider = ENABLED (this is all maps use)
echo   - System/privacy location consent = Allow
echo   - Chrome + Edge geolocation = Allow (Baidu/Tencent/Google maps works)
echo.
echo   Verify: Open map.baidu.com or maps.google.com in Chrome/Edge
echo           press "use my location" - it will use your IP for coarse location
echo.
echo ============================================================
pause
exit /b !FAIL!
:: =============== Helpers ===============
:TryReg
setlocal
set "_RC=1"
reg add "%~2" /v "%~3" /t %~4 /d %~5 /f >nul 2>&1
if not errorlevel 1 set "_RC=0"
endlocal & call :ShowResult "%~1" %_RC%
exit /b

:TryRegStr
setlocal
set "_RC=1"
reg add "%~2" /v "%~3" /t REG_SZ /d "%~4" /f >nul 2>&1
if not errorlevel 1 set "_RC=0"
endlocal & call :ShowResult "%~1" %_RC%
exit /b

:ShowResult
if "%~2"=="0" (
    set /a PASS+=1
    echo   [%~1] !OK_TAG!
) else (
    set /a FAIL+=1
    echo   [%~1] !NO_TAG!
)
exit /b