Как перечислить запущенные процессы, управляемые CLR? - PullRequest
4 голосов
/ 22 апреля 2011

Как перечислить запущенные процессы?А как насчет доменов приложений?

Будут ли какие-либо уязвимости, связанные с безопасностью?

Мне было бы удобно работать только с .NET 4.0, Windows 7 / Windows Server 2008 R2-only.

PS: это то, что я пытаюсь сделать ... ProcessExplorer.NET вопрос

Ответы [ 4 ]

2 голосов
1 голос
/ 02 мая 2012
using System;
using System.Diagnostics;

namespace ConsoleApplication1
{
   class Program
   {
      static void Main(string[] args)
      {
         Process[] procs = Process.GetProcesses();
         foreach (Process proc in procs)
         {
            string processName = proc.ProcessName;
            int processId = proc.Id;

            try
            {
               if (proc.HasDesktop40CLR())
                  Console.WriteLine("#{0}, {1} (has Desktop CLR 4.0+)", processId, processName);

               if (proc.HasOlderDesktopCLR())
                  Console.WriteLine("#{0}, {1} (has Older Desktop CLR)", processId, processName);

               if (proc.HasMscorlib())
                  Console.WriteLine("#{0}, {1} (has MSCORLib)", processId, processName);
            }
            catch (Exception)
            {
               Console.WriteLine("#{0}, {1} (skipped/unknown)", processId, processName);
            }
         }
      }
   }

   public static class ProcessExtensions
   {
      public static bool HasDesktop40CLR(this Process proc)
      {
         for (int ix = 0; ix < proc.Modules.Count; ++ix)
         {
            var moduleName = proc.Modules[ix].ModuleName;

            if (string.Compare(moduleName, "mscoree.dll", ignoreCase: true) == 0)
               return true;

            if (string.Compare(moduleName, "mscoreei.dll", ignoreCase: true) == 0)
               return true;
         }

         return false;
      }

      public static bool HasOlderDesktopCLR(this Process proc)
      {
         for (int ix = 0; ix < proc.Modules.Count; ++ix)
         {
            var moduleName = proc.Modules[ix].ModuleName;

            if (string.Compare(moduleName, "mscorwks.dll", ignoreCase: true) == 0)
               return true;
         }

         return false;
      }

      public static bool HasMscorlib(this Process proc)
      {
         for (int ix = 0; ix < proc.Modules.Count; ++ix)
         {
            var moduleName = proc.Modules[ix].ModuleName;

            if (string.Compare(moduleName, "mscorlib.dll", ignoreCase: true) == 0)
               return true;

            if (string.Compare(moduleName, "mscorlib.ni.dll", ignoreCase: true) == 0)
               return true;
         }

         return false;
      }
   }
}
1 голос
/ 24 апреля 2011

Как только вы используете Process.GetProcesses выше, вы можете использовать ICLRMetaHost :: EnumerateLoadedRuntimes, чтобы увидеть, выполняет ли процесс экземпляр CLR, и получить версии CLR, запущенные в нем.http://msdn.microsoft.com/en-us/library/dd233119.aspx. API не предоставляется напрямую .NET, но это COM, поэтому вы можете tlbimport mscoree.dll и использовать автоматически созданные оболочки в .NET.

1 голос
/ 22 апреля 2011

System.Diagnostics.Process.GetProcesses () отобразит список всех запущенных процессов как Процесс объекты.

...