Windows 7文件扩展名关联

9
我特指的是Windows 7操作系统。我有一段代码,可以将某个扩展名与我的应用程序关联起来,正如网页上Jose所提出的那样: 哪些注册表键负责文件扩展名相关联? (但我正确地将其写到了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
删除UserChoice应该将默认程序恢复为标准文件关联键(从HKCU中的ProgID开始)。如果无法实现,则可以删除OpenWithList,这将采用极端手段进行还原。
编辑: 请参阅MSDN上的注册表键安全性和访问权限,特别是RegSetKeySecurity函数。请记住,在删除之前,您需要授予自己对该键的管理控制权。

无论如何编程,甚至使用管理员权限,您都无法以编程方式删除密钥。这就是我上面提出问题的原因,我该如何删除它? - Tamer
这是您系统的特殊情况,不属于Windows标准。您安装的某些软件更改了密钥上的acl以防止您更改它...很可能是注册在UserChoice下的任何东西。但是您应该能够授予自己访问权限,然后删除它。 - Factor Mystic
请问您能确认一下吗?我已经在几台以管理员身份运行应用程序的机器上尝试过了。对于特定的键"UserChoice",程序访问被拒绝(无法写入或删除)。您是说您可以在自己的机器上通过编程方式编辑此键的值吗?有人能否确认一下这一点? - Tamer
在更改权限之前,尝试获取该密钥的所有权。如果它归属于SYSTEM,则如果您首先未被授予权限,则无法更改权限。获取所有权将解决此问题。 - BillP3rd
成功接管密钥。我使用以下链接中的代码:http://www.tomshardware.com/forum/170289-46-programmatically-inheritable-permissions,具体地是函数:BOOL setPermissionsExample1()。 - Tamer

2

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

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

假设您想要运行

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

您将收到“访问被拒绝”的提示。当您检查Regedit中“UserChoice”密钥的安全设置时,您会发现Windows为您设置了一个设置,以拒绝当前用户的“设置”。好吧,您可以在regedit中更改/删除此设置,现在可以删除UserChoice。但是对于程序员/脚本编写者来说,该设置有点棘手,因为没有真正的工具可以在注册表中设置ACL。但是,在这里,我们提供一些解决方法,可以允许删除带有“访问被拒绝”的密钥(当然,只有在您有权限更改权限的情况下才起作用):

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 命令和一个只包含空键的注册表文件。在 Regedit 中,这相当于导入一个只有空白注册表结构的文件(注意:这是一个 hive 文件而不是 *.reg 文件)。


0
我的解决方案不是尝试删除 UserChoice 键(只有管理员才能这样做),而是删除 ProgId 指向的键。如果用户过去做出了选择,ProgId 就会有一个类似于 Applications\*.exe 的值。非管理员可以批量删除该键:
REG DELETE HKCR\Applications\*.exe /f

这可能有点取巧,但对我很有效。


0

在 Windows 10 上,此命令无法工作:

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

解决方法是通过以 TrustedInstaller 身份运行一个BAT文件(使用NSudo、PowerRun等)来删除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

附言:感谢@SecurityAndPrivacyGuru分享 SID检测命令


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接