我试图启动一个程序,在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");
答案 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 NewCredentials
为SECURITY_LOGON_TYPE
,AuthenticationPackage == Negotiate