CreateProcessWithLogonW 错误 1783:存根收到错误数据
Posted
技术标签:
【中文标题】CreateProcessWithLogonW 错误 1783:存根收到错误数据【英文标题】:CreateProcessWithLogonW Error 1783: The stub received bad data 【发布时间】:2014-12-03 13:26:53 【问题描述】:我有这个测试代码:
int main(int argc, char *argv[])
setlocale(LC_ALL, "");
std::string user;
std::string pass;
std::cout << "user: ";
getline(std::cin, user);
std::cout << "\npass: ";
getline(std::cin, pass);
std::cout << std::endl;
std::wstring suser = std::wstring(user.begin(), user.end());
LPCWSTR su = suser.c_str();
std::wstring spass = std::wstring(pass.begin(), pass.end());
LPCWSTR sp = spass.c_str();
DWORD dwSize = 0;
HANDLE hToken ;
LPVOID lpvEnv = 0;
PROCESS_INFORMATION pi = 0;
STARTUPINFO si = 0;
WCHAR szUserProfile[256] = L"";
si.cb = sizeof(STARTUPINFO);
if (!LogonUser(su, L".", sp, LOGON32_LOGON_INTERACTIVE,
LOGON32_PROVIDER_DEFAULT, &hToken))
qDebug() << "LogonUser";
if (!CreateEnvironmentBlock(&lpvEnv, hToken, TRUE))
qDebug() << "CreateEnvironmentBlock";
dwSize = sizeof(szUserProfile)/sizeof(WCHAR);
if (!GetUserProfileDirectory(hToken, szUserProfile, &dwSize))
qDebug() << "GetUserProfileDirectory";
WCHAR app[] = L"\"C:\\Program Files (x86)\\Adobe\\Reader 11.0\\Reader\\AcroRd32.exe\" \"C:\\Users\\UD\\Desktop\\insect immunity.pdf\"";
if (!CreateProcessWithLogonW(su, L".", sp,
LOGON_WITH_PROFILE, NULL, app,
CREATE_UNICODE_ENVIRONMENT, lpvEnv, szUserProfile,
&si, &pi))
LPVOID lpMsgBuf;
LPVOID lpDisplayBuf;
DWORD dw = GetLastError();
FormatMessage(
FORMAT_MESSAGE_ALLOCATE_BUFFER |
FORMAT_MESSAGE_FROM_SYSTEM |
FORMAT_MESSAGE_IGNORE_INSERTS,
NULL,
dw,
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
(LPTSTR) &lpMsgBuf,
0, NULL );
// Display the error message and exit the process
lpDisplayBuf = (LPVOID)LocalAlloc(LMEM_ZEROINIT,
(lstrlen((LPCTSTR)lpMsgBuf) + 40) * sizeof(TCHAR));
StringCchPrintf((LPTSTR)lpDisplayBuf,
LocalSize(lpDisplayBuf) / sizeof(TCHAR),
TEXT("failed with error %d: %s"), dw, lpMsgBuf);
qDebug() << QString::fromWCharArray((LPTSTR)lpDisplayBuf);
if (!DestroyEnvironmentBlock(lpvEnv))
qDebug() << "DestroyEnvironmentBlock";
CloseHandle(hToken);
CloseHandle(pi.hProcess);
CloseHandle(pi.hThread);
system("pause");
return 0;
在我朋友的电脑上,它总是可以正常工作。在我的电脑上它有时可以工作!只有有时,大多数时候它会产生 1783 错误。我试图在我的电脑上删除一些服务,但这没有帮助。我需要该代码可以在许多其他 PC 上运行,因此我需要了解为什么会出现此错误以及如何修复它。
【问题讨论】:
你为什么同时使用LogonUser()
和CreateProcessWithLogonW()
?通过使用LogonUser()
,您已经拥有用户的令牌,因此您应该使用CreateProcessAsUser()
。
它的 MS 示例,不是主要的
嗨,我也面临同样的问题。如果你解决了这个问题,你是怎么解决的?
【参考方案1】:
帮助在CreateProcessWithLogonW/中设置环境为NULL
【讨论】:
【参考方案2】:对我有用的解决方法:
以前,我从来宾帐户调用它以在系统帐户中启动一个进程。我让应用程序弹出一个对话框来接收凭据(如果需要)并在函数 CreateProcessWithLogonW 中使用它并失败并出现错误代码 1783。
解决方案:现在,在收到错误代码后,我会弹出一个 UAC 对话框,用户必须在其中输入凭据(而不是应用程序处理凭据),然后它就可以工作了。
看起来像是权限问题。无论如何,这适用于我的用例,如果有人也遵循相同的路线,可能会有所帮助。
【讨论】:
以上是关于CreateProcessWithLogonW 错误 1783:存根收到错误数据的主要内容,如果未能解决你的问题,请参考以下文章
CreateProcessWithLogonw 错误需要提升
CreateProcessWithLogonW 错误 1783:存根收到错误数据
如何通过内部命令使用CreateProcessWithLogonW
使用 CreateProcessWithLogonW 从服务启动的进程立即终止