返回

解决 CreateProcessAsUser() 进程退出和 0xc0000142 错误:原因及修复步骤

windows

解决 CreateProcessAsUser() 引发的进程退出和 0xc0000142 错误

问题概述

在使用 CreateProcessAsUser() 启动进程时,进程立即退出,并显示错误代码 0xc0000142。

问题根源

目标用户可能缺乏访问桌面的权限,导致进程启动失败。

解决方案

步骤 1:检查目标用户权限

确保目标用户具备交互式登录权限,并拥有访问 winsta0\default 桌面的权限。

步骤 2:授予目标用户访问桌面权限

对于非管理员目标用户,授予访问桌面权限的步骤如下:

  1. 以管理员身份打开注册表编辑器 (regedit.exe)。
  2. 导航至 HKEY_USERS\DEFAULT\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon
  3. 创建新的项 0
  4. 0 项下创建 DWORD 值 HideFastUserSwitching`,并将其值设为 ** 0

步骤 3:使用 CreateProcessWithLogon()

CreateProcessWithLogon() 函数提供更多的选项,包括指定用户的桌面权限:

BOOL success = CreateProcessWithLogonW(
    username,  // Target user name
    "domain_local", // Target user domain
    "password", // Target user password
    LOGON_WITH_PROFILE, // Logon options
    LOGON32_PROVIDER_DEFAULT, // Logon provider
    cmd_line, // Command line to execute
    CREATE_DEFAULT_ERROR_MODE, // Process creation flags
    proc_env, // Environment block
    L"C:\\", // Current directory
    &si, // Startup information
    &pi // Process information
);

其他注意事项

  • 启用必要的特权,例如 SeAssignPrimaryTokenPrivilegeSeIncreaseQuotaPrivilege
  • 目标用户应具备执行 whoami.exe 文件的权限。
  • 对于没有管理员权限的目标用户,确保他们拥有足够的权限来运行进程。
  • 使用 Process Monitor 等工具监视进程启动过程,识别潜在问题。

常见问题解答

  1. 为什么 CreateProcessAsUser() 会引发 0xc0000142 错误?

    • 目标用户通常缺乏访问桌面的权限。
  2. 如何授予目标用户访问桌面权限?

    • 对于非管理员目标用户,需要在注册表中创建 0 项和 **HideFastUserSwitching` 值。
  3. 为什么 CreateProcessWithLogon()CreateProcessAsUser() 更好?

    • CreateProcessWithLogon() 提供更多的灵活性,允许指定用户的桌面权限。
  4. 除了权限问题之外,还有哪些因素可能导致 0xc0000142 错误?

    • 缺少必要的特权或用户没有执行进程所需的权限。
  5. 如何进一步故障排除此错误?

    • 使用 Process Monitor 监视进程启动过程,检查权限和事件日志以查找可能的线索。