使用Python检查某些进程是否以管理员身份运行

问题描述 投票:2回答:3

是否有任何功能可以用python检查是否以管理员身份运行某些进程?以下是检查进程是否正在运行的方法,但是我想检查该进程是否在管理员特权下运行:Python check if a process is running or not

python windows process operating-system admin
3个回答
0
投票

您可以尝试致电windll函数:

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

0
投票
import ctypes, os

def isAdmin():
    try:
        is_admin = (os.getuid() == 0)
    except AttributeError:
        is_admin = ctypes.windll.shell32.IsUserAnAdmin() != 0
    return is_admin

print isAdmin()

不确定是否可以,但是尝试用您要检查的进程ID替换os.getuid()!!让我知道这个是否奏效。


0
投票

标准库和psutil都不包含检查另一个进程的用户是否是管理员的功能。您需要使用ctypes或PyWin32直接访问Windows API。

检查访问令牌中是否存在并启用SID的推荐功能为CheckTokenMembership。这需要模拟令牌(即线程令牌),这会使事情复杂化,因为某些令牌的安全性甚至不允许管理员通过CheckTokenMembership将其复制为模拟令牌。作为备用,您可以打开具有查询访问权限的流程主令牌,并手动检查从DuplicateTokenEx获得的令牌组中已启用的SID。

无论哪种情况,都需要通过DuplicateTokenEx打开目标进程的句柄。句柄至少需要有限的查询访问权限,才能被允许通过GetTokenInformation获取主令牌。 (也就是说,获取令牌也受到令牌本身安全性的限制。)对系统受保护的进程进行受限查询访问需要SeDebugPrivilege。在下面的代码示例中,我包括一个上下文管理器,该管理器允许仅针对当前线程临时启用此特权。

您还需要管理员组的SID,可以通过GetTokenInformation获得。

ctypes定义

OpenProcess

助手功能

OpenProcess

主要功能

OpenProcessToken

示例

会话客户端-服务器运行时进程(CSR,即“ csrss.exe”)是受保护的系统进程,因此我们需要SeDebugPrivilege才能查询其令牌。仅当Python以提升的管理员或系统进程的身份运行时,此特权才可用。当作为标准进程运行时,访问将被拒绝。对于以下测试,我们将调用OpenProcessToken(未记录)以获取会话CSR进程的PID。

Python以标准用户进程运行:

CreateWellKnownSid

Python作为高级别管理员进程运行:

CreateWellKnownSid
© www.soinside.com 2019 - 2024. All rights reserved.