日期:2014-05-19  浏览次数:20957 次

利用WMI,如何高效获得系统进程的用户名?高分求教!
我用这种方法得到相应进程的相关信息,其中用InvokeMethod()的方法得到进程用户名,但是效率相对太低(要多执行近1秒),希望高手提供一个效率高的方法得到这个项,最好用WQL直接查询。
ManagementObjectCollection   processBase   =   WmiQuery( "* ",   "Win32_Process ");                      
foreach(ManagementObject   obj   in   processBase)
{
          Console.Write(obj.Properties[ "ProcessID "].Value.ToString());
          Console.Write(obj.Properties[ "Name "].Value.ToString());
          if   (obj.Properties[ "ProcessID "].Value.ToString()   !=   "0 ")
          {
                  object   user   =   obj.InvokeMethod( "GetOwner ",   null,   new   InvokeMethodOptions(null,   TimeSpan.MaxValue));
                  Console.Write(((ManagementBaseObject)user).Properties[ "User "].Value.ToString());
          }
          else
                  Console.Write( "SYSTEM ");
          Console.Write(bufferTable[obj.Properties[ "ProcessID "].Value.ToString()].ToString());
          Console.WriteLine(obj.Properties[ "WorkingSetSize "].Value.ToString());
}

其中:protected   ManagementObjectCollection   WmiQuery(string   sltItems,   string   sltTarget)
{
          ManagementObjectSearcher   mSearCher   =   new   ManagementObjectSearcher();
          mSearCher.Scope   =   new   ManagementScope(@ "\\localhost\root\cimv2 ");
          mSearCher.Query   =   new   ObjectQuery(string.Format( "select   {0}   from   {1} ",   sltItems,   sltTarget));
          return   mSearCher.Get();
}

------解决方案--------------------
http://www.codeproject.com/cs/system/wmi.asp