今回はWindows10のモバイルホットスポットのお話です。
皆さんはモバイルホットスポットってご存知でしょうか。PCでスマホのテザリング機能を実現できるアレです。
超便利なんですがPCを再起動するとオフ状態で立ち上がってしまうので、手動でオンにしないといけないんですよね~。
ネットで色々と検索してみたんだけど、常にオン状態にする設定はどうも存在しないようです。
そこで考えたのが「SendKeys」
そう、知っている人からすると
「ちゃんと動くのかよ~」
と突っ込まれそうですが、藁をも掴む思いでテストしてみて、なんとかうまく動いたのでご紹介させて頂きます。
まず、Windows10のモバイルホットスポットをオンにするには
この画面を開いて「オフ」表示されたトグルスイッチをクリックして「オン」にする必要があります。
つまり設定画面を開くためのコマンドと「オン」する為に使用するキーストロークが分かれば、これらをバッチ処理にて行ってやれば良い訳ですよね。
で、バッチ処理ですが正直あまり使用したことが無かったのですが、折角ですのでPowerShellを使用してみました。
さて、まずモバイルホットスポットの設定画面を開くには
ms-settings:network-mobilehotspot
で開きます。
そして、この開いた設定画面の「インターネット接続を他のデバイスと共有します」の下にあるトグルスイッチをオンにするには、スペースキーを押せばクリックしたのと同じ動作になるのですが、カーソルがこのオブジェクト(トグルスイッチ)の位置にいないといけません。
このモバイルホットスポット画面は、開いた時カーソル位置が[設定の検索]にあるようですので、[TAB]キーを二回押してあげれば目的の位置までカーソルが移動されます。
つまり画面が開かれてから[TAB][TAB][SPACE]とSendKeysで送れば「オン」にすることができるんです。
それではやってみましょう
Add-Type -AssemblyName System.Windows.Forms Start ms-settings:network-mobilehotspot Start-Sleep -s 5 [System.Windows.Forms.SendKeys]::SendWait("{TAB}{TAB}") Start-Sleep -m 50 [System.Windows.Forms.SendKeys]::SendWait(" ") Start-Sleep -m 50 [System.Windows.Forms.SendKeys]::SendWait("%{F4}")
PowerShellを開いて上記コードをコピペしてみて下さい。
「はい、オンになったでしょ」
えっ! オンにならない。ならない方はコメント下さい。(汗
[Windowsの設定]-[ネットワークとインターネット]-[モバイルホットスポット]
と進んで手動でオンオフができない方はご自身で調べて下さいネ。環境の問題です。
解説しますと、1行目はSendKeysメソッドを使用する為のおまじない。2行目がモバイルホットスポットの設定画面を開くコマンドで、3行目が設定画面が完全に開き切るのを待つウエイト、そして4行目以降が設定画面に送るキーストロークですが連続して送るとうまく動かないので50msのウエイトをかましてます。8行目はウインドを閉じるAlt+F4なので閉じたくなかったらカットして下さい。
で、コレだけだとこのバッチ処理をもう一度動かすとオフになっちゃいますよね~
やっぱり、動かす前に現在オンなのかオフなのか判断させたいですよね~
本当は闇雲にSendKeysするのではなく、ちゃんとウインドハンドルを調べて目的のオブジェクト目掛けて送るべきでそれなら状態も読めるのですが、この設定画面はUWPってやつでできているらしくハンドルの取得方法が判りません。orz
そこで考えたのがPINGです。
そう、モバイルホットスポットがオンになっていると言う事は接続デバイスに対してローカルとは別の体系でのネットワークアドレスが割り当てられているはずです。
例えば、今あなたがモバイルホットスポットの設定をオンしようとしているPCのIPアドレスが192.168.0.1だった場合、そのPCに接続させたいスマホ等には192.168.137.2などを割り当てルーティングできるようにしています。
つまり、この別セグメントのネットワークと接続できるようにする為に、192.168.0.1とは別に192.168.137.1などが自PCに割り当てられます。
このモバイルホットスポットがオンの時だけに応答するIPアドレスにPINGを打てば状態の判断ができることになるわけです。
で、PowerShellでPINGを打つには
「powershell ping 監視」でググったらトップに表示されたココを参考にせさて頂きました。
# 監視対象 [String[]]$addressAp = @('192.168.137.1') # 監視結果格納連想変数初期化 $dead_or_alive = @{} for($i = 0; $i -lt $addressAp.Count; $i++){ $dead_or_alive.Add($addressAp[$i],'alive') } # ping for($i = 0; $i -lt $addressAp.Count; $i++) { # Ping実行する。 $pingAlive = @(Test-Connection -ComputerName $addressAp[$i] -Quiet) if ($pingAlive -eq $True) { $message = "Check-DeadOrAlive SUCCESS:" + $addressAp[$i] echo $message $dead_or_alive[$addressAp[$i]] = 'alive' } else { if($dead_or_alive[$addressAp[$i]] -eq 'alive'){ $message = "Check-DeadOrAlive ERROR:" + $addressAp[$i] echo $message $dead_or_alive[$addressAp[$i]] = 'dead' # .\MHS_ON.ps1 <--ここにコードを入れるか、ps1ファイルを呼ぶ } } }
これで、オフの時のみ17行目のIF文内に入りますので、21行目辺りに先に挙げたモバイルホットスポットの設定をオンにするコードを書くか、そのps1ファイルを起動させればOKです。
あと、2行目のIPはご自身の環境に合わせて変更して下さい。$addressApへは配列でセットできますので複数デバイスに対してPINGを打ちたい場合はカンマ区切りで指定すれば指定した分のPING打ちが可能です。但しNGだった時に動作させるMHS_ON.ps1への判断には一工夫必要ですが・・・
いかがでしたでしょうか?
現在の私のレベルではこの程度の事しか思いつかず、もっとスマートな方法がございましたらコメント頂けますと幸いです。
ではまた。
勉強になりました。
ネットワーク名やパスワードは、コマンドで変更することはできないでしょうか。やり方が分かれば教えてほしいです。
コメント頂きありがとうございます。
また、確認が遅れ返信できておらず大変申し訳ございませんでした。
ご問い合わせのネットワーク名やパスワードをコマンドで変更されたいとのことですが
netsh wlan set hostednetwork ssid=
netsh wlan set hostednetwork key=
このあたりのコマンドでできませんでしょうか