8

我特指Windows 7。

我有将某个扩展名与我的应用程序相关联的代码,如 webJose 在以下页面上提出的那样: 哪些注册表项负责文件扩展名关联? (但是我按照建议正确写入 HKEY_CURRENT_USER\Software\Classes 而不是 HKEY_CLASSES_ROOT)

上述方法最初有效,或者如果没有与扩展相关的其他程序。然而,在使用 Windows 7 内置的“选择默认程序...”(在“打开方式”下的文件右键单击上下文菜单下找到)后,它会将扩展名与您选择的任何新程序重新关联。

此时发生的情况是系统更改了“HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\\UserChoice”,因此新选择的程序会接管。

运行上面的代码,重新获得对扩展的控制是行不通的。重新获得控制权的唯一方法是:

  1. 编辑 UserChoice -> Progid 值,这是不允许的(既不以编程方式也不使用 regedit.exe - 拒绝访问)。
  2. 或者删除 UserChoice 值并确保您的应用程序是 \OpenWithList 下 MRUList 值中的第一个(这可以使用 regedit.exe 来实现,但不能以编程方式实现)

我的问题是:有没有办法以编程方式实现这一目标?在与另一个程序关联后,可以更改哪些注册表值以重新获得对扩展的控制?

我知道,如果用户通过资源管理器将关联的应用程序设置为扩展,那么它可能会以同样的方式再次将扩展重新关联到不同的应用程序,这似乎很明显。

然而问题是我的应用程序中有一个按钮,它使用上述代码检查与我的应用程序的扩展关联。不幸的是,在上述情况下,我的应用程序会显示一条消息,确认该扩展程序已成功关联,但未成功关联!那么有没有办法解决这个问题?

4

4 回答 4

4

删除UserChoice应将默认程序恢复为标准文件关联键(在 HKCU 中以 ProgID 开头)。除非您也可以 delete OpenWithList,否则这将带有极大的偏见。

编辑: 查看MSDN 上的注册表项安全和访问权限,特别是RegSetKeySecurity功能。请记住,您需要先授予自己对密钥的管理控制权,然后才能将其删除。

于 2010-09-02T01:36:14.950 回答
2

关于 Window 7 中的文件关联,出现了一个新的“问题”。

这是其中之一:您必须为自己的权利而战。

假设你喜欢跑步

REG.exe DELETE "HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.mov\UserChoice" /f /va

你会得到拒绝访问。当您检查 Regedit 'UserChoice' 中密钥的安全设置时,您会看到有一个为您制作的设置窗口,拒绝为当前用户“设置”。好吧,您可能会在 regedit 中更改/删除此设置,现在您可以删除 UserChoice。但是对于程序员/脚本编写者来说,这个设置有点讨厌,因为现在有真正的工具可以在注册表中设置 ACL。但是,这里有一些解决方法允许使用 ACCESS DENYED 删除密钥(当然,这仅在您有权更改权限的情况下才有效):

ResetMovAssoc.cmd

::create 'empty.hiv' 
REG ADD "HKCU\emptyKey" /f
REG SAVE "HKCU\emptyKey" empty.hiv /y
@REG DELETE "HKCU\emptyKey" /f >nul
::^-note you can add @[...] >nul to the other entries as well to run them quite

:: Delete Reg key by replacing it with an empty hiv
REG RESTORE "HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.mov" empty.hiv
del empty.hiv

总而言之,这里的主要内容是REG RESTORE + Registry 配置单元文件,其中只包含空键。在Regedit中,这相当于 Import',只有一个空的注册表结构文件(注意:这是一个 hive 文件而不是 *.reg 文件)。

于 2015-12-04T19:47:32.987 回答
0

我的解决方案不是尝试删除UserChoice密钥(只有管理员可以这样做),而是删除ProgId指向的密钥。如果用户在过去做出选择,则ProgId其值为Applications\*.exe. 非管理员可以批量删除密钥:

REG DELETE HKCR\Applications\*.exe /f

这可能有点小技巧,但对我有用。

于 2019-11-21T13:01:41.127 回答
0

同样在 Windows 10 上,此命令也不起作用:

Reg.exe delete "HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.m4v" /f

解决方案是通过在TrustedInstaller(使用 NSudo、PowerRun 等)下运行 BAT 文件来删除 SID 密钥:

for /f "delims=\ tokens=2" %%A in ('reg query hku ^| findstr /i "S-1-5-21-" ^| findstr /v /i "_Classes"') do set SID=%%A
Reg.exe delete "HKU\%SID%\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.m4v" /f

PS:感谢@SecurityAndPrivacyGuru分享SID 检测命令。

于 2020-09-12T11:59:21.277 回答