我正在学习 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 的 CreateRestrictedToken
的 SidsToDisable
参数需要 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)
我是一名优秀的程序员,十分优秀!