Windows 7 Windows 7文件扩展名关联

Windows 7 Windows 7文件扩展名关联,windows-7,file-association,Windows 7,File Association,我指的是Windows7 我的代码将某个扩展与我的应用程序相关联,如webJose在下一页所建议的: (但是,我正确地向HKEY_当前用户\软件\类而不是建议的HKEY_类\根用户写入) 如果没有其他与扩展相关联的程序,则上述操作将在初始阶段起作用。但是,在使用Windows 7内置的“选择默认程序…”(在“打开方式”下的文件右键单击上下文菜单下找到)后,它会将扩展名与您选择的任何新程序重新关联 此时发生的情况是“HKEY\U CURRENT\U USER\Software\Microsoft\

我指的是Windows7

我的代码将某个扩展与我的应用程序相关联,如webJose在下一页所建议的: (但是,我正确地向HKEY_当前用户\软件\类而不是建议的HKEY_类\根用户写入)

如果没有其他与扩展相关联的程序,则上述操作将在初始阶段起作用。但是,在使用Windows 7内置的“选择默认程序…”(在“打开方式”下的文件右键单击上下文菜单下找到)后,它会将扩展名与您选择的任何新程序重新关联

此时发生的情况是“HKEY\U CURRENT\U USER\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\\UserChoice”被系统更改,因此新选择的程序将接管

运行上述代码以重新控制扩展将不起作用。恢复控制的唯一方法是:

  • 编辑UserChoice->Progid值,这是不允许的(既不以编程方式也不使用regedit.exe-拒绝访问)
  • 或者删除UserChoice值,并确保您的应用程序是\OpenWithList下MRUList值中的第一个(这可以使用regedit.exe实现,但不能通过编程实现)
  • 我的问题是:有没有一种方法可以通过编程实现这一点?在与另一个程序关联后,可以更改哪些注册表值以重新获得对扩展的控制

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


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

    删除
    UserChoice
    应该将默认程序恢复为标准文件关联密钥(以HKCU中的ProgID开始)。除此之外,您还可以删除
    OpenWithList
    ,这将带来极大的偏见

    编辑:
    查看MSDN,特别是函数。请记住,在删除密钥之前,您需要授予自己对密钥的管理控制权。

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

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

    假设你喜欢跑步

    REG.exe DELETE "HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.mov\UserChoice" /f /va
    
    你会被拒绝的。 检查Regedit“UserChoice”中键的安全设置时,会发现有一个为您创建的设置窗口,用于拒绝当前用户的“set”。您可以在regedit中更改/删除此设置,现在可以删除UserChoice。 然而,对于程序员/脚本编写者来说,这种设置有点麻烦,因为现在有真正的工具在注册表中设置ACL。但是,这里有一些解决方法,at允许删除具有访问权限的密钥(当然,这仅在您有权更改权限的情况下有效):

    ResetMovAssoc.cmd

    总而言之,这里的主要内容是REG RESTORE+注册表配置单元文件,其中包含just和empty键。
    Regedit中,这相当于使用一个空的注册表结构文件导入(注意:这是一个配置单元文件而不是*.reg文件)。

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

    REG DELETE HKCR\Applications\*.exe /f
    

    这可能有点像黑客,但对我有效。

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

    Reg.exe delete "HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.m4v" /f
    
    解决方案是通过在TrustedInstaller下运行BAT文件(使用NSudo、PowerRun等)来删除SID密钥:


    注意:感谢@SecurityAndPrivacyGurufor.

    您无法以任何方式以编程方式删除密钥,即使是管理员写入。这就是我提出上述问题的原因,我如何删除它?这是您系统的一个特点,而不是Windows标准。您安装的某些软件已更改密钥上的acl,以防止您更改它。。。可能是在UserChoice下注册的。但是,您应该能够授予自己访问权限,然后将其删除。您能确认这一点吗?我现在已经在以管理员身份运行该应用程序的多台计算机上尝试了这一点。以编程方式拒绝对特定键“UserChoice”的访问(既不写入也不删除)。你是说你可以通过编程在你的机器上编辑这个键的值吗?有人可以确认吗?请在更改权限之前尝试获取密钥的所有权。如果它是由系统拥有的,那么如果您首先未被授予权限,则无法更改权限。取得所有权将解决这个问题。取得钥匙的所有权是有效的。我在以下链接中使用代码:特别是函数:BOOL setPermissionsExample1()
    Reg.exe delete "HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.m4v" /f
    
    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