CreateProcessWithLogon返回不支持的函数

时间:2017-03-16 12:21:29

标签: c++ windows winapi process

我试图启动一个程序,在Windows 7系统上使用Win32函数CreateProcessWithLogon作为另一个用户启动另一个程序,但它返回错误120,代表不支持的函数。 / p>

如果我在命令中运行该程序,它可以正常工作。另一方面,如果我使用ShellExecute启动程序,那么我会收到错误。

Cmd Line - >启动计划A - >程序A执行CreateProcessWithLogon。好 32位程序 - >启动计划A - >程序A执行CreateProcessWithLogn。 ERROR

        if (!CreateProcessWithLogonW(L"username", L"domain", L"password",
        LOGON_NETCREDENTIALS_ONLY, L"C:\\Program Files (x86)\\Internet Explorer\\iexplore.exe", L"iexplore",
        NULL, NULL, NULL,
        &si, &pi))
        DisplayError(L"CreateProcessWithLogonW");

1 个答案:

答案 0 :(得分:1)

如果您希望以另一个用户启动程序 而不使用LOGON_NETCREDENTIALS_ONLY标记,请使用LOGON_WITH_PROFILE

    STARTUPINFO si = { sizeof(si) };
    PROCESS_INFORMATION pi;
    if (CreateProcessWithLogonW(L"username", L"domain", L"password", LOGON_WITH_PROFILE, 
        L"C:\\windows\\notepad.exe", L"notepad.exe", 0, NULL, NULL, &si, &pi))
    {
        CloseHandle(pi.hThread);
        CloseHandle(pi.hProcess);
    }

如果您使用标记LOGON_NETCREDENTIALS_ONLY

  

系统不验证指定的凭据。

所以你真的不需要提供真实姓名或密码。因为系统没有真正登录但是

  

新进程使用与调用者相同的令牌,但系统使用相同的令牌   在LSA中创建一个新的登录会话

所以这个登录类型克隆调用者当前令牌,但在其中指定新的登录会话。您的程序将以作为同一用户 SID ,组,权限)运行,但在单独的登录会话中

只有一个技巧需要,没有记录 - lpUsername 必须采用UPN格式 - 包含 @ 符号。

所以代码必须是这样的:

    STARTUPINFO si = { sizeof(si) };
    PROCESS_INFORMATION pi;
    if (CreateProcessWithLogonW(L"@", 0, 0, LOGON_NETCREDENTIALS_ONLY, 
        L"C:\\windows\\notepad.exe", L"notepad.exe", 0, NULL, NULL, &si, &pi))
    {
        CloseHandle(pi.hThread);
        CloseHandle(pi.hProcess);
    }

结果将创建新的LogonSession NewCredentialsSECURITY_LOGON_TYPEAuthenticationPackage == Negotiate