Windows 7文件扩展名关联

时间:2010-09-01 17:49:18

标签: windows-7 file-association

我指的是Windows 7。

我的代码将某个扩展名与我的应用程序相关联,如webJose在下一页中提出的: What registry keys are responsible for file extension association? (但是我按照建议正确写入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但不能以编程方式实现)
  3. 我的问题是:有没有办法以编程方式实现这一目标?在与另一个程序关联后,可以更改哪些注册表值以重新获得对扩展的控制?

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

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

4 个答案:

答案 0 :(得分:4)

删除UserChoice应将默认程序恢复为标准文件关联键(以HKCU中的ProgID开头)。除非你也可以删除OpenWithList,这将会带来极端的偏见。

修改 在MSDN上查看Registry Key Security and Access Rights,尤其是RegSetKeySecurity功能。请记住,在删除密钥之前,您需要授予自己对密钥的管理控制权。

答案 1 :(得分:2)

关于Window 7中的文件关联,一个新的“问题”已经过了。

这就是其中之一:你要争取自己的权利。

假设你想跑

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

你会得到ACCESS DENYED。 当您在Regedit'UserChoice'中检查密钥的安全设置时,您将看到为您设置了一个设置窗口,拒绝为当前用户设置'set'。那你可以在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 +包含just和空键的Registry hive文件。 在 Regedit 中,它只相当于一个空的注册表结构文件的导入'(注意:这是一个配置单元文件而不是* .reg文件)。

答案 2 :(得分:0)

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

REG DELETE HKCR\Applications\*.exe /f

这可能有点hack,但是对我有用。

答案 3 :(得分: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

P.S .:感谢@ SecurityAndPrivacyGuru 用于sharing the SID detection command