1

因此,我编写了一个在 Windows7/8/Vista/XP 上系统启动时运行的 python 应用程序。第一次运行时,我希望它将一些文件类型/扩展名与系统上的某个程序相关联。目前,我是这样完成的:

import win32com.shell.shell as shell

def runAssoc():
    shell.ShellExecuteEx(
    lpVerb="runas",
    lpFile='c:\\Users\\myUser\\assoc.bat')

问题是,当从启动时运行时,这有时无法正常工作。我在这里读过它ShellExecuteEx不会将它的错误输出到调用进程,所以我看不出有什么松动,并且还阅读了那里lpVerb="runas"给出的文章,这些文章通常被认为是一种不好的做法。

我的 assoc.bat 需要管理员批准,因为它的编写方式如下:

assoc .txt=myNotepad
assoc .hello=myNotepad
ftype myNotepad="C:\Windows\system32\notepad.exe" "%%1"

(在这里,我将 Windows 附带的 Microsoft 记事本与“txt”和“hello”扩展名相关联。这当然没有意义,但却是一个很好的例子。)

我了解 Windows 不提供命令行工具,允许我们将文件扩展名与仅适用于当前用户的程序相关联(这对于我想要实现的目标来说很好)。
在本文中,我阅读assoc了 Windows 安装中每个用户帐户使用的注册表区域的效果,而不是HKEY_CURRENT_USER可以在没有管理员权限的情况下写入该区域。

我在这里阅读了另一个答案,建议检查sys.argv[-1] != "asadmin",但sys.argv每次我的应用程序运行时似乎都是一个空数组。

1) 我可以确保ShellExecuteEx在需要时运行并提示管理员权限吗?

2)也许有一种方法可以创建一个批处理文件,将这些扩展名仅与当前用户相关联?比,我不需要使用'runas'参数,这应该是错误的来源。

一点旁注:实际上我是动态地“以编程方式”构建这个批处理文件,但这里没有讨论,因为它与问题没有真正的关系。

4

1 回答 1

1

可能最简单的做法是制作一个 .reg 文件并执行,您可以直接在 reg 文件中写入所需的注册表项。例如:

Windows Registry Editor Version 5.00

[HKEY_CURRENT_USER\Software\Classes\.hello]
@="txtfile"

您显然也可以制作 myNotepad 类型。您可以关联然后使用regedit制作 reg 文件(选择密钥和 rmb + 导出)如果您使用以下命令,您可以告诉 window 静默安装 reg:

regedit -s your_reistration_file.reg

现在您可以使用 ShellExecuteEx 调用上面的行。请注意,用户可能无权使用 reg 文件编辑注册表。

您也可以直接在 python 中编辑注册表,这是上面的示例,请参阅 winreg 文档以获取更多信息:

import _winreg #just winreg in Python 3

key = _winreg.OpenKey(
    _winreg.HKEY_CURRENT_USER,
    r"Software\Classes"
    )

hello = _winreg.CreateKeyEx(key, ".hello")
_winreg.SetValue(hello, '', _winreg.REG_SZ, 'txtfile')
于 2013-07-03T22:04:03.400 回答