Compruebe si un usuario arbitrario está en el Grupo de administradores con Python

¿Hay alguna forma de verificar si algún usuario determinado está en el grupo del administrador?

Sé cómo verificar si el usuario actual es un administrador usando:

import ctypes print ctypes.windll.shell32.IsUserAnAdmin() 

Sin embargo, si estoy conectado como usuarioA, quiero saber si UserZed tiene privilegios de administrador.

Cualquier puntero o sugerencia ayudaría, parece que no puedo rastrear ninguna documentación en ctypes.windll.shell32.

Aquí hay un sitio web con código para hacer esto:

http://skippylovesmalorie.wordpress.com/tag/python-windows/

Lo probé y funciona. Se puede usar de la siguiente manera, tenga en cuenta que las cadenas DEBEN ser unicode o el inicio de sesión fallará:

Python 2.7:

 print(user_is_admin(u"johndoe", u"password123", u"MYDOMAIN")) 

Python 3.x:

 print(user_is_admin("johndoe", "password123", "MYDOMAIN")) 

Aquí está el código, para futuras referencias:

 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')) 

Por supuesto, en su caso, ‘SOME_GROUP’ debería ser ‘administradores’