Windows Shell Folder

Windows系统
544
0
0
2022-03-06

什么是 Windows Shell

Windows Shell 是 Windows 操作系统的用户界面。具体地说,用户在登录后看到的桌面、开始菜单、任务栏,以及打开资源管理器看到的操作界面都属于 Windows Shell 的一部分。Windows Shell 实现了一套树形组织结构,称作 Shell Namespace。它包含两种基础对象,即「文件」和「文件夹」, 「桌面」是 Shell Namespace 的根对象。

文件夹是 Shell Namespace 树中的节点和容器,它可以包含子文件夹对象和文件对象。Shell Namespace 中的对象可以表示文件系统对象,也可以是虚拟对象,例如,控制面板、回收站、我的电脑(此电脑)、桌面、网络等对象。这些特殊的虚拟文件夹称作 Shell Folder。

Shell Folder

Windows 除了系统自带的 Shell Folder 外,还可以通过安装 Shell 扩展实现第三方自定义的 Shell Folder。比如,系统安装某些网盘软件后,会在「桌面」或「我的电脑」中添加网盘的 Shell Folder。

可以在下列注册表位置查看系统中的 Shell Folder:

  • HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders
  • HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders
  • HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders

或者通过工具 ShellExView 来查看:

ShellExView

Windows 系统中每个 Shell Folder 都在注册表中对应形如 HKEY_CLASSES_ROOT\CLSID\{CLSID}\ShellFolder 的项。其中 {CLSID} 即为该 Shell Folder 的 CLSID 值。比如 One Drive 的 Shell Folder 对应的注册表项为 HKEY_CLASSES_ROOT\CLSID\{018D5C66-4533-4307-9B53-224DE2ED1FE6}\ShellFolder

Directory 和 Folder 的区别

Directory 和 Folder 是 Windows Shell 中两个比较容易混淆的术语。一般将前者翻译为「目录」,将后者翻译为「文件夹」。两者在注册表中的 ProgID 分别对应 HKEY_CLASSES_ROOT\Directory 和 HKEY_CLASSES_ROOT\Folder。Directory 对应于文件系统中的除磁盘根目录以外的路径(磁盘对应的 ProgID 为 HKEY_CLASSES_ROOT\Drive);而 Folder 则表示所有的 Shell Folder。

Shell Folder 挂载位置

Shell Folder 一般会挂载于某个 Shell Namespace 下,比如,桌面、控制面板、我的电脑等。可以通过修改注册表,将 Shell Folder 从这些地方移除。下面列出部分 Shell Folder 挂载点。特别地,对于注册表 HKEY_CURRENT_USER 分支下的项目,一般都会对应 HKEY_LOCAL_MACHINE 分支下相同路径的版本。

我的电脑

即 Win 10 系统上的「此电脑」。对应注册表路径:

  • HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\MyComputer\NameSpace\{CLSID}
  • HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\MyComputer\NameSpace\{CLSID}
  • HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Explorer\MyComputer\NameSpace\{CLSID}

系统默认自带的 Shell Folder 保存在 HKLM 对应的分支下,Wow6432Node 分支是针对 32 位系统的。「此电脑」挂载的 Shell Folder 主要有:

  • 下载:{088e3905-0323-4b02-9826-5d99428e115f}
  • 图片:{24ad3ad4-a569-4530-98e1-ab02f9417aa8}
  • 音乐:{3dfdf296-dbec-4fb4-81d1-6a3438bcf4de}
  • 桌面:{B4BFCC3A-DB2C-424C-B029-7FE99A87C641}
  • 文档:{d3162b92-9365-467a-956b-92703aca08af}
  • 视频:{f86fa3ab-70d2-4fc7-9c99-fcbf05467f3a}
  • 3D 对象:{0DB7E03F-FC29-4DC6-9020-FF41B59E513A}

