使用Python检查任意用户是否在管理员组中

3

是否有一种方法可以检查任何给定用户是否在管理员组中?

我知道如何检查当前用户是否是管理员,使用以下方法:

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

然而,如果我以userA的身份登录,我想知道userZed是否具有管理员权限。

任何提示或建议都会有所帮助,似乎我找不到关于ctypes.windll.shell32的任何文档。

3个回答

4
这里有一个网站提供相关代码:http://skippylovesmalorie.wordpress.com/tag/python-windows/
我已测试并验证其有效性。使用时需要注意,字符串必须是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)

快速问题,为什么存在current_user_is_admin方法?它似乎从未被任何东西使用或调用。 - Murkantilism
1
这只是为了方便而存在的,我认为。它显示当前用户的user_token默认为0,并且让您有机会(无需输入当前用户的用户名和密码)浏览“当前用户是否为管理员”的函数,这可能无法通过ctypes.windll.shell32.IsUserAnAdmin()实现。 - twasbrillig

1
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”应该是“管理员”。

0

没有真正的方法可以知道给定用户是否具有管理员权限(可能拥有域管理员权限,可能是任意组的成员本身是本地管理员组的成员)。 唯一确定的方法是模拟用户,但您需要用户的密码。 一旦成为用户,您可以检查是否可以写入system32文件夹(检查您是否是管理员的简单方法...或者FS ACLs很糟糕lol),或者检查任何需要管理员权限的内容,例如将任意注册表键写入HKLM然后将其删除。

如果您只想找出当前用户是否在本地管理员组中,我已经为此制作了一个软件包,其中提供了许多功能之一

安装方式:

pip install windows_tools.users

使用方法:

import windows_tools.users as users

# if no user is given, current one is used
is_admin = is_user_local_admin('myuser')
print(is_admin)

更长的答案,确保给定用户具有管理员权限(仍需用户密码)

我的软件包可以模拟身份,因此您可能希望通过执行以下步骤来检查是否拥有完整的管理员权限:

pip install windows_tools.impersonate
pip install windows_tools.securityprivilege

例子

import ctypes
from windows_tools import impersonate
from windows_tools import users
from windows_tools import securityprivilege

with impersonate.ImpersonateWin32Sec(
        domain=".", username='someuser', password='somepassword'
    ):
    print(users.whoami())
    try:
        securityprivilege.enable_privilege("SeSecurityPrivilege")
        securityprivilege.disable_privilege("SeSecurityPrivilege")
        print('Yay, I have admin superpowers')
    except ctypes.WinError:
        print('Nope, I am a simple mortal')

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接