もうすぐ還暦プログラマKASAです。
つれづれなるままに、PCに向かひて、心にうつりゆくよしなしごとを、そこはかとなく書きつくれば、あやしうこそものぐるほしけれ。
的にブログを書いております。
が、今回は大変実用的なものを公開したいと思います。
元々、「製品化すれば売れるかも」と密かに温めていたものですがお給金も出たことですし、ぱ~っといきましょう。
タイトルにあるようにUSBメモリをPCのキーにします。
特定のUSBをPCに挿しておかないとログインできない(ログアウトされる)という、どこかで売っているようなものです。
今回公開するのはその基本部分です。
とはいえちゃんと目的の動作はしますよ。
商才のある方は改良して売ってみるのはどうでしょうか 売れたら何か恵んでください。
準備
まず重要なことはテスト用のユーザーを作成します。
普段使っているユーザーでやってもいいですけど、失敗してログインできなくなっても当方責任を持てません。
新しく作ったユーザーで進めましょう。
もちろんUSBメモリは必須です。
原理
(物理)鍵の良さはなんでしょうか? 一般的なPCのパスワードの場合、いくら複雑なパスワードにしてもバレてしまえば終わりです。
(物理)鍵の良さはそれがなければ開かない(使えない)点です。ただし失くすと大変なことになりますが…
じゃあUSBメモリに複雑なキーワードを仕込めばOKかというと、キーワードがバレてればコピーすれば終わりですね((物理)鍵も複製されたら終わり)
鍵に大切なのはコピーできないこと、それが1つしかないことが重要な条件ですね
ではどうしてUSBが鍵にできるかというと実はUSBメモリには1つづつ固有の名前(みたいなもの)が付いているんです。
これはNICのアドレスのようにメーカーに割り当てられたもので1つづつ違うものが割り当てられ変更することができません。
NICアドレスというのは通信用のチップに割り付けられた番号でチップ毎にすべて異なります。そうすることでこの世の中にあるPCから
特定のPCを見つけることができるのです。(PCだけではありませんが)
なおNICアドレスは自分で変更できるIPアドレスとは別のものです。
脱線しました、要はUSBにつけられた変更できない固有の名前を元にすれば、特定のUSBメモリを鍵にできるわけです。
この辺はUSBデバイスの「Vender ID」と「Product ID」をGoogle先生に聞けばわかると思います。
作成
今回もWindows上でやります。開発環境は不要ですので誰でも体験できます。
テスト用のユーザーで作業します。
まずWindowsPowerShellを起動します。
((Get-CimInstance -Class
win32_PnPSignedDriver) | ?{($_.Description -like ‘*mass*’)}).DeviceID;
と入力すると
「USB\VID_1221&PID_3234\0000000075C4」みたいなものが返ってくると思います。
これがUSBメモリの「Vender ID」と「Product
ID」になります。(たぶん)
‘*mass*’がキモでこれでUSBスロットに挿さっているデバイスの中からUSBメモリを探しています。(厳密にはHDDとかも含まれます)
私の場合「USB\VID_1221&PID_3234\0000000075C4」と出ました。
これがキーになるわけです。
次にメモ帳を起動します。
メモ帳に
$DevId = (((Get-CimInstance -Class
win32_PnPSignedDriver) | ?{($_.Description -like ‘*mass*’)}).DeviceID);
$KEY=”USB\VID_1221&PID_3234\0000000075C4“
if(
$KEY -ne $DevId)
{
Write-Output
“(NG)”
}
Write-Output
“(OK)”
sleep
10
と書き込みます。(コピペでOK)
その後「$KEY=”USB\VID_1221&PID_3234\0000000075C4“」のUSB\VID_1221&PID_3234\0000000075C4の部分をあなたのUSBのものに書き換えましょう。
そして適当な場所にUSB_TEST.ps1という名前で保存します。
キーにするUSBメモリを挿しこんだままにして、このファイルを右クリックして「PowerShellで実行」を選んで実行してください。
ウインドウが表れて「OK」か「NG」が表示されてウインドウが消えると思います。
OKが出れば書き換えたキーと読み取ったキーが一致しています。
NGが出た場合、書き換えたキーと読み取ったキーが違うのでもう一度確認してください。
これでキーを確認することができたのでUSBが違ったらログアウトしてしまうようにします。
PowerShellで「shutdown.exe -l -f」とすると強制ログオフされます。
ということでNGが出る場合にこの行を実行するようにします。
こんな感じ
$DevId = (((Get-CimInstance -Class
win32_PnPSignedDriver) | ?{($_.Description -like ‘*mass*’)}).DeviceID);
$KEY=”USB\VID_1221&PID_3234\0000000075C4“
if(
$KEY -ne $DevId)
{
Write-Output
“(NG)”
shutdown.exe -l -f
}
Write-Output
“(OK)”
書き換えたら上書き保存して、実行してください。PowerShellのウインドウが起動され、問題なければそのままウインドウが閉じるだけです。
ここでUSBを抜くか別のUSBメモリを挿してもう一度実行してください。 たぶん強制的にログアウトされるはずです。
これでベースができました。
これをログインする時に動かせば目的達成です。(USBが挿さってなければ即ログアウト=使えない)
普通ログイン時に動くプログラムはWindowsの場合「スタートアップ」フォルダにリンクを置きます。
とはいえこれをそのままでは動きません。(たぶん)
なのでこれを動かすバッチファイルを作ってこれをリンクとして置くことにします。
メモ帳で
powershell –ExecutionPolicy
RemoteSigned -File .\USB_TEST.ps1
と書き込んでUSB_TEST.batとして保存してください。
PowerShellコマンド起動のおまじないのようなものです、詳しく知りたい場合はGoogle先生に聞いてください。
「USB_TEST.bat」のリンクを「スタートアップ」フォルダに置きます。
次のログインから有効です。
今回は少し曖昧な部分がありますが、この程度を克服できる方を対象としました。(書くのが下手なだけというのはヒミツ)
実際起動時にウインドウが出たり製品にするにはまだまだ工夫は必要です。
こんな感じで理屈がわからないとすごいものに思えたりしますが、中身を知ると「なーんだそんなもんか」というものは多いです。
こんな感じで思ったより簡単にキーがないとログインできないシステムが作れたりします。
弊社では簡単なシステムから高度なシステムまであらゆる知恵を動員して構築いたします。
一度お声がけください。
▼この記事がいいね!と思ったらブックマークお願いします