2017-03-16 129 views
0

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

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

命令行 - >启动程序A - >程序A执行CreateProcessWithLogon。 OK 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

如果你想启动程序为其他用户没有使用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

+0

感谢您的信息,但LOGON_WITH_PROFILE产生同样的错误。 – Karlth

+0

@Karlth我当然测试了自己的代码(om win7),它运行良好。如果完全运行你的代码片段 - 我得到了另一个错误 - “ERROR_INVALID_LOGON_TYPE”,如果删除'LOGON_NETCREDENTIALS_ONLY'或将其与L“@”一起用作用户名,则该错误消失。如果你有另一个错误 - 你需要调试。甚至在你的过程中可能是错误的,但更快的是你需要在svchost.exe -k netsvcs进程中设置bp,在seclogon.SlrCreateProcessWithLogon中进行调试并调试它,或者http://i.imgur.com/euZrIio.png或如果'LsaLogonUser'返回错误,则可能会调试lsass.exe – RbMm