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

场景、需求:
需要对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

转载于:https://www.cnblogs.com/learnmore/p/8832537.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值