ひぐのカメラとプログラミング日記

大学院生の日記です。主にプログラミングとカメラについて。最近はデータ分析・Kaggleにハマっています

windowsでpythonから管理者権限が必要なことを実行する方法

こんにちはひぐです!

 

きょうはニッチな情報なんですが、

windowspythonを使って管理者権限が必要なことを実行する方法を紹介します^^

 

 

動機

pythonからIPアドレスを変更する方法したかったのですが、

要求された操作には、権限の昇格が必要です。管理者として実行してください。

と出てしまう

 

windowsでは、管理者としてログインしていたとしてもネットワークの設定を変えるには認証がいるようです。

 

今回の記事では、IPアドレスを変更する方法を例にタイトルの内容を紹介していきたいと思いますm(__)m

 

GUIで変更する方法

普通の使い方をする人はこれで大丈夫だと思います。

そして非常によくまとまっていた記事があるので、丸投げします()

pc-chain.com

 

コマンドプロンプト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

 

 

サブネットマスク/デフォルトゲートウェイとはなんぞ?

という方のためにリンクを貼っておきます。↓

サブネットマスク(subnet mask)とは?

デフォルトゲートウェイって何? |【エン転職】

 

そして、コマンドプロンプト内で

ipconfig /all 

 と打って、IPアドレスが変更されているのを確認します。

 

 

pythonIPアドレスを変更する方法

前置きが長くなりました、本題に移ります!

pythonコマンドプロンプトのコードを実行するにはsubprocessを使います。

import subprocess
cmd='hogehoge'
subprocess.call(cmd,shell=True)

とすればOKです。

参考:17.5. subprocess — サブプロセス管理 — Python 3.3.6 ドキュメント

 

しかし、pythonで'powershell start-process cmd -verb runas'を打ったとしても

別ウィンドウが開くだけでsubprocessでの操作が管理者権限になるわけはないです涙。

 

ここではかなり頭を悩まされましたが、

バッチファイルを作成しそれを起動させるということにしました。

 

※バッチファイル…クリックするとそのコードをコマンドプロンプトで実行するファイル。

         メモ帳などで書き、拡張子を.batにすれば完成する。

 

参考:必要に迫られてバッチファイルを組むことになった人向けのTips - Qiita

 

 

参考になったのは以下の記事です!

piyopiyocs.blog115.fc2.com

 

具体的な方針

  1. 管理者権限でコマンドプロンプトを開き○○というコードを実行するという
    バッチファイルAを作る
  2. 実行したい○○というコードが書かれたバッチファイルBを作成する
  3. pythonからバッチファイルAを実行するという指示を飛ばし、
    本来の目的であるバッチファイルBの内容を実行する

 

バッチファイルAの中身

powershell.exe -Command Start-Process """%1""" "%2" -Verb Runas

"""%1""" "%2"は引数です。%1は実行したいバッチファイルBのパス、%2はバッチファイルBに渡す引数です

-------------------------------------------------------------------------------------------------------------------

 

 

バッチファイルBの中身

@echo off
netsh interface ip set address "イーサネット" static xxx.xxx.xxx.%1(IPアドレス) xxx.xxx.xxx.xxx(サブネットマスク) xxx.xxx.xxx.xxx(デフォルトゲートウェイ) 

 

@echo offは実行したときに、コマンドプロンプトでコードを表示しないという指示になります。

今回はIPアドレスの最終桁を変更したかったので%1(バッチファイルAからみると%2)を渡しました。

-------------------------------------------------------------------------------------------------------------------

 

 

 

そして、pythonには以下のように記述をします

cmd4=fr'バッチファイルAのパス バッチファイルBのパス {IPアドレス下1桁(int)}'
    subprocess.call(cmd4,shell=True)

 

これでOKです!

 

役に立つ人がいるか微妙な記事ですが、

3日前の俺からしたらのどから手が出るほど欲しい記事なので書きました笑

 

たぶんmacならsudoで一発なんだろうなぁ(涙)

 

めちゃくちゃネットワーク周りには疎かったのですが、

紆余曲折したおかげでちょっとだけTCP/IP周りに詳しくなりましたw

 

もっといい方法ありそうなので、もし知っている方がいたらコメントしていただけたら幸いです!

 

 

では~

google-site-verification: google1c6f931fc8723fac.html