実行中にスクリプトの管理者権限を確認するにはどうすればよいですか?
3 に答える
きめ細かな権限制御が行われている現在、「管理者権限」の概念を定義するのは難しくなっています。「従来の」アクセス制御モデルを使用して unix で実行している場合、有効なユーザー ID (os モジュールで利用可能) を取得し、それをルート (0) に対してチェックすることが、探しているものになる可能性があります。システム上のファイルにアクセスするには、スクリプトに必要な権限が必要であることがわかっている場合は、os.access() を使用して十分な権限があるかどうかを確認できます。
残念ながら、簡単でポータブルな方法はありません。使用されているセキュリティ モデルを見つけて定義する必要があります。また、権限のクエリと設定に使用できるシステム提供の API を特定し、API へのアクセスに使用できる適切な Python モジュールを見つける (または自分で実装する) 必要があります。
古典的な質問ですが、なぜ調べる必要があるのでしょうか? スクリプトが必要なことを実行しようとして、「ただ」失敗をキャッチして適切に処理した場合はどうなるでしょうか。
Unix では、 os.getuid関数を使用して root であるかどうかを確認できます。
os.getuid() == 0 and "root" or "not root"
管理者権限が必要な特定のファイルにアクセスできるかどうかを確認したいだけの場合は、次のようにして確認することをお勧めします。
import os
print os.access("/path/to/file", os.W_OK)
#replace W_OK with R_OK to test for read permissions
一方、ユーザーが管理者アカウントであるかどうかを本当に知る必要がある場合は、Windows 2000 以降で次のコードを使用することもできます。
import ctypes
print ctypes.windll.shell32.IsUserAnAdmin()
したがって、ユーザーが管理者であるかどうかを確認するクロスプラットフォームのより良い方法は次のとおりです。
import ctypes, os
try:
is_admin = os.getuid() == 0
except:
is_admin = ctypes.windll.shell32.IsUserAnAdmin()
print is_admin
もちろん、このメソッドは、ユーザーがUnix のrootであるか、Windows の Administrators グループのメンバーであるかのみを検出します。ただし、私の意見では、これでほとんどの目的には十分です。
また、これは 2000 未満の Windows バージョンと Windows ME では失敗することに注意してください。これは、Windows の DOS ベースのバージョンであり、アクセス許可の概念がないためです。