Я запускаю процессы на различных удаленных серверах, и мне иногда приходится приостанавливать эти процессы.
Используя приведенный ниже код, я могу чисто приостановить, а затем возобновить любой процесс с именем .exe на моей рабочей станции.
Однако на моих удаленных серверах я получаю «Отказ в доступе», когда пытаюсь посмотреть в процессах:
var processes = Process.GetProcesses()
.Where(p => (p.MainWindowHandle.ToInt32() != 0) && p.MainModule.ModuleName.Equals(exeFile))
.ToArray();
GetProcesses () возвращается правильно, НО я не могу получить доступ к «MainModule»
Входящий вызов:
ProcessInfo.SuspendAll("MyAppName.exe");
Я читал о проблемах с версией 32/64, НО на моей рабочей станции такая же настройка, как и на моих серверах.
Код:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Management;
using System.Diagnostics;
using System.Runtime.InteropServices;
namespace Utils.ProcessInfo
{
class ProcessInfo
{
public static void SuspendAll(string exeFile)
{
var processes = Process.GetProcesses()
.Where(p => (p.MainWindowHandle.ToInt32() != 0) && p.MainModule.ModuleName.Equals(exeFile))
.ToArray();
foreach (var process in processes)
{
process.Suspend();
}
}
public static void ResumeAll(string exeFile)
{
var processes = Process.GetProcesses()
.Where(p => (p.MainWindowHandle.ToInt32() != 0) && p.MainModule.ModuleName.Equals(exeFile))
.ToArray();
foreach (var process in processes)
{
if(process.Threads[0].WaitReason.ToString().Equals("Suspended"))
process.Resume();
}
}
}
public static class ProcessExtension
{
[Flags]
public enum ThreadAccess : int
{
TERMINATE = (0x0001),
SUSPEND_RESUME = (0x0002),
GET_CONTEXT = (0x0008),
SET_CONTEXT = (0x0010),
SET_INFORMATION = (0x0020),
QUERY_INFORMATION = (0x0040),
SET_THREAD_TOKEN = (0x0080),
IMPERSONATE = (0x0100),
DIRECT_IMPERSONATION = (0x0200)
}
[DllImport("kernel32.dll")]
static extern IntPtr OpenThread(ThreadAccess dwDesiredAccess, bool bInheritHandle, uint dwThreadId);
[DllImport("kernel32.dll")]
static extern uint SuspendThread(IntPtr hThread);
[DllImport("kernel32.dll")]
static extern int ResumeThread(IntPtr hThread);
public static void Suspend(this Process process)
{
foreach (ProcessThread thread in process.Threads)
{
var pOpenThread = OpenThread(ThreadAccess.SUSPEND_RESUME, false, (uint)thread.Id);
if (pOpenThread == IntPtr.Zero)
{
break;
}
SuspendThread(pOpenThread);
}
}
public static void Resume(this Process process)
{
foreach (ProcessThread thread in process.Threads)
{
var pOpenThread = OpenThread(ThreadAccess.SUSPEND_RESUME, false, (uint)thread.Id);
if (pOpenThread == IntPtr.Zero)
{
break;
}
ResumeThread(pOpenThread);
}
}
}
}