2013-04-02 5 views
2

Есть ли способ проверить, присутствует ли какой-либо данный пользователь в группе «Администратор»?Проверьте, находится ли произвольный пользователь в группе «Администратор» с Python

Я знаю, как проверить, если текущий пользователь является администратором с помощью:

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

Однако, если я вошел в качестве ПользовательА, я хочу знать, если userZed имеет права администратора.

Любые указатели или предложения помогли бы, кажется, я не могу найти документацию на ctypes.windll.shell32.

ответ

3

Вот сайт с кодом, чтобы сделать это:

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

Я проверил его и он работает. Может использоваться следующим образом, обратите внимание, что строки ИМЕЮТ быть юникода или Войти потерпит неудачу:

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) 
+0

Удивительно, большое вам спасибо, это работает как шарм! – Murkantilism

+0

Быстрый вопрос, однако, почему существует метод current_user_is_admin? Кажется, он никогда не используется и не вызван ничем. – Murkantilism

+1

Это просто для удобства, я думаю. Он показывает, что пользователь user_token текущего пользователя по умолчанию равен 0, и дает вам возможность (без ввода имени пользователя и пароля пользователя), чтобы выполнить функцию «Текущий пользователь администратора», который может быть недоступен с помощью ctypes. windll.shell32.IsUserAnAdmin(). – twasbrillig

0
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» должен быть «администратором»

Смежные вопросы