windowsでpythonから管理者権限が必要なことを実行する方法
こんにちはひぐです!
きょうはニッチな情報なんですが、
windowsでpythonを使って管理者権限が必要なことを実行する方法を紹介します^^
動機
pythonからIPアドレスを変更する方法したかったのですが、
要求された操作には、権限の昇格が必要です。管理者として実行してください。
と出てしまう
windowsでは、管理者としてログインしていたとしてもネットワークの設定を変えるには認証がいるようです。
今回の記事では、IPアドレスを変更する方法を例にタイトルの内容を紹介していきたいと思いますm(__)m
GUIで変更する方法
普通の使い方をする人はこれで大丈夫だと思います。
そして非常によくまとまっていた記事があるので、丸投げします()
コマンドプロンプトでIPアドレスを変更する方法
まずはコマンドプロンプトを管理者権限で開く(右クリックより選択)。もしくは、
powershell start-process cmd -verb runas
と打つ。
参考:コマンドプロンプトから管理者権限のコマンドプロンプトに切り替える - Qiita
これは、
「powershellを起動し、コマンドプロンプト(cmd)を管理者権限(ruans)で
実行する(start-processes)」
という意味になります。
そうすると、管理者と書かれたコマンドプロンプトが別に開くので、
netsh interface ip set address "接続名" static xxx.xxx.xxx.xxx(IPアドレス) xxx.xxx.xxx.xxx(サブネットマスク) xxx.xxx.xxx.xxx(デフォルトゲートウェイ)
と入力します。
参考:[メモ][Windows] コマンドラインでIPアドレスを変更する | Nobwak's Lair
サブネットマスク/デフォルトゲートウェイとはなんぞ?
という方のためにリンクを貼っておきます。↓
そして、コマンドプロンプト内で
ipconfig /all
と打って、IPアドレスが変更されているのを確認します。
pythonでIPアドレスを変更する方法
前置きが長くなりました、本題に移ります!
pythonでコマンドプロンプトのコードを実行するにはsubprocessを使います。
とすればOKです。
参考:17.5. subprocess — サブプロセス管理 — Python 3.3.6 ドキュメント
しかし、pythonで'powershell start-process cmd -verb runas'を打ったとしても
別ウィンドウが開くだけでsubprocessでの操作が管理者権限になるわけはないです涙。
ここではかなり頭を悩まされましたが、
バッチファイルを作成しそれを起動させるということにしました。
※バッチファイル…クリックするとそのコードをコマンドプロンプトで実行するファイル。
メモ帳などで書き、拡張子を.batにすれば完成する。
参考:必要に迫られてバッチファイルを組むことになった人向けのTips - Qiita
参考になったのは以下の記事です!
具体的な方針
- 管理者権限でコマンドプロンプトを開き○○というコードを実行するという
バッチファイルAを作る - 実行したい○○というコードが書かれたバッチファイルBを作成する
- pythonからバッチファイルAを実行するという指示を飛ばし、
本来の目的であるバッチファイルBの内容を実行する
バッチファイルAの中身
"""%1""" "%2"は引数です。%1は実行したいバッチファイルBのパス、%2はバッチファイルBに渡す引数です
-------------------------------------------------------------------------------------------------------------------
バッチファイルBの中身
@echo offは実行したときに、コマンドプロンプトでコードを表示しないという指示になります。
今回はIPアドレスの最終桁を変更したかったので%1(バッチファイルAからみると%2)を渡しました。
-------------------------------------------------------------------------------------------------------------------
そして、pythonには以下のように記述をします
これでOKです!
役に立つ人がいるか微妙な記事ですが、
3日前の俺からしたらのどから手が出るほど欲しい記事なので書きました笑
たぶんmacならsudoで一発なんだろうなぁ(涙)
めちゃくちゃネットワーク周りには疎かったのですが、
紆余曲折したおかげでちょっとだけTCP/IP周りに詳しくなりましたw
もっといい方法ありそうなので、もし知っている方がいたらコメントしていただけたら幸いです!
では~