各位大侠好!我现在有一个十分头痛的问题想请教一下:
我定义一个性能计数器来实时获取某个进程的内存使用率
PerformanceCounter MemUsage = new PerformanceCounter("Process", "Working Set", ProcessName);
但是现在系统中的进程ProcessName有两个而且是同名的,只不过其中一个的用户名是System,另一个的是Administrator,我要获取用户名为Administrator的进程的内存使用率,那该怎么实例化这个计数器就一定能得到我想要的信息而不是用户名是System进程的信息呢?
比如:ProcessName 为 msiexec 的进程有两个,其中一个的用户名是System,另一个的是Administrator,我实例化时怎么区分它俩?
谢谢各位帮助了!!!
我定义一个性能计数器来实时获取某个进程的内存使用率
PerformanceCounter MemUsage = new PerformanceCounter("Process", "Working Set", ProcessName);
但是现在系统中的进程ProcessName有两个而且是同名的,只不过其中一个的用户名是System,另一个的是Administrator,我要获取用户名为Administrator的进程的内存使用率,那该怎么实例化这个计数器就一定能得到我想要的信息而不是用户名是System进程的信息呢?
比如:ProcessName 为 msiexec 的进程有两个,其中一个的用户名是System,另一个的是Administrator,我实例化时怎么区分它俩?
谢谢各位帮助了!!!
第二个进程 notepad.exe#1
第三个进程 notepad.exe#2
...如果觉得这办法不好,可以使用WMI(Windows Management Instrumentation):
具体用法可以在MSDN上查Win32_Process,或Win32_PerfFormattedData_PerfProc_Process。
private void button1_Click(object sender, EventArgs e)
{
string query = "select * from win32_process where name='notepad.exe'";
ManagementObjectSearcher searcher = new ManagementObjectSearcher(query);
foreach(ManagementObject o in searcher.Get())
{ object[] ownerNames = new object[2];
o.InvokeMethod("GetOwner", ownerNames); UInt64 workingsetK = (UInt64)o["WorkingSetSize"] / 1000; // unit: bytes
UInt64 userTimeSec = (UInt64)o["UserModeTime"] / 10000; // unit: 100 nano second
UInt64 kernelTimeSec = (UInt64)o["KernelModeTime"] / 10000; // unit: 100 nano second string str = string.Format(" Name: {0}\n Owner: {1}\n WorkingSet: {2}K\n",
o["Name"],
ownerNames[0],
workingsetK); MessageBox.Show(str);
}
}