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