我正在尝试启动一个程序,该程序在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_TYPE
,AuthenticationPackage == Negotiate