Winapi 进程所有者无法终止由CreateProcessAsUser API创建的进程

Winapi 进程所有者无法终止由CreateProcessAsUser API创建的进程,winapi,createprocessasuser,Winapi,Createprocessasuser,我有一个windows服务,它以本地系统帐户开始。在该服务中,它使用CreateProcessAsUser API创建一个具有user1帐户的新进程。创建流程后: 以管理员身份登录系统,我可以找到进程的所有者是用户1,我可以停止/恢复/终止进程 以user1身份登录系统,但我无法停止/恢复/终止进程,并且出现了“拒绝访问”错误。为什么? 以下是我的测试代码: import os import psutil import win32process import win32security impo

我有一个windows服务,它以本地系统帐户开始。在该服务中,它使用CreateProcessAsUser API创建一个具有user1帐户的新进程。创建流程后:

  • 以管理员身份登录系统,我可以找到进程的所有者是用户1,我可以停止/恢复/终止进程

  • user1身份登录系统,但我无法停止/恢复/终止进程,并且出现了“拒绝访问”错误。为什么?

  • 以下是我的测试代码:

    import os
    import psutil
    import win32process
    import win32security
    import win32con
    import win32api
    import win32file
    
    
    def log(msg):
        with open('C:\\test\\my.log', 'a') as f:
            f.write(msg)
            f.write('\n')
    
    username = 'user1'
    password = 'user1'
    domain = 'testpc'
    
    
    try:
        token = win32security.LogonUser (
            username,
            domain,
            password,
            win32con.LOGON32_LOGON_SERVICE,
            win32con.LOGON32_PROVIDER_DEFAULT
        )
        win32security.ImpersonateLoggedOnUser(token)
    
        cmd = "ping -n 600 localhost"
        cwd = 'c:\\test'
        env = os.environ
    
        dwCreationFlags = win32con.NORMAL_PRIORITY_CLASS
        startup = win32process.STARTUPINFO()
    
        (hProcess, hThread, dwProcessId, dwThreadId) = \
            win32process.CreateProcessAsUser(token, None, cmd, None, None, True,
                                             dwCreationFlags, env, cwd, startup)
        log("hProcess=%s, hThread=%s, dwProcessId=%s, dwThreadId=%s" % (hProcess, hThread, dwProcessId, dwThreadId))
    
        process = psutil.Process(dwProcessId)
        log('process: %s' % process)
    
        return_code = process.wait()
    
        win32file.CloseHandle(hThread)
        win32file.CloseHandle(hProcess)
    except win32security.error as e:
        log(e)
    

    有人能帮我吗?非常感谢。

    Process Monitor(可从MS网站获得)可以显示正在对流程设置的权限。根据文档,它们应该按照您希望的方式工作,但这可能已经过时或是错误的。(这可能与正在会话0中创建进程的事实有关。)无论如何,如果没有按照您想要的方式设置它们,您可以使用
    lpProcessAttributes
    参数显式设置它们,尽管我不知道这在你使用的任何语言中都有多容易。你犯了两个错误-首先你在调用
    LOGON32\u LOGON\u服务时使用
    LogonUser
    。但在这种情况下,提供的帐户必须启用服务特权。第二个错误-您没有检查任何错误。如果选中此项-您可以查看
    LogonUser
    失败并出现错误
    error\u LOGON\u TYPE\u NOT\u grated
    (登录失败:用户未被授予此计算机上请求的登录类型。)-下一步是什么-您在调用
    CreateProcessAsUser
    中使用0
    令牌。这是创建的有效值和流程,但使用system DACLuser1具有所有访问权限,但从您的服务创建时,流程处于高度完整性。如果用户以中等完整性登录,则会过滤用户对进程的权限,以仅允许查询有限的信息(例如图像名称)、同步(等待)和终止。因此,扼杀这个过程应该仍然有效。任务管理器对我很有用。OTOH,
    taskkill.exe/f/pid…
    试图打开一个有权查询完整信息的句柄,但由于访问被拒绝而失败。@RbMm,作为服务登录的令牌(
    LOGON32\u LOGON\u service
    )具有高完整性标签,并且创建的进程处于高完整性(在其SACL中)。在评论之前,我通过创建一个标准用户(不是管理员)验证了这一点,该用户被专门授予作为服务登录的权限。强制标签ACE存储在SACL中,但它的特殊情况不需要SeSecurityPrivilege。