我正在尝试获取 Windows Server 2008 下的进程列表以进行管理。
我用 C# 写了一些类似的程序:
foreach ( Process clsProcess in Process.GetProcesses() )
{
//do something
}
一切正常,直到我安排我的程序从任务计划程序运行。显然,程序无法以这种方式看到正在运行的进程(得到空列表)。
通过任务计划程序运行程序时获取进程列表的任何解决方案?
我正在尝试获取 Windows Server 2008 下的进程列表以进行管理。
我用 C# 写了一些类似的程序:
foreach ( Process clsProcess in Process.GetProcesses() )
{
//do something
}
一切正常,直到我安排我的程序从任务计划程序运行。显然,程序无法以这种方式看到正在运行的进程(得到空列表)。
通过任务计划程序运行程序时获取进程列表的任何解决方案?
我遇到了同样的问题,它与 .NET 3.5 和 4 有关。Windows Server 2008 核心或 Windows Server 2008 R2 核心不支持 System.Diagnostic.Process 类。
进程类.NET
如果您查看 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;
}
我不知道这种行为的原因。但也许 System.Management API 将在这种情况下工作。这是一个例子。