【问题标题】:Determine which Explorer.exe on Task List is really the shell?确定任务列表中的哪个 Explorer.exe 是真正的 shell?
【发布时间】:2010-06-18 18:35:45
【问题描述】:

HKEY_LOCAL_MACHINE, "SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon", "Shell" 返回 shell 名称,通常是 Explorer.exe。但是,它不包含路径,也不标识特定的可执行文件。

枚举任务列表找到任务 Explorer.exe。

但是如果用户运行了另一个名为 Explorer.exe 的不相关任务呢?

确定 Explorer.exe 的特定实例实际上是 shell 的最佳方法是什么?

我需要避免混淆作为外壳的任务和可能不是外壳但共享相同名称的任务,即 Explorer.exe

【问题讨论】:

  • 我不确定这是一个可靠的答案,但您通常会选择 PID 最低的 explorer.exe 实例(因为它比其他实例先启动)。我可以看到在 PID 可能开始回收的长时间运行的系统上,这将是一个问题。
  • @Coding Gorilla:这在多用户环境中失败了。

标签: c# c++ shell process explorer


【解决方案1】:

您可以使用Process Explorer 获取有关该过程的更多详细信息。您将能够通过在每个资源管理器进程下运行的程序、资源管理器进程文件的位置以及其他一些事情来判断。

【讨论】:

  • 谢谢,但我需要以编程方式执行此操作(我有 C++ 本机或 .NET),以识别系统上所有会话中的 Explorer.exe(或任何 shell 名称)的所有实例Shell 的实际实例。
  • 您仍然可以查看可执行文件运行的位置等问题以找到答案。考虑添加特定的语言标签或澄清您的问题。
  • 当然可以找到可执行文件的路径。但是如何判断该可执行文件是否是外壳程序?据我所知,Windows 会查看其路径列表以尝试查找 Explorer.exe,因为注册表中未指定路径。但要猜测哪个 exe Windows可能用于 shell 似乎还有很长的路要走。
  • 检查诸如开始栏或当前打开的导出器窗口之类的进程 ID??
  • 谢谢,但是……如果盒子上有多个登录用户,就会有多个启动栏和资源管理器窗口
【解决方案2】:

也许您可以使用命令行实用程序任务列表,如下所示:

tasklist /FI "imagename eq explorer.exe" /FI "session eq 1" /FI "sessionname eq Console"

【讨论】:

    【解决方案3】:

    不要找Explorer.exe,找shell的全路径,应该是C:\Windows\Explorer.exe

    【讨论】:

    • 问题是注册表中的Shell条目(见OP顶部)只包含Explorer.exe
    • @BillyG:使用 PATH 环境变量解析完整位置。您可以自己解析正确的位置(例如,使用 PathFindOnPath 函数)。您也可以只使用 %WINDIR%\Explorer.exe,因为很少有人会完全替换 shell。
    【解决方案4】:

    我认为没有万无一失的方法;你能做的最好的就是模仿CreateProcess 所做的事情:

    如果文件名中不包含目录路径,则系统按以下顺序查找可执行文件:

    1. 加载应用程序的目录。
    2. 父进程的当前目录。
    3. 32 位 Windows 系统目录。使用 GetSystemDirectory 函数获取该目录的路径。
    4. 16 位 Windows 系统目录。没有获取这个目录的路径的函数,但是被搜索了。此目录的名称是 System。
    5. Windows 目录。使用 GetWindowsDirectory 函数获取该目录的路径。
    6. PATH 环境变量中列出的目录。

    【讨论】:

      猜你喜欢
      • 2023-03-23
      • 2019-06-19
      • 1970-01-01
      • 1970-01-01
      • 2020-01-25
      • 1970-01-01
      • 2016-05-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多