見出し画像

PowerShell パソコンのGPS情報を取得

スマホとは違ってWindowsパソコンにはGPSチップがついていないことが多いので位置情報を調べることは難しいです。

ネットで調べてもほとんど情報が出てきません。

出てきた情報を試しても
なんか、上手く行かない。

いろいろ試したところ位置情報を調べることができるようになったのでメモとして残します。

PowerShellのターミナルを管理者権限で立ち上げて次のコードを実行すれば、経度緯度が調べられます。

レジストリを変更するので必ず管理者権限で実行です。
管理者権限で実行するのが嫌な場合は、自分でWindowsの位置情報機能をONにしてレジストリを変更している部分を削除して実行してみてください。

#レジストリで位置情報機能をONに
$HKLMlocationValue = (Get-ItemProperty -Path "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\CapabilityAccessManager\ConsentStore\location").Value
$HKCUlocationValue = (Get-ItemProperty -Path "HKCU:\SOFTWARE\Microsoft\Windows\CurrentVersion\CapabilityAccessManager\ConsentStore\location").Value
Set-ItemProperty -Path "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\CapabilityAccessManager\ConsentStore\location" -Name Value -Value "Allow" -Force
Set-ItemProperty -Path "HKCU:\SOFTWARE\Microsoft\Windows\CurrentVersion\CapabilityAccessManager\ConsentStore\location" -Name Value -Value "Allow" -Force

$Location = ""
$function_GetGeoWatcher = {
 $res=""
 Add-Type -AssemblyName System.Device
 $GeoWatcher = New-Object System.Device.Location.GeoCoordinateWatcher
 
 # 計測開始
 $GeoWatcher.Start()
 
 # 計測待ち
 $loopcnt=0
 while("Ready" -ne $GeoWatcher.Status) {
  Start-Sleep 1
  $loopcnt+=1
  IF($loopcnt -ge 8){
   break
  }
 }
 
 # 結果確認
 $res = $GeoWatcher.Position.Location | Select-Object Latitude,Longitude
 $GeoWatcher.Dispose()

 IF([double]::IsNaN($res.Latitude) -And [double]::IsNaN($res.Longitude)){
   return -1,-1
 } else {
   return $res.Latitude,$res.Longitude
 }
}

$timeoutSeconds = 10
# バックグラウンドジョブで並列実行
$jobGPS = Start-Job -ScriptBlock $function_GetGeoWatcher
# バックグラウンドジョブのタイムアウト設定
Wait-Job -Job $jobGPS -Timeout $timeoutSeconds | Out-Null
# スリープして待つ(本来はスリープせずに別の処理を並行で行う)
Start-Sleep $timeoutSeconds
# バックグラウンドジョブの結果を取り出す
$Location = Receive-Job $jobGPS
# 終了しただけ残っているジョブを削除しておく
Get-Job | Remove-Job

# レジストリを戻す
Set-ItemProperty -Path "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\CapabilityAccessManager\ConsentStore\location" -Name Value -Value $HKLMlocationValue -Force
Set-ItemProperty -Path "HKCU:\SOFTWARE\Microsoft\Windows\CurrentVersion\CapabilityAccessManager\ConsentStore\location" -Name Value -Value $HKCUlocationValue -Force

$Location 


解説

 動作の仕組みは下のようになっています。

1.レジストリをいじってパソコンの位置情報機能をONにします。
2.次にSystem.Device.Location.GeoCoordinateWatcherで位置情報を計測します。
3.計測待ちのため数回ループします。
4.位置取得に成功したら経度緯度を返しますします。失敗したら-1,-1を返します。
5.レジストリを最初の状態に戻します。


位置情報機能がOFFになっていることがあるのでレジストリ操作でONにして位置を測定してます。そして最後にはレジストリを元の状態に戻します。
具体的な仕組みはわからないのですがGPSチップが無くても、ネットに繋がっていてWiFiをONにしていると高精度で位置情報が取得できます。WiFiが無いデスクトップパソコンでは、おおよその位置情報が取得できます。おそらくIPアドレスから推定しているのだと思います。
あと、この計測中は他の処理ができなくなるのでバックグラウンドジョブにしています。



#PowerShell #レジストリ #GPS #Windows #情シス #社内SE #自動化 #プログラミング学習

この記事が気に入ったらサポートをしてみませんか?