createProcessWithLogon返回不支持的函数

CreateProcessWithLogon returns Function not supported

本文关键字:函数 不支持 返回 createProcessWithLogon      更新时间:2023-10-16

我正在尝试启动一个程序,该程序在Windows 7系统上使用Win32函数createProcesswithlogon启动另一个程序,但它返回了不支持函数的错误120

如果我在命令中运行程序,则可以正常工作。另一方面,如果我使用Shellexecute启动程序,则会得到错误。

CMD行 ->启动程序A->程序A执行CreateProcessWithLogon。好的32位程序 ->启动程序A->程序A执行CreateProcessWithlogn。错误

        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");

如果要启动program 作为另一个用户不使用 LOGON_NETCREDENTIALS_ONLY flag-使用 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 ,组,特权),但在单独的登录session

只有一个技巧需要,未记录 - lpusername 必须以UPN格式 - 包含@ symbol。

因此,代码必须这样:

    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);
    }

结果将创建使用NewCredentials作为SECURITY_LOGON_TYPEAuthenticationPackage == Negotiate

的新登录