如何使用C#和任务计划程序获取进程列表

时间:2011-03-31 09:32:56

标签: c#

我正在尝试获取win2k8下的进程列表以进行管理。 我在C#中编写了一些与此类似的程序:

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

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

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

3 个答案:

答案 0 :(得分:2)

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

如果你看平台,你会看到导致我松开头发的文字。我仍在寻找一种方法来做这件事,并在我有解决方案时发布。

事实证明,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;
    }

答案 1 :(得分:1)

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

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

也许这个link会有用。

答案 2 :(得分:0)

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