python - CreateRestrictedToken - SidsToDisable

标签 python windows api

我正在学习 Python 安全性 (Windows API),特别是尝试使用 CreateRestrictedToken API 以受限用户身份启动 notepad.exe。目前,当我执行脚本时,notepad.exe 按预期以 DISABLE_MAX_PRIVILEGE (0x1) 启动。

除了 DISABLE_MAX_PRIVILEGE (0x1) 之外,我还想禁用一些 SID,例如管理员 (S-1-5-32-544)、经过身份验证的用户 (S-1-5- 11) 和控制台登录 (S-1-2-1)。我尝试禁用管理员 SID;但是,它失败并出现以下错误:

TypeError: 'PySID' object has no attribute '__getitem__'

SID_AND_ATTRIBUTES 中似乎有一个结构,但我不太确定如何将其组合在一起。

我的 Python 版本是 x64 版本 2.7.4。

import win32process
import win32job
import time
import win32event
import win32security
import win32api
from random import randint

ph = win32process.GetCurrentProcess()
th = win32security.OpenProcessToken(ph,win32security.TOKEN_ALL_ACCESS)

admins = win32security.ConvertStringSidToSid("S-1-5-32-544")[0]

token = win32security.CreateRestrictedToken(th, 1, admins, None, None)

startup = win32process.STARTUPINFO()
(hProcess, hThread, processId, threadId) = win32process.CreateProcessAsUser(token, "C:\\Windows\\Notepad.exe", None, None, None, True, win32process.CREATE_BREAKAWAY_FROM_JOB, None, None, startup)

最佳答案

PyWin32 的 CreateRestrictedTokenSidsToDisable 参数需要 PySID_AND_ATTRIBUTES 。这是一个(PySID, Attributes) 元组序列。在这种情况下,属性将被忽略,因此使用 0。例如:

import os
import win32process
import win32security

token = win32security.OpenProcessToken(win32process.GetCurrentProcess(),
                                       win32security.TOKEN_ALL_ACCESS)

disabled_sids = [(win32security.CreateWellKnownSid(sidt), 0)
                 for sidt in [win32security.WinBuiltinAdministratorsSid,
                              win32security.WinAuthenticatedUserSid]]

# WinConsoleLogonSid (81) requires Windows 8.
# Use the string SID instead.
disabled_sids.append(
    (win32security.ConvertStringSidToSid("S-1-2-1"), 0))

token_r = win32security.CreateRestrictedToken(
            token, win32security.DISABLE_MAX_PRIVILEGE,
            disabled_sids, None, None)

notepad_path = os.path.join(os.environ['SystemRoot'], 'notepad.exe') 
startup = win32process.STARTUPINFO()

(hProcess, hThread,
 processId, threadId) = win32process.CreateProcessAsUser(
    token_r, notepad_path, None, None, None,
    True, win32process.CREATE_BREAKAWAY_FROM_JOB, None, None, startup)

关于python - CreateRestrictedToken - SidsToDisable,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40859608/

相关文章:

javascript - 如何使用 json api auth 处理 angularJS 中的 session 状态

database - Stripe 在后端使用什么进行存储?

c++ - 处理 GetSidIdentifierAuthority 函数的返回值

windows - 如何将 Windows 应用程序与特定文件类型相关联,但与其他应用程序共享该关联?

sql - .MDF 数据库的 UnixODBC 驱动程序问题。或 : is there a way to easily extract a bunch of tables without an sql server?

python - 如何从包含代理的 python 中已解析的非 json API 中获取数据?

python - 编写此 Python 代码的更简洁的方法

python - 如何在 Visual Studio Code 中跨 python 文件访问符号

python - 如何绕过 TensorFlow 中部分神经网络的某些(但不是全部)功能

python - 避免在文件末尾换行 - Python