我正在学习Python安全性(Windows API),尤其是尝试使用CreateRestrictedToken
API作为受限用户启动notepad.exe。 目前,当我执行脚本时,notepad.exe按照预期启动DISABLE_MAX_PRIVILEGE
(0x1)。
除DISABLE_MAX_PRIVILEGE
(0x1)之外,我想禁用一些SID,例如pipe理员(S-1-5-32-544),已validation用户(S-1-5-11)和控制台login(S-1 -2-1)。 我试图禁用pipe理员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)