1. ホーム
  2. スクリプト・コラム
  3. パワーシェル

PythonでPowerShellを呼び出してbatファイルをリモート実行する例

2022-02-06 16:19:53

ローカルのPowershellを呼び出すPythonメソッド

1. ここで、IPのリストのうちどれがPingを打てるかをテストする関数を持つ、初歩的なpowershellスクリプトを用意します。

コピーコード コードは以下の通りです。

function test_ping($iplist)
{
    foreach ($myip in $iplist)
    {
        $strQuery = "select * from win32_pingstatus where address = '$myip'"
        # Send a ping query using Get-WmiObject
        $wmi = Get-WmiObject -query $strQuery
        if ($wmi.statuscode -eq 0)
        {
            return "Pinging`t$myip... `tsuccessful"
        }
        else
        {
            return "Pinging`t$myip... `tErrorCode:" + $wmi.statuscode
        }
    }
}

test_ping args[0]

Pythonの初歩的な呼び方です。

コピーコード コードは以下の通りです。

# -*- coding: utf-8 -*-
import subprocess
def python_call_powershell(ip):
    try:
        args=[r"powershell",r"D:\jzhou\test_ping.ps1",ip] #args parameter ip is the dynamic parameter args[0] in the corresponding call to powershell, similar to sys.argv[1] in python
        p=subprocess.Popen(args, stdout=subprocess.PIPE)
        dt=p.stdout.read()
        return dt
    except Exception,e:
        print e
    return False

if __name__=="__main__":
    ip=["1.1.1.1","2.2.2.2","3.3.3.3"]
    print python_call_powershell(ip)

以下のようなエラーが報告されることがあります(サーバー自体にpowershellポリシーの実行権限がオンになっている場合は問題ない場合があります)。

2回目の呼び出しで、このメソッドを解決します

2は、起動時にpowershellの実行ポリシーを設定し、このメソッドは、一度ポリシーが設定され、バックは普遍的な、必要に応じてその後powershellスクリプトの末尾に追加するバックポリシーを変更しました

コピーコード コードは以下の通りです。

def python_call_powershell(ip):
    try:
        args=[r"C:\WINDOWS\system32\WindowsPowerShell\v1.0\powershell.exe","-ExecutionPolicy","Unrestricted" , r"D:\jzhou\test_ping.ps1",ip]
        p=subprocess.Popen(args, stdout=subprocess.PIPE)
        dt=p.stdout.read()
        return dt
    except Exception,e:
        print e
    return False

3. もう一つの注意点は、powershell スクリプトは最終的に自分自身の関数を呼び出す必要があり、その関数は python が powershell スクリプトから返された結果を受け取れるように戻り値を持つ必要があり、一方 powershell スクリプトは args[0], args[1] などの形で引数を渡して関数を呼び出し、その引数を python で対応する args の中に渡すことで、poython で引数を渡せるようにします。

ポリシーを元のデフォルトの状態にする必要がある場合は、powershellスクリプトの最後に追加します。Set-ExecutionPolicy Restrictedを追加します。

python リモートコール bat 実行コマンド

1. まず、Python用のwmiパッケージをインストールします。
2、以下のようにbatをリモートコールします。

コピーコード コードは以下の通りです。

# -*- coding: utf-8 -*-
import wmi,json
import time

logfile = 'logs_%s.txt' % time.strftime('%Y-%m-%d_%H-%M-%S', time.localtime())

# Remote execution of bat file
def call_remote_bat(ipaddress,username,password):
    try:
        # Connect to remote server with wmi
        conn = wmi.WMI(computer=ipaddress, user=username, password=password)
        filename=r"D:\apps\autorun.bat" #This file is on the remote server
        cmd_callbat=r"cmd /c call %s"%filename
        conn.Win32_Process.Create(CommandLine=cmd_callbat) #Execute the bat file
        print "Execution successful! "
        return True
    except Exception,e:
        log = open(logfile, 'a')
        log.write(('%s, call bat Failed!\r\n') % ipaddress)
        log.close()
        return False
    return False

if __name__=='__main__':
    call_remote_bat(computer="192.168.1.2", user="testuser", password="testpwd")