惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

V
Visual Studio Blog
Project Zero
Project Zero
阮一峰的网络日志
阮一峰的网络日志
博客园 - 【当耐特】
大猫的无限游戏
大猫的无限游戏
The Register - Security
The Register - Security
C
Check Point Blog
Attack and Defense Labs
Attack and Defense Labs
L
LangChain Blog
Simon Willison's Weblog
Simon Willison's Weblog
S
Schneier on Security
Recorded Future
Recorded Future
GbyAI
GbyAI
D
Darknet – Hacking Tools, Hacker News & Cyber Security
Y
Y Combinator Blog
量子位
A
About on SuperTechFans
I
Intezer
T
Threat Research - Cisco Blogs
MongoDB | Blog
MongoDB | Blog
U
Unit 42
C
CERT Recently Published Vulnerability Notes
Scott Helme
Scott Helme
Cisco Talos Blog
Cisco Talos Blog
P
Palo Alto Networks Blog
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
Spread Privacy
Spread Privacy
M
MIT News - Artificial intelligence
雷峰网
雷峰网
博客园 - 聂微东
NISL@THU
NISL@THU
The Hacker News
The Hacker News
G
Google Developers Blog
F
Full Disclosure
博客园 - Franky
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
P
Privacy & Cybersecurity Law Blog
博客园 - 叶小钗
酷 壳 – CoolShell
酷 壳 – CoolShell
T
The Blog of Author Tim Ferriss
Security Latest
Security Latest
T
Tenable Blog
Know Your Adversary
Know Your Adversary
Stack Overflow Blog
Stack Overflow Blog
K
Kaspersky official blog
Blog — PlanetScale
Blog — PlanetScale
博客园 - 司徒正美
C
Cybersecurity and Infrastructure Security Agency CISA
Martin Fowler
Martin Fowler
Schneier on Security
Schneier on Security

博客园 - wuty007

C# 范围运算符 C# 调用WGC 实现桌面屏幕的捕获 完善基于WPF开发的标尺控件(含实例代码) C# 依赖注入 Microsoft.Extensions.DependencyInjection 实现 控制反转(IOC) C# 获取Windows系统的设备名称 记录 Windows系统开启hyper-v ,部分端口被保留,导致端口不能使用而报错的问题 WPF 调用 Win32的SetWindowDisplayAffinity 函数 实现捕获屏幕时,过滤指定的窗口 记录WPF 在清单列表设置了UIACESS为true,没有签名的报错“从服务器返回了一个参照” WPF 的ListBox 去除默认的Item项的 鼠标hover的背景颜色 WPF 调用 ChangeWindowMessageFilterEx 修改指定窗口 (UIPI) 消息筛选器的用户界面特权隔离 记录一下 WPF进程 SendMessage 发送窗口消息进行进程间通信,存在进程权限无法接受消息的问题 记录 使用PsExec启动System权限的WPF 程序 记录 命令行的 findstr 的使用 排查Windows 下的内存使用率过高,但是任务管理器看不到进程 指定应用 在 控制面板或者 设置的安装应用 置灰或隐藏卸载按钮 WPF 通过RawInput 获取 系统全局触摸事件 C# 定时任务 Quartz.NET 的使用 记录一下Windows系统下的命令行参数的字符个数限制 WPF 实现支持动态调整高度的文本显示控件
Everything 支持 多实例 运行
wuty007 · 2025-08-29 · via 博客园 - wuty007

出现的问题

我们项目组做了一个AI助手,调用了everything.exe 和 es.exe 实现了文件搜索的功能。但是在发布灰度使用的,好多用户反馈只要用了AI助手的文件搜索后,本机安装的everything的程序就调用不出来了。具体的现象如下图,点击桌面的Everything就不会显示弹出搜索界面了

image

排查问题

查阅了Everything官方网站,是支持多实例运行的:Multiple Instances - voidtools

Everything 默认只能运行一个实例。

