我正在尝试获取win2k8下的进程列表以进行管理。 我在C#中编写了一些与此类似的程序:
foreach ( Process clsProcess in Process.GetProcesses() )
{
//do something
}
一切正常,直到我安排我的程序从任务计划程序运行。 显然程序无法以这种方式看到正在运行的进程(得到空列表)。
任务计划程序运行程序时获取进程列表的任何解决方案?
答案 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