1. ホーム
  2. python

[解決済み] PythonスクリプトからUACの昇格を要求する?

2022-10-18 23:10:13

質問

PythonスクリプトをVistaでファイルコピーしたい。通常の cmd.exe ウィンドウから実行すると、エラーは発生しませんが、ファイルはコピーされません。もし私が cmd.exe を実行し、スクリプトを実行すると、正常に動作します。

ユーザー アカウント制御 (UAC) は通常、多くのファイル システムの動作を阻止するため、これは理にかなっています。

Python スクリプト内から UAC 昇格要求 (「このようなアプリには管理者権限が必要です。よろしいですか? " 」のようなダイアログ) を呼び出す方法はありますか?

それが不可能な場合、私のスクリプトが少なくとも昇格されていないことを検出し、優雅に失敗することができる方法はありますか?

どのように解決するのですか?

2017年現在、簡単に実現できる方法として、以下のようなものがあります。

import ctypes, sys

def is_admin():
    try:
        return ctypes.windll.shell32.IsUserAnAdmin()
    except:
        return False

if is_admin():
    # Code of your program here
else:
    # Re-run the program with admin rights
    ctypes.windll.shell32.ShellExecuteW(None, "runas", sys.executable, " ".join(sys.argv), None, 1)

Python 2.xを使用している場合、最後の行を次のように置き換えます。

ctypes.windll.shell32.ShellExecuteW(None, u"runas", unicode(sys.executable), unicode(" ".join(sys.argv)), None, 1)

また、Pythonスクリプトを実行ファイルに変換した場合(以下のようなツールを使って) py2exe , cx_freeze , pyinstaller ) の場合は sys.argv[1:] の代わりに sys.argv を第4パラメータで指定します。

ここでの利点はいくつかあります。

  • 外部ライブラリは不要です。使用するのは ctypessys を標準ライブラリから取得します。
  • Python 2 と Python 3 の両方で動作します。
  • ファイルリソースの変更、マニフェストファイルの作成は不要です。
  • if/else文の下にコードを追加しなければ、コードが二度実行されることはありません。
  • 最終行でAPI呼び出しの戻り値を取得し、失敗した場合(code <= 32)にアクションを起こすことができます。返り値の可能性を確認する はこちら .
  • 第6パラメータを変更することで、生成されたプロセスの表示方法を変更することができます。

基礎となる ShellExecute 呼び出しのドキュメントは です。 .