Pythonで「PySimpleGUI」と「Subprocess」を使って仕事に役立てないかと考えてて、コマンドを組み合わせてみました。
また調べて行くうちにPythonの「Subprocess」はWindowsPCでコマンドの実行が行えることを知りましたので紹介します。
特殊な例かもしれませんが参考になると嬉しいです。
Pythonを初めて約1ヵ月の初心者
まず初めにPythonの知識について紹介していきますが、私はPythonを知って独学で勉強し始めたところです。コマンドプロンプトを少しかじった程度の者です。
ですのでPythonの(記述)コードについて誤っている箇所が多々あるかもしれないということと、私が書いているものよりもっと簡単に書けることが可能と思いますので、私のコードが全てだと思わないようにして注意ください。
PySimpleGUIとSubprocess
PySimpleGUIとSubprocessを学習する上で何度も確認したサイトを紹介します。
PySimpleGUIの日本語マニュアルは読むだけで色々記載されているので勉強になります。
ただ日本語マニュアルだけでは壁にぶち当たりますので、マニュアルにある言葉をさらに検索して追及していく必要があります。また英語の方が情報が多いです。
Pythonマニュアル内のSubprocess紹介ページについては正直これだけではあまり良く分かりません(笑)
これも紹介ページ内のコードなどを検索してどのように使っているか確認していく必要があります。
ただSubprocessのオプションなどは記載されているのでどういうオプションがあるかなどはオプションの説明などについて調べることが出来ます。
私はマニュアルとか読み解くの苦手なのでかなり苦戦しましたが…。
それと私は独学で勉強中なのでPySimpleGUIとSubprocessについてあまり詳しくはありません。というかPythonも詳しくありません(笑)
そんな私でも色々出来たので独学者の励みになればと思います。
PsExec.exeについて
PsExec.exeとはリモートでWindowsPCへプログラムを実行する便利ツールとなります。
Microsoft社のツールで「Pstools」内に格納されています。
ヘルプデスクやサーバー管理者の方は知っている方も多いと思いますが、一般的にはあまり知られていない便利なツールだと思います。
今回紹介する方法以外にも使えるツールだと思いますので、ヘルプデスクやサーバー管理者の方は覚えておいて損はないと思います。
パラメータにつきましては下記を確認してください。
ただ一点だけ注意として「-s」のパラメータは付けた方が良いです。
「-s」のパラメータを付けなかった場合はプロファイルが出来てしまいます。つまりは痕跡が残ってしまうので、パラメータは付けて操作した方が良いです。
すでにAdministratorプロファイルが出来ている場合でAdministratorで実行するなどの場合は上記パラメータがなくても問題ないです。またプロファイルが出来ても問題ない方も特に気にしないで大丈夫です。
PySimpleGUI x Subprocess x PsExec.exe
ではいよいよ「PySimpleGUI x Subprocess x PsExec.exe」の組み合わせのコードを記載したいと思います。
とその前に 「PySimpleGUI x Subprocess x PsExec.exe」 を使って何が出来るかというのを説明したいと思います。
ヘルプデスクやサーバー管理者の方は経験があると思いますが、一時的にlocalのAdministratorの権限付与を行いたい場合があります。例えばアプリやドライバーソフトウェアのインストールが該当します。
通常会社支給のパソコンはアプリのインストールが行えないように設定(禁止)されています。アプリのインストールを認めるとインシデントを起こしてしまう可能性があるためです。
基本的にインストールが行えない設定となっているパソコンで、どうしてもインストールが必要となった場合などに一時的に権限を付与することがあります。
そういった場合でさらに遠隔で行う必要があった場合は「PsExec.exe」が便利で役に立つツールとなっています。コマンドプロンプトでも同作業を行えますが、コマンドプロンプトに抵抗がある方もいるので、そういった方のために今回のGUIでの方法を思いつきました。
PySimpleGUIのインストール
PySimpleGUIをインストールしていない場合はpipコマンドを使用してインストールしましょう。
pip install pysimplegui
プログラムへのimport
PySimpleGUIは「sg」と短く表記するのが慣例となっているようです。
subprocessも必要なので同じくimportを行います。また「import PIPE」とすることで「stderr=PIPE」のように短く記述することが可能です。
import PySimpleGUI as sg
import subprocess
from subprocess import PIPE
デザインテーマの設定
デザインテーマの設定を行います。
sg.theme('LightGrey1')
PySimpleGUIのサンプルテーマがgithub下部に記載されてましたので参考にしてください。
レイアウトとウィンドウの配置
レイアウトとウィンドウの配置について記載します。
MenubarとTextとButton、Multilineを使用します。「sg.Button」内のsizeについてはボタンのサイズとなってますのでお好みで変更してください。
また「sg.Menubar」はヘルプやファイルなど記載出来て、ウィンドウ内のメニューバーに注意書きやライセンスを記載することが可能です。
「sg.Text」のsizeについては入力フォームのサイズを指定できます。こちらもお好みへ変更できますのでご自由に変更してください。
layout = [
[sg.MenuBar([['ヘルプ',['注意事項','---','ライセンス']]])],
[sg.Text('対象のPCを指定してください')],
[sg.Text('PC名:', size=(10, 1)), sg.InputText('', size=(30, 1), key='-pcName-')],
[sg.Text('ユーザー名:', size=(10, 1)), sg.InputText('', size=(30, 1), key='-pcUser-')],
[sg.Button('Ping', size=(5, 1)), sg.Button('User', size=(5, 1)), sg.Button('Add', size=(5, 1)),
sg.Button('Del', size=(5, 1)), sg.Button('Check', size=(5, 1)), sg.Button('Close', size=(5, 1))],
[sg.Multiline(size=(80,20), border_width=2, key='-Multiline-', auto_refresh=True)]
]
ウィンドウを表示します
「sg.Window」でウィンドウにアプリ名などの表示するこが可能です。
今回は「Administrator権限付与ツール」としています。また「layout」を記載することでlayout表示させています。
window = sg.Window('Administrator権限付与ツール', layout)
while文を使用します
while文を使用することでボタンをクリックした時の動作を作ります。ボタン実行時の動作は各々異なるため、このように作成してみました。
while True:
event, values = window.read()
print(event, values)
window.close()
if文を記述します
closeボタンでのcloseの動作とウィンドウの×閉じの動作を記述します。
if event == sg.WIN_CLOSED or event == 'Close':
break
「sg.Menubar」から「sg.popup_scrolled」を呼び出します
if event == ‘注意事項’:は「sg.Menubar」と同様でなければならないので注意してください。
continueとすることで継続して操作を行えるようにしています。
if event == '注意事項':
attention_text = ''
sg.popup_scrolled('注意事項', attention_text, size=(90, None))
continue
そのほかの記述につきましては下記に記載しました。
サイズや表記については自由に変更できますが、そのほかの記述は変更して動作するか確認できていません。
# ライブラリインポート
import PySimpleGUI as sg
import subprocess
from subprocess import PIPE
# ウィンドウの色指定
sg.theme('LightGrey1')
# ウィンドウのレイアウト指定
layout = [
[sg.MenuBar([['ヘルプ',['注意事項','---','ライセンス']]])],
[sg.Text('対象のPCを指定してください')],
[sg.Text('PC名:', size=(10, 1)), sg.InputText('', size=(30, 1), key='-pcName-')],
[sg.Text('ユーザー名:', size=(10, 1)), sg.InputText('', size=(30, 1), key='-pcUser-')],
[sg.Button('Ping', size=(5, 1)), sg.Button('User', size=(5, 1)), sg.Button('Add', size=(5, 1)),
sg.Button('Del', size=(5, 1)), sg.Button('Check', size=(5, 1)), sg.Button('Close', size=(5, 1))],
[sg.Multiline(size=(80,20), border_width=2, key='-Multiline-', auto_refresh=True)]
]
# ウィンドウの生成
window = sg.Window('Administrator権限付与ツール', layout)
# イベントループ
while True:
event, values = window.read()
if event == sg.WIN_CLOSED or event == 'Close':
break
if event == '注意事項':
attention_text = ''
sg.popup_scrolled('注意事項', attention_text, size=(90, None))
continue
if event == 'ライセンス':
attention_text = ''
sg.popup_scrolled('ライセンス', attention_text, size=(90, None))
continue
if event == 'Ping':
cmdpc = "cmd /c ping -n 2" + " " + values['-pcName-']
pingpc = subprocess.run(cmdpc, shell=True, stdout=PIPE, stderr=PIPE)
window['-Multiline-'].update(pingpc.stdout.decode('cp932'))
continue
if event == 'User':
ll = r"\\"
ps_exe = r'"\\192.168.0.0\XXXX\PsExec.exe" "-s"'
userName = ps_exe + " " + ll + values['-pcName-'] + " " + "cmd /c quser"
userpc = subprocess.run(userName, shell=True, stdout=PIPE, stderr=PIPE)
window['-Multiline-'].update(userpc.stdout.decode('cp932'))
continue
if event == 'Add':
l = "\\"
ll = r"\\"
ps_exe = r'"\\192.168.0.0\XXXX\PsExec.exe" "-s"'
addName = ps_exe + " " + ll + values['-pcName-'] + " " + "cmd /c net localgroup administrators /add" + " " + "domain" + l + values['-pcUser-']
addpc = subprocess.run(addName, shell=True, stdout=PIPE, stderr=PIPE)
window['-Multiline-'].update(addpc.stdout.decode('cp932'))
continue
if event == 'Del':
l = "\\"
ll = r"\\"
ps_exe = r'"\\192.168.0.0\XXXX\PsExec.exe" "-s"'
delName = ps_exe + " " + ll + values['-pcName-'] + " " + "cmd /c net localgroup administrators /delete" + " " + "domain" + l + values['-pcUser-']
depc = subprocess.run(delName, shell=True, stdout=PIPE, stderr=PIPE)
window['-Multiline-'].update(depc.stdout.decode('cp932'))
continue
if event == 'Check':
ll = r"\\"
ps_exe = r'"\\192.168.0.0\XXXX\PsExec.exe" "-s"'
chAccess = ps_exe + " " + ll + values['-pcName-'] + " " + "cmd /c net localgroup administrators"
chpc = subprocess.run(chAccess, shell=True, stdout=PIPE, stderr=PIPE)
window['-Multiline-'].update(chpc.stdout.decode('cp932'))
continue
print(event, values)
window.close()
ポイントは「subprocess.run」と「windows[‘-Multiline-‘].update」になります。
ただ私には知識がなくて難しかったのですが同じような記述を繰り返しているのでもう少し纏められるかもしれません。
初心者による初心者の記述なので誤っているところ多々あると思いますが、参考になると嬉しいです。
最後に
PySimpleGUIのボタンについて興味ある方は下記へアクセスください。
ポップアップについて色々の種類を紹介しています。
「Power Automate Desktop」のインストールについて興味がある方は下記へアクセスください。
「Power Automate Desktop」のインストールは簡単ですがMicrosoftアカウントが必要となります。