Tkinter поддерживает механизм, названный обработчики протокола . Здесь, термин протокол относится к взаимодействию между приложением и менеджером окон. Обычно используемый протокол называют WM_DELETE_WINDOW
и используют для определения то, что происходит, когда пользователь явно закрывает окно с помощью менеджера окон.
можно использовать protocol
, метод к устанавливает обработчик для этого протокола (виджет должен быть Tk
или Toplevel
виджет):
Здесь у Вас есть конкретный пример:
import tkinter as tk
from tkinter import messagebox
root = tk.Tk()
def on_closing():
if messagebox.askokcancel("Quit", "Do you want to quit?"):
root.destroy()
root.protocol("WM_DELETE_WINDOW", on_closing)
root.mainloop()
Попробуйте добавить параметр -d
в командную строку PsExec.
Не ждите, пока приложение прекратить. Используйте эту опцию только для неинтерактивные приложения.
Это должно правильно вернуть идентификатор процесса в StandardError.
Пример:
ProcessStartInfo psi = new ProcessStartInfo(
@"PsExec.exe",
@"-d -i -u user -p password \\server C:\WINDOWS\system32\mspaint.exe")
{
UseShellExecute = false,
RedirectStandardOutput = true,
RedirectStandardError = true,
RedirectStandardInput = true,
WindowStyle = ProcessWindowStyle.Minimized,
CreateNoWindow = true
};
Process process = Process.Start(psi);
Console.WriteLine(process.StandardError.ReadToEnd());
Вывод:
PsExec v1.94 - Execute processes remotely
Copyright (C) 2001-2008 Mark Russinovich
Sysinternals - www.sysinternals.com
C:\WINDOWS\system32\mspaint.exe started with process ID 5896.
Я не думаю, что вы можете заставить PsExec возвращать pid так, как вы хотите.
Однако вы можете написать свою собственную начальную оболочку приложения в виде консольного приложения и вернуть ей pid. Затем вы можете заставить PsExec всегда запускать приложения, вызывая этот «AppStarter», таким образом возвращая ваш pid.
Что-то вроде:
namespace AppStarter
{
class Program
{
static void Main(string[] args)
{
Process process = new Process();
ProcessStartInfo psi = new ProcessStartInfo(args[0]);
psi.UseShellExecute = false;
psi.RedirectStandardOutput = true;
psi.RedirectStandardError = true;
psi.RedirectStandardInput = true;
psi.Arguments = string.Join(" ", args, 1, args.Length - 1);
process.StartInfo = psi;
process.Start();
Console.WriteLine("Process started with PID {0}", process.Id);
}
}
}
[это грубый и готовый пример, без обработки исключений и т. Д. - просто в качестве иллюстрации]
Ваш код, приведенный выше, теперь становится чем-то вроде
Process process = new Process();
ProcessStartInfo psi = new ProcessStartInfo(@"AppStarter.exe");
psi.UseShellExecute = false;
psi.RedirectStandardOutput = true;
psi.RedirectStandardError = true;
psi.RedirectStandardInput = true;
psi.WindowStyle = ProcessWindowStyle.Minimized;
psi.CreateNoWindow = true;
psi.Arguments = @"PsExec.exe -i -u Username -p 26.06.08 \\server1,server2 C:\data\GridWorker\GridWorker.exe 100000";
process.StartInfo = psi;
process.Start();
Console.WriteLine(process.StandardOutput.ReadToEnd());
Пока я недооценил первоначальный вопрос, задача состояла в том, чтобы получить PID запущенных повторно процессов на удаленных машинах. Это правда? В данном случае, ни один из ответов не является действительно полезным.
Вы должны создать WMI-запросы для каждого из ваших удаленных компьютеров, чтобы получить запущенные процессы. Это можно сделать с помощью классов "Win32_ProcessStartTrace".
Если вам нужна помощь, дайте мне знать.
br--mabra
.