Почему я получаю Доступ запрещен на другом компьютере для GetProcesses () - PullRequest
0 голосов
/ 11 октября 2019

Я запускаю процессы на различных удаленных серверах, и мне иногда приходится приостанавливать эти процессы.

Используя приведенный ниже код, я могу чисто приостановить, а затем возобновить любой процесс с именем .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);
            }
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...