はじめに
PythonでUSBの機能を有効無効したい場合PyUSB
を使えばよいのだと思うが、Windowsの場合、libusb-win32
が必要で、このインストールがなかなかうまくいかなかった。そこで、PoweShellとの組み合わせで実現してみた。
使うライブライ
スクリプト | 機能 |
---|---|
Python | subprocess |
PowerShell | Get-PnpDevice Enable-PnpDevice Disable-PnpDevice |
subprocess
でPythonからPowerShellを実行する。Get-PnpDevice
でデバイスリストを取得、対象のUSBデバイスを抽出し、Enable-PnpDevice、Disable-PnpDevice
で有効、無効化する。
事前に調査した記事は下記。
USBをON・OFFする例
USB 大容量記憶装置をフィルタして、それをOFF/ONする例。PowerShellへパラメータを送る際の""
の処理がうまくいかなくて最初手間取ったが、Windwosの場合、PowerShellをsubprocessで使うと、Pythonでできることの幅が広がる。
import subprocess
# USB 大容量記憶装置のInstanceIdをリスト化
usb_search = """
$devlist = Get-PnpDevice -PresentOnly | Where-Object { $_.InstanceId -match '^USB' }
foreach ($dev in $devlist) {
if ($dev.FriendlyName -like "USB 大容量記憶装置") {
Write-Output $dev.InstanceId
}
}
"""
ret = subprocess.run(['powershell','-Command', usb_search], capture_output=True, text=True)
usb_list = ret.stdout.split()
# USBをDisable
for udev in usb_list:
print(f'"{udev}"をusb_disable')
subprocess.run(['powershell','-Command', f'Disable-PnpDevice -InstanceId "{udev}" -Confirm:$false'], capture_output=True, text=True)
# USBをEnable
for udev in usb_list:
print(f'"{udev}"をusb_enable')
subprocess.run(['powershell','-Command', f'Enable-PnpDevice -InstanceId "{udev}" -Confirm:$false'], capture_output=True, text=True)
以上