【问题标题】:How to get list of processes using C# and Task Scheduler如何使用 C# 和任务计划程序获取进程列表
【发布时间】:2011-07-26 17:59:12
【问题描述】:

出于管理目的,我正在尝试获取 Windows Server 2008 下的进程列表。

我用 C# 写了一些类似这样的程序:

foreach ( Process clsProcess in Process.GetProcesses() )
{
    //do something
}

一切正常,直到我安排我的程序从任务计划程序运行。 显然,程序无法以这种方式看到正在运行的进程(得到空列表)。

在任务计划程序运行程序时获取进程列表的任何解决方案?

【问题讨论】:

  • 只是猜测:在任务管理器中检查您的程序在哪个用户下运行。也许它在没有足够权限查看进程的用户下运行。
  • @Ilya 我以管理员身份运行它,所以权限应该不是问题。

标签: c# windows-server-2008 taskscheduler


【解决方案1】:

我不知道这种行为的原因。但也许 System.Management API 将在这种情况下工作。 Here's an example.

【讨论】:

    【解决方案2】:

    艾伦,我绝对不是专家,但这听起来像是用户权限。

    显然,在任务计划程序中设置您的任务时,您可以选择它将以哪个用户身份运行,以及随后该任务具有哪组权限。

    也许这个link 会有用。

    【讨论】:

    • 感谢重播。我以管理员身份运行此程序,所以权限应该不是问题...
    【解决方案3】:

    我遇到了同样的问题,它与 .NET 3.5 和 4 中有关。Windows Server 2008 核心或 Windows Server 2008 R2 核心不支持 System.Diagnostic.Process 类。
    @987654321 @

    如果您查看 Platforms,您会看到导致我头发松散的文字。我仍在寻找一种方法来做到这一点,当我有解决方案时会发布..

    事实证明,Server 2008 也不支持 System.ManagementObjectCollection 类。这是从 WMI 查询中获取集合的重要部分。

    昨天玩了一些游戏后,我想出了这个肮脏的解决方案,但它确实有效。 下面是我调用的vbscript和调用脚本的方法。

    VBScript 查询流程

    process = Wscript.Arguments.Item(0)
    Set oWMI = GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\cimv2")
    Set Processs = oWMI.ExecQuery("SELECT * FROM Win32_Process where Name='"& process &"'")
    count = 0
    ON ERROR RESUME NEXT
    FOR EACH proc IN Processs
        count = count + 1
    Next
    IF Err.Number > 0 THEN
        count = -1
    END IF
    wscript.StdOut.Write count
    

    C#方法调用脚本

     private bool IsProcessRunning()
        {
            int pcReturn = -1;
            bool blRunning = false;
            String strCmd = @"cscript";
            String arg = "//B //Nologo ProcessSearch.vbs YourProcess.exe";
    
            System.Diagnostics.ProcessStartInfo psi = new     System.Diagnostics.ProcessStartInfo(strCmd);
            psi.RedirectStandardOutput = true;
            psi.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden;
            psi.UseShellExecute = false;
            psi.Arguments = arg;
    
            System.Diagnostics.Process procQuery;
            procQuery = System.Diagnostics.Process.Start(psi);
            String output = procQuery.StandardOutput.ReadToEnd();
            procQuery.WaitForExit();
            if (procQuery.HasExited)
            {
                bool isInt = Int32.TryParse(output, out pcReturn);
                if (!isInt)
                {
                    pcReturn = -1;
                }
                else
                {
                    if (pcReturn > 1)
                    {
                        blRunning = true;
                    }
                }
            }
            return blRunning;
        }
    

    【讨论】:

    • 感谢您回答 Jdunn 并辛勤工作。来自我的 +1 :)
    猜你喜欢
    • 2012-04-19
    • 1970-01-01
    • 2011-05-29
    • 1970-01-01
    • 1970-01-01
    • 2017-09-08
    • 1970-01-01
    • 1970-01-01
    • 2013-07-18
    相关资源
    最近更新 更多