カテゴリー別アーカイブ: Windows

【Windows】Bluetoothのリンクキーをスクリプトから取得

少し前にBluetoothキーボードをUbuntuとWindowsで共有する話を書きましたが、何度かペアリングしているうちに両方で登録する手順が面倒に感じてきました。

ペアリング作業だけならともかく、レジストリキーを取得するのは面倒すぎます。

そこで、取得作業をなるべく自動化するべくスクリプトを組むことにしました。

環境

  • Ubuntu 16.04 64bit
  • Windows 10 IP 64bit
  • Microsoft Wedge Mobile Keyboard

リンクキーの取り方

以前もお話ししましたが、Bluetoohで使うリンクキーはレジストリエディタから次のキーから取得できます。

(Pythonで組んだのでバックスラッシュが2つになっています・・・)

HKEY_LOCAL_MACHINE\\SYSTEM\\ControlSet001\\services\\BTHPORT\\Parameters\\Keys

また、リンクキーを表示する場合は権限の問題でPSExecというツールからコマンドを発行する必要があります。

そこで、PSExecからregeditをCLIモードで呼び出すべく、次のコマンドを発行しました。

管理者権限でPowerShellを起動して、PSExecがあるディレクトリに移動します。

PS ~\PSTools> .\PsExec.exe -s -i REGEDIT /E D:\temp\test.REG "HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\services\BTHPORT\Parameters\Keys
PS ~\PSTools> cat D:\temp\test.REG
Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\services\BTHPORT\Parameters\Keys]

[HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\services\BTHPORT\Parameters\Keys\(BTアダプタのアドレス)]
"(デバイスのMACアドレス)"=hex:(リンクキー)
"(デバイスのMACアドレス)"=hex:(リンクキー)
(略)

のような出力が得られるはずです。

ただ、これだとどのアドレスがどのデバイスに紐づいているかが分からないので、https://macvendors.com/api を使わせてもらってベンダー情報を取得します。

このAPIは、MACアドレスの上位6桁を送信するとベンダーを返してくれるものです。

PS \PSTools> curl "http://api.macvendors.com/7c1e52"


StatusCode        : 200
StatusDescription : OK
Content           : Microsoft
RawContent        : HTTP/1.1 200 OK
                    Access-Control-Allow-Origin: *
                    Content-Length: 9
                    Content-Type: text/plain
                    Date: Tue, 29 Nov 2016 05:41:26 GMT

                    Microsoft
Forms             : {}
Headers           : {[Access-Control-Allow-Origin, *], [Content-Length, 9], [Content-Type, text/plain], [Date, Tue, 29 Nov 2016 05:
                    41:26 GMT]}
Images            : {}
InputFields       : {}
Links             : {}
ParsedHtml        : System.__ComObject
RawContentLength  : 9

製品情報までは取れませんが、今回はMicrosoftが作っているデバイスが分かればいいので良しとします。

これらを組み合わせてスクリプトを書きます。

スクリプト

PSToolsのディレクトリがスクリプトと同じディレクトリにある状態で実行できます。

#!/usr/bin/env python3.5
# -*- coding:utf-8 -*-

import os
import json
import time
import requests
from subprocess import call

current_dir = os.path.dirname(os.path.abspath(__file__)).replace("/", os.path.sep)


def get_keys():
    cmdfmt = current_dir + '\\PSTools\\PsExec.exe -s -i REGEDIT /E {path} ' \
             '"HKEY_LOCAL_MACHINE\\SYSTEM\\ControlSet001\\services\\BTHPORT\\Parameters\\Keys"'
    filename = current_dir + "\\temp.REG"
    cmd = cmdfmt.format(path=filename)
    try:
        call(cmd, shell=True)
        with open(filename, "r") as f:
            reginfo_raw = f.read().replace("\x00", "")
    except Exception as e:
        print(e)
        reginfo_raw = ""
    finally:
        if os.path.exists(filename):
            os.remove(filename)
    reginfo = reginfo_raw.split('"')[1:]
    return [{"macaddr": reginfo[i], "key": reginfo[i+1][5:-2]} for i in range(0, len(reginfo), 2)]


def recv_vendor(macaddr):
    time.sleep(0.5)
    return requests.get("http://api.macvendors.com/" + macaddr[:6]).text

if __name__ == "__main__":
    keys = get_keys()
    for key in keys:
        key.update({"vendor": recv_vendor(key["macaddr"])})
    print(json.dumps(keys, indent=4, separators=(',', ': ')))

ポイントはPsExecの出力ファイルがUnicode形式だったので、f.read()する時にreplace(“\x00”, “”)しているあたりですかね。。

もっと行儀のよい方法があったら教えていただけるとありがたいです。

これを実行すると、

PS \regshow> python .\regedit.py

