Python初心者でもUSBポートをワンタッチで無効化するシステムを作りたい


##はじめに
こんばんは
最近就活が始まって、最近気になったニュースは何ですかという質問に対策するべく、ネットサーフィンをしていたら、ソースコードをGitHubにアップロードしてしまい非常に大きな問題になっていました。
そこで私は

**これだ！！！**

と思い、早速調べ始めました。
どうやらヒューマンエラーにより起こったインシデントらしく

（なんだ、こんなんいつか起こりうることだったじゃん）>:bust_in_silhouette:

と思ってしまいました。

何故かというと
ファミレスやファストフード店でノートパソコンを使って仕事をしていた男性があろうことかノートパソコンをそのまま置いてトイレへ向かってしまったのです・・・。
こんなセキュリティの意識の低い社員がいる会社はどれだけセキュリティ意識の低い研修を行っているのだろうと心配になってしまいました。

前置きが長くなってしまいましたがそんなセキュリティ意識の低い会社員さんであっても面倒臭がらないように、ワンタッチでどうにかUSBポートを無効化できないかなと思いついた次第です。

##プログラムの概要
１．USBポートを無効化する（Windowsのレジストリエディタを使用）。
２．ショートカットキーでより手軽にpythonコードを呼び出す（batファイル及びショートカットを利用）。
３．ついでにWindowsのパソコンをいじられないように画面をロックさせたい。
##環境
・Windows10 Home
・python3.9
・jupyter lab
##１．USBポートを無効化するコードの作成
まずはUSBポートを無効化してみましょう。
無効化するにはWindowsに最初から導入されているレジストリエディタをPython上で利用し数値を書き換える必要があります。
PythonでレジストリエディタをいじるにはwinregというこれまたデフォルトでPythonに導入されているWindowsレジストリAPIが必要です。

```python:test1.py
#Python 3.9
import winreg

RegistryKeyName = r"SYSTEM\\CurrentControlSet\\Services\\USBSTOR"

#キーに繋ぐ
RegConnection = winreg.ConnectRegistry(None,winreg.HKEY_LOCAL_MACHINE)
#キーを開く
Key = winreg.OpenKeyEx(RegConnection,RegistryKeyName,reserved=0,access=winreg.KEY_WRITE)
#レジストリの書き換え
settings = winreg.SetValueEx(Key,"Start",0,winreg.REG_DWORD,4)
winreg.CloseKey(Key)
```

winreg.ConnectRegistry()でまず書き換えたいレジストリキーのパスを指定し、接続します。
winreg.OpenKeyEx()で接続した変数とパスを指定し、開きます。
似たようなコマンドでOpenKey()もありますが、どちらでも動作は変わらないそうです。（書式は少し変わったはずです）
winreg.SetValuesEx()でいよいよレジストリの書き換えです。
書き換えたいサブキーを指定し、書き換えたいデータを入力します。
ここで一つ注意なのですが、TypeをREG_DWORDとなっていますが、他のレジストリを書き換える際は変える前と同じTypeにしないと上手くいきません。
※恐らくint型とstr型の違いだと思います。
最後にwinreg.CloseKey()で接続したキーを閉じましょう。

これでUSBポートの接続は無効化されたはずです。
また、USBポートの接続を無効解除するためのコードはSetValueExの最後の値を3に変更することで、解除されます。
あら、お手軽。

##２．ワンタッチで無効化したい
こちらはとても簡単です。
まず、このpythonファイルを起動できるbatファイルを作成しましょう

batファイルには
"python本体のパス" "起動したいファイルのパス"
を入力しましょう。

これでbatファイルの準備は完了です。
作成したbatファイルのショートカットを作成し、プロパティからショートカットキーを設定し、詳細設定からプログラムを管理者権限で実行というチェックボックスにチェックを入れましょう。

あら不思議、設定したショートカットキーを入力するだけで簡単にUSBポートの無効化に成功しました。
でも、ここからがマグマなんです。
##３．ついでにWindowsもスリープモードに入りたい
こちらもそこまで難しくありません。
スリープモードに入るにはsubprocessモジュールを利用します。

```python:test2.py
import subprocess

subprocess.run ("rundll32.exe user32.dll,LockWorkStatiomn")
```

この一文だけで画面ロック状態に入ります。
このままだとすぐロックされてびっくりしちゃうかも・・・
ディレイを入れましょう！

```python:test3.py
import subprocess
import time

print("3秒後に画面ロックされます。")

time.sleep(3)

subprocess.run ("rundll32.exe user32.dll,LockWorkStation")
```

このように事前に警告してあげるとわかりやすいかもしれませんね。

##完成

```python:kansei.py
#Python 3.9
import winreg
import time
import subprocess

RegistryKeyName = r"SYSTEM\\CurrentControlSet\\Services\\USBSTOR"

try:
#キーに繋ぐ
    RegConnection = winreg.ConnectRegistry(None,winreg.HKEY_LOCAL_MACHINE)
#キーを開く
    Key = winreg.OpenKeyEx(RegConnection,RegistryKeyName,reserved=0,access=winreg.KEY_WRITE)
#レジストリの書き換え
    settings = winreg.SetValueEx(Key,"Start",0,winreg.REG_DWORD,4)
    winreg.CloseKey(Key)

    print("USBポートがロックされました。")
    print("3秒後に画面がロックされます。")

    time.sleep(3)

    subprocess.run("rundll32.exe user32.dll,LockWorkStation")
except:
    print("Error")

```

とこんな感じになりました。
初心者にしてはなかなか綺麗にまとまったのではないでしょうか。

##総括
初めてQiitaの執筆及びPythonのプログラムをまともに作成しました。
プログラム自体は難しいことしていないのですが、勉強していてなかなか面白かったのでオールオッケーです。
これからこのプログラムに追加機能を搭載しながらpythonの勉強を進めていこうと思います。（Bluetoothとか顔認証とか）
駄文ではありましたがここまで読んでいただきありがとうございました。