Подпроцесс для выполнения команд на компьютере с Windows
Я пытаюсь подключиться к удаленной машине Windows и из командной строки выполнить несколько команд. Команды похожи: у меня есть исполняемый файл в определенной папке, перейти в эту папку и запустить команду
InstallUtil.exe <exe_name>
Вот мой код:
class WindowsMachine:
def __init__(self, hostname, username, password):
self.hostname = hostname
self.username = username
self.password = password
# self.remote_path = hostname
try:
print("Establishing connection to .....%s" %self.hostname)
connection = wmi.WMI(self.hostname, user=self.username, password=self.password)
print("Connection established")
try:
print(os.listdir(r"C:\Program Files\BISYS\BCE"))
a = subprocess.check_output(["InstallUtil.exe","IamHere.exe"], cwd="C:/Program Files/ABC/BCD/",stderr=subprocess.STDOUT)
print(a)
except subprocess.CalledProcessError as e:
raise RuntimeError("command '{}' return with error (code {}): {}".format(e.cmd, e.returncode, e.output))
except wmi.x_wmi:
print("Could not connect to machine")
raise
w = WindowsMachine(hostname,username,password)
print(w)
print(w.run_remote())
Но я получаю сообщение об ошибке:
WindowsError: [Error 2] The system cannot find the file specified
1 ответ
Как указано в комментариях, если ваша цель - запустить процесс на удаленной машине Windows, в первую очередь вы должны оставить удаленное соединение открытым, поэтому вместо того, чтобы хранить его в локальной переменной connection
хранить его в классе self.connection
, Теперь, чтобы выполнить команду на удаленной машине с помощью WMI, вы должны сделать что-то вроде этого (учебник WMI):
class ConnectToRemoteWindowsMachine:
def __init__(self, hostname, username, password):
self.hostname = hostname
self.username = username
self.password = password
# self.remote_path = hostname
try:
print("Establishing connection to .....%s" %self.hostname)
self.connection = wmi.WMI(self.hostname, user=self.username, password=self.password)
print("Connection established")
except wmi.x_wmi:
print("Could not connect to machine")
raise
def run_remote(self, async=False, minimized=True):
SW_SHOWNORMAL = 1
process_startup = self.connection.Win32_ProcessStartup.new()
process_startup.ShowWindow = SW_SHOWNORMAL
process_id, result = c.Win32_Process.Create(
CommandLine="notepad.exe",
ProcessStartupInformation=process_startup
)
if result == 0:
print "Process started successfully: %d" % process_id
else:
raise RuntimeError, "Problem creating process: %d" % result
w = ConnectToRemoteWindowsMachine(hostname,username,password)
print(w)
print(w.run_remote())