Windows 上の Python スクリプトで管理者権限を確認するクロスプラットフォームの方法はありますか?

StackOverflow https://stackoverflow.com/questions/1026431

  •  06-07-2019
  •  | 
  •  

質問

Python スクリプトが管理者権限で実行されていることを確認するクロスプラットフォームの方法はありますか?残念ながら、 os.getuid() は UNIX のみであり、Windows では使用できません。

役に立ちましたか?

解決

import ctypes, os
try:
 is_admin = os.getuid() == 0
except AttributeError:
 is_admin = ctypes.windll.shell32.IsUserAnAdmin() != 0

print is_admin

他のヒント

管理者権限が必要なものは何でも試してみて、失敗を確認してください。

これはいくつかの場合にのみ機能しますが、何をしようとしているのですか?

スクリプトがどのプラットフォームで実行されているかを確認したほうがよいでしょう ( sys.platform) そしてそれに基づいてテストを実行します。別のプラットフォーム固有のモジュールから一部の hasAdminRights 関数をインポートします。

Windows では、次のことを確認できます。 Windows\System32 を使用して書き込み可能です os.access, ただし、おそらく pywin32 を使用して、システムの実際の「Windows」フォルダー パスを取得しようとすることを忘れないでください。ハードコーディングしないでください。

管理者グループのメンバーシップ(ドメイン/ローカル/エンタープライズ)は一つのことです。

ブランケット特権を使用しないようにアプリケーションを調整し、詳細な権限を設定することは、特にアプリが対話的に使用されている場合に適したオプションです。

特定の名前付き特権(se_shutdown se_restoreなど)のテスト、ファイルの権利はより適切であり、診断が容易です。

承認済みの回答から作成したユーティリティ関数は次のとおりです。

import os
import ctypes

class AdminStateUnknownError(Exception):
    """Cannot determine whether the user is an admin."""
    pass


def is_user_admin():
    # type: () -> bool
    """Return True if user has admin privileges.

    Raises:
        AdminStateUnknownError if user privileges cannot be determined.
    """
    try:
        return os.getuid() == 0
    except AttributeError:
        pass
    try:
        return ctypes.windll.shell32.IsUserAnAdmin() == 1
    except AttributeError:
        raise AdminStateUnknownError
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top