有沒有辦法檢查是否有任何給定的用戶在管理員組中?檢查任意用戶是否在使用Python的管理員組中
我知道如何檢查當前用戶使用管理員:
import ctypes
print ctypes.windll.shell32.IsUserAnAdmin()
但是如果我登錄的用戶A,我想知道,如果userZed具有管理員權限。
任何指針或建議將有所幫助,似乎我無法追查ctypes.windll.shell32上的任何文檔。
有沒有辦法檢查是否有任何給定的用戶在管理員組中?檢查任意用戶是否在使用Python的管理員組中
我知道如何檢查當前用戶使用管理員:
import ctypes
print ctypes.windll.shell32.IsUserAnAdmin()
但是如果我登錄的用戶A,我想知道,如果userZed具有管理員權限。
任何指針或建議將有所幫助,似乎我無法追查ctypes.windll.shell32上的任何文檔。
這裏是代碼的網站做到這一點:
http://skippylovesmalorie.wordpress.com/tag/python-windows/
我測試了它和它的作品。可以使用如下,注意HAVE的字符串是Unicode或登錄失敗:
的Python 2.7:
print(user_is_admin(u"johndoe", u"password123", u"MYDOMAIN"))
Python 3.x都有:
print(user_is_admin("johndoe", "password123", "MYDOMAIN"))
這裏的代碼,供將來參考:
import ctypes
import ctypes.wintypes
def current_user_is_admin():
return user_token_is_admin(0)
def user_is_admin(username, password, domain=None):
"""note that username, password, and domain should all be unicode"""
LOGON32_LOGON_NETWORK = 3
LOGON32_PROVIDER_DEFAULT = 0
token = ctypes.wintypes.HANDLE()
if ctypes.windll.advapi32.LogonUserW(username, domain, password,
LOGON32_LOGON_NETWORK, LOGON32_PROVIDER_DEFAULT, ctypes.byref(token)) == 0:
raise Exception("user logon failed")
try:
return user_token_is_admin(token)
finally:
ctypes.windll.kernel32.CloseHandle(token)
def user_token_is_admin(user_token):
"""
using the win32 api, determine if the user with token user_token has administrator rights
"""
class SID_IDENTIFIER_AUTHORITY(ctypes.Structure):
_fields_ = [
("byte0", ctypes.c_byte),
("byte1", ctypes.c_byte),
("byte2", ctypes.c_byte),
("byte3", ctypes.c_byte),
("byte4", ctypes.c_byte),
("byte5", ctypes.c_byte),
]
nt_authority = SID_IDENTIFIER_AUTHORITY()
nt_authority.byte5 = 5
SECURITY_BUILTIN_DOMAIN_RID = 0x20
DOMAIN_ALIAS_RID_ADMINS = 0x220
administrators_group = ctypes.c_void_p()
if ctypes.windll.advapi32.AllocateAndInitializeSid(ctypes.byref(nt_authority), 2,
SECURITY_BUILTIN_DOMAIN_RID, DOMAIN_ALIAS_RID_ADMINS,
0, 0, 0, 0, 0, 0, ctypes.byref(administrators_group)) == 0:
raise Exception("AllocateAndInitializeSid failed")
try:
is_admin = ctypes.wintypes.BOOL()
if ctypes.windll.advapi32.CheckTokenMembership(
user_token, administrators_group, ctypes.byref(is_admin)) == 0:
raise Exception("CheckTokenMembership failed")
return is_admin.value != 0
finally:
ctypes.windll.advapi32.FreeSid(administrators_group)
import win32net
def if_user_in_group(group, member):
members = win32net.NetLocalGroupGetMembers(None, group, 1)
return member.lower() in list(map(lambda d: d['name'].lower(), members[0]))
# Function usage
print(if_user_in_group('SOME_GROUP', 'SOME_USER'))
當然在你的情況'SOME_GROUP'應該是'管理員'
真棒,非常感謝你這個它就像一個魅力! – Murkantilism
但是,爲什麼current_user_is_admin方法存在?它似乎永遠不會被任何東西使用或調用。 – Murkantilism
我想這只是爲了方便。它顯示當前用戶的user_token默認爲0,並且給你機會(不必輸入當前用戶的用戶名和密碼)來逐步執行「當前用戶和管理員」的功能,這對於ctypes來說可能是不可能的。 windll.shell32.IsUserAnAdmin()。 – twasbrillig