You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用CreateProcessWithLogonW启动进程时访问网络驱动器的问题

解决方案:系统服务中启动带网络驱动器访问权限的子进程

一、CreateProcessWithLogonW 错误(1326)的原因与修复

你遇到的ERROR_LOGON_FAILURE本质是:CreateProcessWithLogonW虽然通过LOGON_WITH_PROFILE加载了用户本地配置文件,但不会自动建立用户的网络会话关联——系统服务上下文与交互式用户会话隔离,用户配置中的网络驱动器映射不会被自动激活,子进程无法继承或访问SMB连接所需的凭据。

修复方法1:子进程内手动建立网络连接

在子进程启动后,显式调用WNetAddConnection2W建立目标UNC路径的连接,绕开对用户自动映射的依赖:

NETRESOURCEW nr = {0};
nr.dwType = RESOURCETYPE_DISK;
nr.lpRemoteName = L"\\\\server\\share"; // 目标UNC路径

// 传入用户凭据(可从父进程传递,或子进程持有)
DWORD result = WNetAddConnection2W(&nr, L"password", L"domain\\username", CONNECT_TEMPORARY);
if (result != NO_ERROR) {
    // 处理连接错误
}
  • 使用CONNECT_TEMPORARY避免修改用户配置文件,重启后自动失效;若需持久化可改用CONNECT_UPDATE_PROFILE。

修复方法2:传递用户专属环境变量

调用CreateProcessWithLogonW时,不要传入NULL作为环境变量参数,而是生成用户专属的环境块,确保子进程拥有用户的网络相关环境配置:

  1. 先通过LogonUserW获取用户令牌
  2. 调用CreateEnvironmentBlock生成用户环境块
  3. 将环境块传入CreateProcessWithLogonW的lpEnvironment参数
  4. 进程启动后调用DestroyEnvironmentBlock释放资源

二、LogonUser + CreateProcessAsUser 可行方案(支持无人登录)

该方案不依赖交互式用户会话,适合系统服务场景,核心是手动完成用户登录、配置文件加载、令牌权限调整,确保子进程拥有完整的用户身份与网络权限。

关键步骤与代码示例

HANDLE hToken = NULL;
// 1. 登录用户,获取令牌(需服务运行在高权限账号如LocalSystem)
if (!LogonUserW(L"target_user", L"domain", L"password", 
                LOGON32_LOGON_INTERACTIVE, LOGON32_PROVIDER_DEFAULT, &hToken)) {
    return GetLastError();
}

// 2. 启用CreateProcessAsUser所需的令牌权限
TOKEN_PRIVILEGES tp = {0};
LookupPrivilegeValueW(NULL, SE_ASSIGNPRIMARYTOKEN_NAME, &tp.Privileges[0].Luid);
tp.PrivilegeCount = 1;
tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
AdjustTokenPrivileges(hToken, FALSE, &tp, sizeof(TOKEN_PRIVILEGES), NULL, NULL);

LookupPrivilegeValueW(NULL, SE_INCREASE_QUOTA_NAME, &tp.Privileges[0].Luid);
AdjustTokenPrivileges(hToken, FALSE, &tp, sizeof(TOKEN_PRIVILEGES), NULL, NULL);

// 3. 加载用户配置文件,确保HKEY_CURRENT_USER与网络配置生效
PROFILEINFOW profileInfo = {0};
profileInfo.dwSize = sizeof(PROFILEINFOW);
profileInfo.lpUserName = L"target_user";
profileInfo.dwFlags = PI_NOUI; // 无UI加载配置文件
if (!LoadUserProfileW(hToken, &profileInfo)) {
    CloseHandle(hToken);
    return GetLastError();
}

// 4. 生成用户环境块
LPVOID userEnv = NULL;
if (!CreateEnvironmentBlock(&userEnv, hToken, TRUE)) {
    UnloadUserProfileW(hToken, profileInfo.hProfile);
    CloseHandle(hToken);
    return GetLastError();
}

// 5. 启动子进程
STARTUPINFOW si = {0};
si.cb = sizeof(STARTUPINFOW);
PROCESS_INFORMATION pi = {0};

BOOL success = CreateProcessAsUserW(
    hToken,
    L"C:\\path\\to\\your\\subprocess.exe", // 子进程路径
    NULL,
    NULL, NULL, FALSE,
    CREATE_NO_WINDOW | NORMAL_PRIORITY_CLASS | CREATE_UNICODE_ENVIRONMENT,
    userEnv,
    NULL, // 当前目录可设为用户默认目录或UNC路径
    &si,
    &pi
);

// 6. 清理资源
DestroyEnvironmentBlock(userEnv);
UnloadUserProfileW(hToken, profileInfo.hProfile);
CloseHandle(pi.hProcess);
CloseHandle(pi.hThread);
CloseHandle(hToken);

if (!success) {
    return GetLastError();
}

注意事项

  • 服务需运行在LocalSystem或拥有SeInteractiveLogonRight权限的账号下,否则LogonUserW会失败。
  • LOGON32_LOGON_INTERACTIVE登录类型确保加载完整的用户配置文件,包含网络相关设置;若仅需网络访问,也可尝试LOGON32_LOGON_NETWORK_CLEARTEXT,但需验证权限。
  • 务必清理所有资源(令牌、环境块、配置文件句柄),避免内存泄漏或用户配置损坏。

内容的提问来源于stack exchange,提问作者Achim Schön

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.20 15:43:18