如果我们要从「此电脑」中移除 Shell Folder,只要将对应的注册表项删除或重命名即可。例如,从「此电脑」中移除「3D 对象」,将 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\MyComputer\NameSpace\{0DB7E03F-FC29-4DC6-9020-FF41B59E513A} 删除,或重命名为 {0DB7E03F-FC29-4DC6-9020-FF41B59E513A}.disabled 皆可。

桌面

此处的「桌面」是指 Windows Shell 的根节点,和通过「此电脑」访问到的「桌面」文件夹并不相同。在 Win 10 系统上,资源管理器的左侧导航窗格中默认不显示此「桌面」,可以在菜单「查看」-「导航窗格」下拉菜单中勾选「显示所有文件夹」,来显示此「桌面」。

对应注册表路径为:

  • HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Desktop\NameSpace\{CLSID}
  • HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Desktop\NameSpace\{CLSID}
  • HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Explorer\Desktop\NameSpace\{CLSID}

控制面板

对应注册表路径 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\ContorlPanel\NameSpace\{CLSID}

快速访问

在 Win 10 中,「快速访问」是打开资源管理器默认显示的 Shell Folder。在该界面下会展示「常用文件夹」和「最近使用的文件」两组列表。可以修改注册表禁用该项功能。

快速访问

注册表路径 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\HomeFolderDesktop\NameSpace\DelegateFolders,将该路径下的 {3134ef9c-6b18-4996-ad04-ed5912e00eb5} 和 {3936E9E4-D92C-4EEE-A85A-BC16D5EA0819} 删除即可。

为了便于日后恢复,建议采用重命名的方式。可以将 {3134ef9c-6b18-4996-ad04-ed5912e00eb5} 和 {3936E9E4-D92C-4EEE-A85A-BC16D5EA0819} 改名为 {3134ef9c-6b18-4996-ad04-ed5912e00eb5}.disabled 和 {3936E9E4-D92C-4EEE-A85A-BC16D5EA0819}.disabled。想要恢复功能,将项目名称后的 .disabled 后缀去除即可。

注册表

另外,可以修改注册表隐藏资源管理器导航窗格中的快速访问:在注册表分支 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer 下新建 DWORD 值,命名为 HubMode,值设为 1。

注册表

用户目录

即 %UserProfile% 路径。对应注册表路径 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\UsersFiles\NameSpace\{CLSID}

资源管理器导航窗格

以 One Drive 为例,其 Shell Folder 的 CLSID 为 {018D5C66-4533-4307-9B53-224DE2ED1FE6}。定位注册表路径 HKEY_CLASSES_ROOT\CLSID\{018D5C66-4533-4307-9B53-224DE2ED1FE6},将该项下的 System.IsPinnedToNameSpaceTree 键值改为 0 即可。

可以隐藏的 Shell Folder 有:

  • 库:{031E4825-7B94-4dc3-B131-E946B44C8DD5}
  • One Drive:{018D5C66-4533-4307-9B53-224DE2ED1FE6}

创建自定义 Shell Folder

可以使用 reg 命令操作注册表的方式,在 Shell Namespace 中创建自定义的 Shell Folder。

生成 Shell Folder 的 CLSID

创建 Shell Folder 前首先需要一个 GUID 作为 CLSID。可以通过以下几种方式来生成:

  1. 在线工具
  2. Windows SDK 自带的 uuidgen.exe 命令
  3. VisualStudio 自带的 guidgen.exe 工具

假设生成的 CLSID 为 {0672A6D1-A6E0-40FE-AB16-F25BADC6D9E3}

定义 Shell Folder 名称

假设要创建的 Shell Folder 名称是 我的文件夹

reg add HKCU\Software\Classes\CLSID\{0672A6D1-A6E0-40FE-AB16-F25BADC6D9E3} /ve /t REG_SZ /d "我的文件夹" /f

定义 Shell Folder 图标

需要提供 Shell Folder 的图标,可以是 .ico 图标,也可以是可执行文件中的图标资源。这里使用系统的 imageres.dll 中的图标:

reg add HKCU\Software\Classes\CLSID\{0672A6D1-A6E0-40FE-AB16-F25BADC6D9E3}\DefaultIcon /ve /t REG_EXPAND_SZ /d "%SystemRoot%\system32\imageres.dll,-123" /f

