如何使用C#和任务调度器获取进程列表

如何使用C#和任务调度器获取进程列表,c#,C#,为了便于管理,我正在尝试获取win2k8下的进程列表。 我用C#编写了一些类似的程序: foreach ( Process clsProcess in Process.GetProcesses() ) { //do something } 在我计划从任务调度器运行程序之前,一切都正常。 显然,程序无法看到以这种方式运行的进程(得到空列表) 通过任务调度器运行程序时,有没有办法获取进程列表?我不知道这种行为的原因。但在这种情况下,

为了便于管理,我正在尝试获取win2k8下的进程列表。 我用C#编写了一些类似的程序:

        foreach ( Process clsProcess in Process.GetProcesses() )
        {
         //do something
        }
在我计划从任务调度器运行程序之前,一切都正常。 显然,程序无法看到以这种方式运行的进程(得到空列表)


通过任务调度器运行程序时,有没有办法获取进程列表?

我不知道这种行为的原因。但在这种情况下,System.Management API可能会起作用

我不知道这种行为的原因。但在这种情况下,System.Management API可能会起作用

Alan,我肯定不是专家,但听起来像是用户权限

显然,在“任务计划程序”中设置任务时,您可以选择它将作为哪个用户运行,以及任务随后拥有的权限集


也许这会有用。

艾伦,我肯定不是专家,但听起来像是用户权限

显然,在“任务计划程序”中设置任务时,您可以选择它将作为哪个用户运行,以及任务随后拥有的权限集


也许这会有用。

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

如果你看看平台,你会看到导致我头发脱落的文字。我仍在寻找一种方法来做到这一点,并将张贴当我有一个解决方案

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

我遇到了同样的问题,它与.NET3.5和4有关。Windows Server 2008 core或Windows Server 2008 R2 core不支持System.Diagnostic.Process类。

如果你看看平台,你会看到导致我头发脱落的文字。我仍在寻找一种方法来做到这一点,并将张贴当我有一个解决方案

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

只是一个猜测:检查运行程序的用户所在的任务管理器。可能它是在一个没有足够权限查看进程的用户下运行的。@Ilya我是以管理员的身份运行的,所以权限应该不会有问题。只是猜测一下:检查运行程序的用户所在的任务管理器。可能它是在一个没有足够权限查看进程的用户下运行的。@Ilya我以管理员的身份运行它,所以权限应该不会有问题。谢谢重播。我以管理员的身份运行它,所以权限应该不会有问题……谢谢重播。我以管理员的身份运行它,所以权限不应该是问题问题…感谢您回答Jdunn和辛勤工作+谢谢你回答Jdunn,谢谢你的辛勤工作+我发了一封信:)