PySimpleGUIとSubprocess(PsExec)で出来たこと

スポンサーリンク

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」になります。

ただ私には知識がなくて難しかったのですが同じような記述を繰り返しているのでもう少し纏められるかもしれません。

初心者による初心者の記述なので誤っているところ多々あると思いますが、参考になると嬉しいです。

ではでは。