在资源管理器的导航窗格中显示

reg add HKCU\Software\Classes\CLSID\{0672A6D1-A6E0-40FE-AB16-F25BADC6D9E3} /v System.IsPinnedToNameSpaceTree /t REG_DWORD /d 0x1 /f

0x1 表示显示,0 表示不显示。

定义排序位置

reg add HKCU\Software\Classes\CLSID\{0672A6D1-A6E0-40FE-AB16-F25BADC6D9E3} /v SortOrderIndex /t REG_DWORD /d 0x42 /f

设置的 SortOrderIndex 值越大,排位越靠后。

在「此电脑」文件夹一栏中显示

reg add HKCU\Software\Classes\CLSID\{0672A6D1-A6E0-40FE-AB16-F25BADC6D9E3} /v DescriptionID /t REG_DWORD /d 0x03 /f

如果不添加该键值,默认显示在「设备和驱动器」一栏。

设置杂项

reg add HKCU\Software\Classes\CLSID\{0672A6D1-A6E0-40FE-AB16-F25BADC6D9E3}\InProcServer32 /ve /t REG_EXPAND_SZ /d "%systemroot%\system32\shell32.dll" /f
reg add HKCU\Software\Classes\CLSID\{0672A6D1-A6E0-40FE-AB16-F25BADC6D9E3}\Instance /v CLSID /t REG_SZ /d {0E5AAE11-A475-4c5b-AB00-C66DE400274E} /f
reg add HKCU\Software\Classes\CLSID\{0672A6D1-A6E0-40FE-AB16-F25BADC6D9E3}\Instance\InitPropertyBag /v Attributes /t REG_DWORD /d 0x11 /f
reg add HKCU\Software\Classes\CLSID\{0672A6D1-A6E0-40FE-AB16-F25BADC6D9E3}\ShellFolder /v FolderValueFlags /t REG_DWORD /d 0x28 /f
reg add HKCU\Software\Classes\CLSID\{0672A6D1-A6E0-40FE-AB16-F25BADC6D9E3}\ShellFolder /v Attributes /t REG_DWORD /d 0xF080004D /f

设置文件夹映射路径

reg add HKCU\Software\Classes\CLSID\{0672A6D1-A6E0-40FE-AB16-F25BADC6D9E3}\Instance\InitPropertyBag /v TargetFolderPath /t REG_EXPAND_SZ /d "%USERPROFILE%" /f

此处将文件夹路径映射到 %USERPROFILE%,可以改成其他路径。

添加到「桌面」

reg add HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\Desktop\NameSpace\{0672A6D1-A6E0-40FE-AB16-F25BADC6D9E3} /ve /t REG_SZ /d "我的文件夹" /f

添加到「此电脑」

reg add HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\MyComputer\NameSpace\{0672A6D1-A6E0-40FE-AB16-F25BADC6D9E3} /ve /t REG_SZ /d "我的文件夹" /f

访问 Shell Folder

通常,用户只能通过 Shell Folder 挂载的 Shell Namespace 来访问它们。不过还有其他方式能直接访问 Shell Folder。

Shell Folder Shortcut

在 Windows Shell 中可以通过 Shell Folder Shortcut 来访问 Shell Folder。Shell Folder Shortcut 的格式为 shell:[FolderName],其中 [FolderName] 是 Shell Folder 的 Shortcut 名称。比如系统「发送到」文件夹的 Shell Folder Shortcut 为 shell:SendTo

可以通过以下几种方式运行 Shell Folder Shortcut(以 shell:SendTo 为例):

  1. Win+R 运行 shell:SendTo
  2. 命令行运行 explorer shell:SendTo
  3. 新建快捷方式 %windir%\explorer.exe shell:SendTo
  4. 资源管理器地址栏输入 shell:SendTo

