そこで、Windows7/8/Vista/XP のシステム起動時に動作する Python アプリを作成しました。初めて実行するときに、いくつかのファイルタイプ/拡張子をシステム上の特定のプログラムに関連付けたいと思います。当分の間、私はこれを次のように達成します:
import win32com.shell.shell as shell
def runAssoc():
shell.ShellExecuteEx(
lpVerb="runas",
lpFile='c:\\Users\\myUser\\assoc.bat')
問題は、スタートアップから実行すると、これが機能しないことがあるということです。呼び出しプロセスにエラーを出力しないhereを読んだので、その端で何が緩んでいるのかわかりません。また、一般的に悪い習慣と見なされている記事も読んでいます。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」パラメーターを使用する必要はありません。
ちょっとした補足: 実際には、このバッチ ファイルを「プログラムで」その場でビルドしますが、この問題とは実際には関係がないため、ここでは説明しません。