PMPの流儀

PMPの流儀

エンジニアのページ

MENU

Windows10 デバイスの有効・無効化を自動処理(PowerShell)

Windows10でデバイスの有効・無効化をPowerShellスクリプトにより自動処理する方法を紹介します。さらに、ログオン時に自動実行することも取り上げます。

 

1. デバイスの有効・無効化について

Windowsではデバイスの管理はデバイスマネージャーからおこないます。
たまに触るのならいいのですが、度々いじりたいときには面倒になり、スクリプトで自動処理したくなります。
幸い、Windows10のPowerShell にはデバイスの有効・無効化するコマンドがあります。

2. デバイスの確認

制御したいデバイスの名前(識別子)を確認します。
ここでは FeliCaバイスを対象としてみます

2.1 デバイスマネージャーを起動

スタートボタンで右クリックしてメニューから「デバイスマネージャー」をクリックします
f:id:ruruucky:20210411103541p:plain

2.2 デバイス名の確認

目的のデバイスを探し名前をメモっておいてください。
下記の画面では 'FeliCa Port/PaSoRi RCS956 USB' です。バイスとします。
その後、名前の部分をダブルクリックします。
f:id:ruruucky:20210411102816p:plain

2.3 「詳細」タブをクリック

f:id:ruruucky:20210411102826p:plain

2.4 プロパティの「デバイスの説明」の個所をクリック

f:id:ruruucky:20210411102835p:plain

2.5 デバイス インスタンス パスをクリック

f:id:ruruucky:20210411102844p:plain

2.6 名前を確認する

バイス インスタンス パスとしてメモしておきます。
今回の場合は 'USB\VID_054C&PID_02E1\6&1041377&0&2'です。
f:id:ruruucky:20210411102853p:plain

3. PowerShell でデバイス取得

PowerShellで目的のデバイスを見つけます。ここでは例題として USB接続のFeliCaバイスを取り上げます。

3.1 PowerShellを起動します

スタートボタンで右クリックしてメニューから「Windows PowerShell(管理者)」をクリックします。

f:id:ruruucky:20210411154657p:plain

3.2 デバイス名による指定

PowerShellを使って制御したいデバイスを探します。

Get-PnpDevice

これですべてのデバイスの一覧を取得できます。ここから制御したいデバイスを絞り込みます。
まずバイスで探してみます。一部のキーワードだけでもいいので、今回は'FeliCa'をキーワードにしてみます。
FeliCa の前後に文字があっても引っかかるように、アスタリスク '*' をつけます。

 Get-PnpDevice | ? {$_.friendlyname -like '*FeliCa*'}

実行結果は以下の通り1つ見つかりました。

Status     Class           FriendlyName                                                                     InstanceId     
------     -----           ------------                                                                     ----------     
OK         FeliCa          FeliCa Port/PaSoRi RCS956 USB                                                    USB\VID_054C...

ここで1つに絞り込めればこの章は終わりです。次章へ進めます
絞り込めなければ、そのまま↓をどうぞ。

3.3 デバイス インスタ パスによる指定

バイス インスタンス パスを指定して絞り込みます。こちらの方法であれば確実に1つのデバイスを指定できます。

Get-PnpDevice | ? {$_.InstanceId -eq 'USB\VID_054C&PID_02E1\6&1041377&0&2'}

4. スクリプトを作成

バイスの絞り込みができたので、スクリプトにします。 メモ帳などのエディタを使用して DeviceStop.ps1 として以下を作成します。

バイスを使う場合

Get-PnpDevice | ? {$_.friendlyname -like "*FeliCa*"} | Disable-PnpDevice -Confirm:$false

バイス インスタ パスを使う場合

Get-PnpDevice | ? {$_.InstanceId -eq 'USB\VID_054C&PID_02E1\6&1041377&0&2'} | Disable-PnpDevice -Confirm:$false

さらに、このスクリプトを呼び出すバッチファイルを作ります。 DeviceStop.bat

PowerShell -ExecutionPolicy RemoteSigned .\DeviceStop.ps1
pause

5. テスト

4で作成したバッチファイルを実行してみます。

Disable-PnpDevice : エラーです
+ ... $_.friendlyname -like "*FeliCa*"} | Disable-PnpDevice -Confirm:$false
(Win32_PnPEntity...6&1041377&0&2"):ROOT\cimv2\Win32_PnPEntity) [Disable-PnpDevice], CimException
    + FullyQualifiedErrorId : HRESULT 0x80041001,Disable-PnpDevice

エラーになってしまいました。
これは管理者権限がないために発生するエラーです。

バッチファイルを起動する時に右クリックしてメニューから「管理者として実行」を選択してみます。

.\DeviceStop.ps1 : 用語 '.\DeviceStop.ps1' は、コマンドレット、関数、スクリプト ファイル、または操作可能なプログラムの名前として認識されません。名前が正しく記述されていることを確認し、パスが含まれている場合はそのパスが正しいことを確認してから、再試行してください。
発生場所 行:1 文字:1
+ .\DeviceStop.ps1
+ ~~~~~~~~~~~~~~~~
    + CategoryInfo          : ObjectNotFound: (.\DeviceStop.ps1:String) [], CommandNotFoundException
    + FullyQualifiedErrorId : CommandNotFoundException

今度はps1ファイルが見えなくなりました。管理者として実行するとカレントディレクトリが system32 に移動してしまうのが原因です。
batとps1は同じディレクトリに置いているので、batファイルのパスを取得してps1のパスを指定する方法を使います。
(仕組みはこちらを参照) pmp-style.hatenablog.com

DeviceStop.bat

PowerShell -ExecutionPolicy RemoteSigned %~dp0\DeviceStop.ps1
pause

batファイルを書き換えてから、管理者として実行してみます。

C:\WINDOWS\system32>pause
続行するには何かキーを押してください . . .

成功しました。デバイスマネージャーで無効になっている事を確認しましょう。デバイスのアイコンに↓矢印が付いています

f:id:ruruucky:20210411122150p:plain

これで、バッチファイルからデバイスを停止する事が出来ました。

6. ログイン時に自動実行

バイスによっては起動時は調子悪く、一度無効化した後に有効化しないとうまく動かないケースもあります。
そのような場合に、ログイン時にデバイスの無効化・有効化を自動実行することもあります。

タスクスケジューラを使ってPowerShellスクリプトをコールすことで実現できます。

6.1 PowerShellスクリプト

無効化した2秒後に再び有効にするスクリプトにします。
1行目は使用デバイスに応じて書き換えてください。

$x = Get-PnpDevice | ? {$_.friendlyname -like '*FeliCa*'}
$x | Disable-PnpDevice -Confirm:$false
Start-Sleep -s 2
$x | Enable-PnpDevice -Confirm:$false

6.2 タスクスケジューラ

PowerShellは実行時に必ずウインドウが開いてしまいます。起動時に毎回開くのはエレガントではないので非表示で実行します。
それをタスクスケジューラからコールします。
そのための方法は以下をご覧ください。

pmp-style.hatenablog.com