在注册表路径 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\FolderDescriptions 下保存着所有的 Shell Folder 的 CLSID。每个 CLSID 项下的 Name 键就是该 Shell Folder 的 Shortcut 名称。不过要注意的是,并非所有该路径下的项目都可以通过 Shell Folder Shortcut 来访问,某些项的路径并不存在。

注册表

此外,对于包含 ParsingName 键的项,还能通过 shell:[ParsingName] 的格式来访问 Shell Folder。例如上图中 MyComputerFolder 文件夹的 ParsingName 为 ::{20D04FE0-3AEA-1069-A2D8-08002B30309D},那么 shell:MyComputerFolder 等同于 shell:::{20D04FE0-3AEA-1069-A2D8-08002B30309D}

特殊命名的文件夹

新建一个文件夹,并将其重命名为 此电脑.{20D04FE0-3AEA-1069-A2D8-08002B30309D} 格式,就可以在当前路径下创建「此电脑」的快捷方式。这种方式并非对所有的 Shell Folder 都有效,还是取决于 Shell Folder 的属性。

下面是一些常用的 Shell Folder 命名:

  • 此电脑.{20D04FE0-3AEA-1069-A2D8-08002B30309D}
  • 完全控制面板.{ED7BA470-8E54-465E-825C-99712043E01C} (又名「上帝模式」)
  • 网上邻居.{208D2C60-3AEA-1069-A2D7-08002B30309D}
  • 库.{031E4825-7B94-4dc3-B131-E946B44C8DD5}
  • 当前用户.{59031a47-3f72-44a7-89c5-5595fe6b30ee}
  • 搜索结果.{9343812e-1c37-4a49-a12e-4b2d810d956b}
  • 家庭组.{B4FB3F98-C1EA-428d-A78A-D1F5659CBA93}
  • 网络.{F02C1A0D-BE21-4350-88B0-7367FC96EF3C}
  • 本地图片.{24ad3ad4-a569-4530-98e1-ab02f9417aa8}
  • 我的图片.{3ADD1653-EB32-4CB0-BBD7-DFA0ABB5ACCA}
  • 本地视频.{f86fa3ab-70d2-4fc7-9c99-fcbf05467f3a}
  • 我的视频.{A0953C92-50DC-43BF-BE83-3742FED03C9C}
  • 本地音乐.{3dfdf296-dbec-4fb4-81d1-6a3438bcf4de}
  • 我的音乐.{1CF1260C-4DD0-4EBB-811F-33C572699FDE}
  • 本地文档.{d3162b92-9365-467a-956b-92703aca08af}
  • 我的文档.{A8CDFF1C-4878-43be-B5FD-F8091C1C60D0}
  • 此设备.{f8278c54-a712-415b-b593-b77a2be0dda9}
  • 应用.{4234d49b-0245-4df3-b780-3893943456e1}
  • 下载.{374DE290-123F-4565-9164-39C4925E467B}
  • 桌面.{B4BFCC3A-DB2C-424C-B029-7FE99A87C641}
  • 打印机.{2227A280-3AEA-1069-A2DE-08002B30309D}
  • 本地下载.{088e3905-0323-4b02-9826-5d99428e115f}
  • OneDrive.{018D5C66-4533-4307-9B53-224DE2ED1FE6}
  • 安装新程序.{15eae92e-f17a-4431-9f28-805e482dafd4}
  • 卸载程序.{7b81be6a-ce2b-4676-a29e-eb907a5126c5}
  • 网络连接.{992CFFA0-F557-101A-88EC-00DD010CCC48}
  • 回收站.{645FF040-5081-101B-9F08-00AA002F954E}
  • 历史.{ff393560-c2a7-11cf-bff4-444553540000}
  • 管理工具.{d20ea4e1-3957-11d2-a40b-0c5020524153}

早年间,这种方法被当作用来隐藏私密文件的技巧。首先将要隐藏的私密文件存入一个新建文件夹,然后把新建文件夹重命名为上述格式。这样一来,其他用户就无法在资源管理器中访问到该文件夹下的文件了。但是这种隐藏文件的方法对没有使用 Windows Shell 接口的第三方文件管理器或者命令行无效。