【问题标题】:How in windows create process as user using python?windows中如何使用python以用户身份创建进程?
【发布时间】:2020-01-18 14:02:16
【问题描述】:

我尝试创建 python 脚本以用户身份启动进程(将来此代码将由 Windows 服务从会话 0 运行)。为此,我决定使用 win32api。

但我有一个错误:

win32process.CreateProcessAsUser(token, None, "c:\\windows\\notepad.exe", None, None, 0, 0, None, None, startup)
pywintypes.error: (1314, 'CreateProcessAsUser', 'A required privilege is not held by the client.')

什么特权?如果我正确理解this

,我想我已经获得了所有特权

我的代码:

import win32con
import win32process
import win32security
import win32api


def adjust_privilege(privilege, enable=1):
    flags = win32security.TOKEN_ADJUST_PRIVILEGES | win32security.TOKEN_QUERY
    htoken = win32security.OpenProcessToken(
        win32api.GetCurrentProcess(), flags)
    id = win32security.LookupPrivilegeValue(None, privilege)
    if enable:
        new_privilege = [(id, win32security.SE_PRIVILEGE_ENABLED)]
    else:
        new_privilege = [(id, 0)]
    win32security.AdjustTokenPrivileges(htoken, 0, new_privilege)


if __name__ == "__main__":
    adjust_privilege(win32security.SE_TCB_NAME)
    adjust_privilege(win32security.SE_ASSIGNPRIMARYTOKEN_NAME)
    adjust_privilege(win32security.SE_INCREASE_QUOTA_NAME)

    user = "username"
    password = "password"
    domain = "domain"
    logontype = win32con.LOGON32_LOGON_INTERACTIVE
    provider = win32con.LOGON32_PROVIDER_WINNT50
    token = win32security.LogonUser(user, domain, password, logontype, provider)
    startup = win32process.STARTUPINFO()
    startup.dwFlags = win32process.STARTF_USESHOWWINDOW
    startup.wShowWindow = win32con.SW_SHOW
    startup.lpDesktop = 'winsta0\default'
    win32process.CreateProcessAsUser(token, None, "c:\\windows\\notepad.exe", None, None, 0, 0, None, None, startup)

非常感谢任何帮助。

【问题讨论】:

  • 一开始只读取 msdn - 通常,调用CreateProcessAsUser 函数的进程必须具有SE_INCREASE_QUOTA_NAME 权限,并且可能需要SE_ASSIGNPRIMARYTOKEN_NAME 权限你的情况你需要使用CreateProcessWithLogonW 而不是LogonUser + CreateProcessAsUser
  • 你没有检查AdjustTokenPrivileges的结果——如果你尝试得到SE_ASSIGNPRIMARYTOKEN_NAME——这并不意味着你真的得到了它(tcb这里不需要)跨度>

标签: python winapi createprocessasuser


【解决方案1】:

首先,这里有一个msdn上的例子到Starting an Interactive Client Process。

第二,作为@RbMm指针输出:

您需要使用CreateProcessWithLogonW 而不是LogonUser + CreateProcessAsUser

根据文档:

如果此函数以 ERROR_PRIVILEGE_NOT_HELD (1314) 失败,请使用 CreateProcessWithLogonW 函数。

This 似乎是 Python 中使用的一个示例。

其他有用的文章:

Launching an interactive process from Windows Service in Windows Vista and later

【讨论】:

  • 感谢您提供有用的信息。我尝试了此链接中的 1.A 示例link 启动隐藏的临时进程,如步骤 1.A 中所述。一、调用WTSQueryUserToken WTSGetActiveConsoleSessionId(), &hToken) 获取用户token;二、在 CreateProcessAsUser 中使用此令牌来启动临时进程。但是我在特权方面也遇到了同样的问题。
  • 根据文档中的return value:判断函数是否调整了所有指定的权限,调用GetLastError,函数成功时返回下列值之一 if error == ERROR_NOT_ALL_ASSIGNED, 令牌不具有 NewState 参数中指定的一项或多项权限。即使没有调整权限,该函数也可能会成功并返回此错误值。
  • 根据文档建议使用CreateProcessWithLogonW
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-05
  • 1970-01-01
  • 2017-08-24
  • 2010-09-26
  • 1970-01-01
相关资源
最近更新 更多