2009-06-22 88 views
13

有沒有跨平臺的方法來檢查我的Python腳本是否以管理員權限執行?不幸的是,os.getuid()僅適用於UNIX,在Windows下不可用。在Windows下的Python腳本中檢查管理權限的跨平臺方法?

+1

我是一個Linux程序員。什麼是「管理權限」?這是一個許可? – 2009-06-22 10:46:04

+0

root權限,等於「sudo something」 – grigoryvp 2009-06-22 10:52:32

+1

聽起來不像「管理權限」這個概念是跨平臺的話。沒有微不足道的平行線。 – 2009-06-22 11:37:57

回答

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

print is_admin 
4

試着做任何你需要的管理權限,並檢查失敗。

雖然這隻適用於某些事情,但您想做什麼?

3

如果您檢查腳本運行的是哪個平臺(使用sys.platform),並根據它進行測試(例如,從另一個平臺特定的模塊導入一些hasAdminRights功能。

在Windows上,您可以使用os.access來檢查Windows\System32是否可寫,但請記住嘗試檢索系統實際的「Windows」文件夾路徑,可能使用pywin32。不要硬編碼。

1

管理員組成員(域/本地/企業)是一回事..

定製您的應用程序不使用全面的權限和設置細粒度權限是一個更好的選擇,特別是如果正在使用的應用程序iinteractively。

對特定命名權限(se_shutdown se_restore等)進行測試,文件權限更加準確,更容易診斷。

1

這裏有一個效用函數從我接受的答案創建:

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