关于运行程序信息获取的操作

场景、需求:
需要对A程序做启动操作,该程序可能在当前机器上多实例运行,在执行启动操作时,要判断程序是否正在运行,根据指令类型来进行强制重启或者不做操作
这里面需要对运行程序的路径进行获取并判断
实现:
程序关闭启动的操作都是正常的使用Process进行处理,问题点在于获取运行程序的目录上。
方案一:
最初选择通过查询正在运行的A程序进程信息,通过Process进行处理,代码如下:
//获取所有目标进程
Process[] pros = Process.GetProcessesByName(app.ProcessName.ToLower().Replace(".exe", ""));
foreach (var pro in pros)
{
    if(pro.MainModule.FileName.ToLower().Equals(fPath, StringComparison.OrdinalIgnoreCase)))
    {
        pro.Kill();
    }
}
这里MainModule处会出现错误:
32 位进程无法访问 64 位进程的模块。

但是,程序代码检查发现都是anycpu的配置,使用管理员权限仍不行。这个方案不合适
方案二:
通过ManagementObject与Win32_Class获取系统信息,需要引用System.Management,代码如下
public static List<string> GetProcessInfo(string processName)
{
    List<string> pathes = new List<string>();
    string wmiQuery = string.Format("select * from Win32_Process where Name ='{0}'",processName);
    using (var searcher = new ManagementObjectSearcher(wmiQuery))
    {
        using (var results = searcher.Get())
        {
            foreach (var retObject in results)
            {
                string processRunningPath = Convert.ToString(retObject.GetPropertyValue("ExecutablePath"));
                pathes.Add(processRunningPath);
            }
        }
    }
    return pathes;
}

其中Win32_Process里的属性信息有:

Caption,CommandLine,CreationClassName,CreationDate,CSCreationClassName,CSName,Description,ExecutablePath,ExecutionState,Handle,HandleCount,InstallDate,KernelModeTime,MaximumWorkingSetSize,MinimumWorkingSetSize,Name,OSCreationClassName,OSName,OtherOperationCount,OtherTransferCount,PageFaults,PageFileUsage,ParentProcessId,PeakPageFileUsage,PeakVirtualSize,PeakWorkingSetSize,Priority,PrivatePageCount,ProcessId,QuotaNonPagedPoolUsage,QuotaPagedPoolUsage,QuotaPeakNonPagedPoolUsage,QuotaPeakPagedPoolUsage,ReadOperationCount,ReadTransferCount,SessionId,Status,TerminationDate,ThreadCount,UserModeTime,VirtualSize,WindowsVersion,WorkingSetSize,WriteOperationCount,WriteTransferCount

 

在测试过程中,发现获取某些程序的信息时为空,经过反复测试,原因是权限不够,需要把运行程序授予管理员权限

 

通过方案二可以获取到有效的程序运行目录。
总结
 通过方案一获取的时候出现的错误不是必现的,目前还不知道真正的原因,如有知道的还请留言告知一下(万分感谢)。方案二可以满足常用的需求。
相关链接
https://msdn.microsoft.com/en-us/library/aa394418%28v=vs.85%29.aspx?f=255&MSPPError=-2147217396
https://stackoverflow.com/questions/27341475/why-is-the-commandline-property-of-a-svchost-exe-win32-process-null

posted on 2018-04-14 16:30  咣当咣当  阅读(424)  评论(0编辑  收藏  举报