Windows 上の Python スクリプトで管理者権限を確認するクロスプラットフォームの方法はありますか?
-
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
所属していません StackOverflow