【问题标题】:CreateProcessWithLogon returns Function not supportedCreateProcessWithLogon 返回函数不支持
【发布时间】:2017-03-16 12:21:28
【问题描述】:

我正在尝试启动一个程序,该程序在 Windows 7 系统上使用 Win32 函数 CreateProcessWithLogon 作为另一个用户启动另一个程序,但它返回错误 120,代表 function not supported。

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

Cmd Line -> 启动程序 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");

【问题讨论】:

    标签: c++ windows winapi process


    【解决方案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,NewCredentials 为 SECURITY_LOGON_TYPE,AuthenticationPackage == Negotiate

    【讨论】:

    • 感谢您的信息,但 LOGON_WITH_PROFILE 产生了同样的错误。
    • @Karlth 我当然测试了自己的代码(om win7 也是),它运行良好。如果完全运行您的代码 sn-p - 我得到另一个错误 - ERROR_INVALID_LOGON_TYPE 如果删除 LOGON_NETCREDENTIALS_ONLY 或将其与 L"@" 作为用户名一起使用,则该错误消失了。如果你有另一个错误 - 你需要调试。即使在您的进程中也可能出现错误,但您需要更快地在seclogon.SlrCreateProcessWithLogon 上的svchost.exe -k netsvcs 进程中设置bp 并对其进行调试-i.imgur.com/euZrIio.png 或者如果LsaLogonUser 返回错误,则可能是调试lsass.exe
    猜你喜欢
    • 2020-09-18
    • 1970-01-01
    • 2011-07-06
    • 1970-01-01
    • 1970-01-01
    • 2016-12-29
    • 2013-08-31
    • 1970-01-01
    • 2013-02-21
    相关资源
    最近更新 更多