PsExec v2.2 - Execute processes remotely
Copyright (C) 2001-2016 Mark Russinovich
Sysinternals - www.sysinternals.com


REGEDIT exited on SAKAKI-MOBILE with error code 0.
[
(略)
    {
        "macaddr": "(デバイスのMACアドレス)",
        "key": "(リンクキー)",
        "vendor": "Microsoft"
    }
]

いい感じに自動化できました。

これからはじゃんじゃんOS間でペアリングしていきますよ!

Windows10とUbuntu16.04でBluetoothデバイスを共有

タブレットでUbuntuとWindowsをデュアルブートして使っているのですが、Bluetoothキーボードをデュアルブートで使っていると取り回しがとても悪いですよね。

共有できる方法を調べて、少し工夫するとうまくいったのでメモを残します。

こちらの記事を参考にさせていただきました。

環境

  • Ubuntu 16.04 64bit
  • Windows 10 Insider Preview Build 14931
  • Microsoft Wedge Mobile Keyboard

手順

※ Markdownのコードブロックがうまく動かなかったので、変な書き方になってしまいました。すみません・・・

  1. まず、普通にUbuntuでペアリングした後に普通にWindowsでもペアリングします。
  2. その後、ここからPsToolsをダウンロードします。
  3. 展開したら管理者権限でコマンドプロンプトを開き、展開したディレクトリに移動します。
  4. 次のコマンドを実行します
    PsExec.exe -s -i regedit.exe
  5. レジストリエディタが起動するので、次の場所を探してください。(元記事だとControlSet002でしたが、私の環境だとControlSet001にありました)
    HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\services\B THPORT\Parameters\Keys\xxxxxxxxxxxx(BluetoothアダプタのMACアドレス?)
  6. ペアリングしたデバイスのMACアドレスが名前となったレジストリキーの値をメモします。
  7. Ubuntu側で以下のファイルを管理者権限で開きます。
    /var/lib/bluetooth/XX:XX:XX:XX:XX:XX/YY:YY:YY:YY:YY:YY(ペアリングしたいデバイスのMACアドレス)/info
  8. LinkKey項目内のKeyをメモしたものに編集します(大文字&スペース無し)
    [LinkKey]
    Key=ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ(メモしたリンクキー)
  9. 再起動します

これで、Bluetoothデバイスが複数OSで使えるようになっているはずです。

リンクキーを共有できれば、Bluetoothデバイスを複数環境下で使えるんですね。

Windows Update KB3194496が失敗する

ctsp-ivuaanxk4

※追記(2016/10/08)※

昨日手持ちのタブレットPCで再試行したところ、Insider Previewの新たなビルドが代わりに入ったことで解決していました。

KB3194496が成功しているかは確認していませんが、毎回再起動時に勝手に更新が失敗する事態は修正されているようです。


9月29日にSlow Ring向けに配信されたWindows Update KB3194496がインストールに失敗していました。

Windows Updateのキャッシュを削除してみたり、マイクロソフト提供の修復ツールを使ったりしてみましたが、残念ながら解決しませんでした。

そもそも家にあるSlow Ring設定のWindows 10マシン3台のすべてが更新に失敗していたので、おそらくWindows Update側の問題だと思います。

Insider Previewとはいえ、このように大容量ファイルを勝手にダウンロードして失敗し続けるのはいろいろと不便ですよね。。

何台か通常ビルドに戻そうかな・・・

Windowsの接続アプリについて

「接続」アプリは、2016年の8月2日に配布されるWindows 10 Anniversary Updatesで追加された新機能の1つです。

connectapp

Miracastレシーバとして、PCから別のPCに無線で画面共有ができたり、Androidなどからも接続できるみたいですね。(私が試したビルドではまだできませんでしたが・・・)

下の画像は、右のタブレットから左のタブレットに無線接続を実行しているところです。

connectapp_tabs

以前からRDPやVNCなどリモートデスクトップを実現するための技術はありましたが、接続アプリはインストールせずに使え、RDPのようにWindowsのエディションにも制約されません。

物は試しということで、とりあえず検証動画をアップロードしてみました。

動画の説明にも書きましたが、検証したのはDellのVenue 11 Pro 7140(Intel Core m5Y71)とLenovoのMiix 2 8(Intel Atom Z3740)です。

画面の大きさはVenue 11 Proが1920×1080でMiixが1280×720です。

正直Miixの方は性能的にかなり心配でしたが、全く問題なく動作しました。

遅延も少なく、画質劣化もあまりないように思えたので、少なくともサブモニターなどとしては十分に使えるでしょう。

ゲーム用途となると少し厳しいかもしれませんが、動きが激しくても安定しているように思えましたので、試してみる価値はありそうです。

個人的にはこのようなアップデートは今後のWindowsが楽しみになるような素晴らしいものだと思いますし、これからもWindowsのアップデートには追従していきたいと思います。