当运行 Everything.exe 时,它会检测已存在的实例。如果发现已存在实例,那么命令行选项将会发送并由已存在实例执行。如果未发现已存在实例,则创建一个新实例。

以多实例运行 Everything,使用命名实例

命名实例

Everything 默认使用未命名实例。

指定一个唯一的名称给 Everything 实例以使用多实例。

每个实例只能有一个单独的实例名称。

指定名称给实例:

启动 Everything.exe 时,使用 -instance 命令行选项以指定实例名称。

例如:

Everything.exe -instance "ETP Server"

命名实例使用单独的设置和数据。

例如:命名实例 "ETP Server" 将使用 Everything-ETP SERVER.ini 作为设置文件。

实例名称位于 Everything 搜索窗口标题栏和鼠标悬浮于托盘图标时工具提示。

服务

Everything 默认为每个实例安装一个服务。

为所有实例使用相同服务,使用 -service-pipe-name 命令行选项或 service_pipe_name ini 选项以指定相同服务管道名。

默认未命名管道名为:

\\\\.\\PIPE\\Everything Service

例如:用补个不同的实例名连接默认服务管道:

Everything.exe -instance "ETP Server" -service-pipe-name "\\\\.\\PIPE\\Everything Service"

检查代码,虽然我们在程序内部内置了Everything.exe 和 es.exe,用于防止用户没有安装Everything的情况,但是我们程序启动,都是直接启动的Everything.exe,也就是默认的默认的实例。这样的启动方式,会触发只能运行单一的默认一个实例。

而我们点击桌面的Everything.exe,也是运行默认的实例,所以会出现启动不了桌面点击的Everything应用

     /// <summary>
     /// 启动Everything
     /// </summary>
     public async Task StartEverythingAsync()
     {
         string processName = "Everything";
         Process[] processes = Process.GetProcessesByName(processName);
         if (processes.Length >= 2) return;

         var currentDomainBaseDirectory = AppDomain.CurrentDomain.BaseDirectory;
         _logger.Info($"调用{processName} ,路径:{currentDomainBaseDirectory}");
         StartProcess(processName, currentDomainBaseDirectory);
         await Task.Delay(100);
     }

解决方案:

1、Ai助手启动Everything,通过指定 instance 名称的方式启动。

  /// <summary>
  /// 启动Everything
  /// </summary>
  public async Task StartEverythingAsync()
  {
      string processName = "Everything";
      Process[] processes = Process.GetProcessesByName(processName);
      if (processes.Length >= 2) return;

      var currentDomainBaseDirectory = AppDomain.CurrentDomain.BaseDirectory;
      _logger.Info($"调用{processName} ,空间路径:{currentDomainBaseDirectory}");
      var args = "-instance \"WUTY\"";
      StartProcess(processName, currentDomainBaseDirectory, args);
      await Task.Delay(100);
  }

2、为了避免在启动弹出UAC的管理员权限的弹窗,需要在服务端,执行注册Everything的实例脚本:localReachServiceInstall.bat

cd /d %~dp0
Everything.exe -instance "WUTY" -uninstall-service 
Everything.exe -instance "WUTY" -install-service
sc failure Everything reset= 30 actions= restart/5000 >>InstallLog.txt
exit

3、配套的es查询也需要指定 instance  查询

  /// <summary>
  /// 搜索文件
  /// <returns>返回路径</returns>
  /// </summary>
  private async Task<string> SearchFileAsync(string content)
  {
      await StartEverythingAsync();
      string cmd = $"es.exe -instance \"WUTY\" {content}";
      var currentDomainBaseDirectory = AppDomain.CurrentDomain.BaseDirectory;
      _logger.Info($"调用{cmd} ,路径:{currentDomainBaseDirectory}");

      return await RunCmdAsync(cmd, currentDomainBaseDirectory);
  }

 效果如下图:

img_v3_02pk_013f372e-75c6-4967-99da-883c22afaceg