【发布时间】:2010-12-01 07:50:51
【问题描述】:
我想在另一个用户下创建一个进程。所以我使用 LogonUser 和 CreateProcessAsUser。但我的问题是,CreatePtocessAsUser 总是返回错误代码 1314,这意味着“客户端不持有所需的权限”。所以我的问题是,我做错了什么?或者我怎样才能赋予手柄特权? (我认为句柄应该有特权,还是我错了?)对不起我的英语错误,但我的英语知识不是最好的:)
如果有人知道如何更正我的申请,请提供帮助。
这是我的代码的一部分。
STARTUPINFO StartInfo;
PROCESS_INFORMATION ProcInfo;
TOKEN_PRIVILEGES tp;
memset(&ProcInfo, 0, sizeof(ProcInfo));
memset(&StartInfo, 0 , sizeof(StartInfo));
StartInfo.cb = sizeof(StartInfo);
HANDLE handle = NULL;
if (!OpenProcessToken(GetCurrentProcess(),
TOKEN_ALL_ACCESS, &handle)) printf("\nOpenProcessError");
if (!LookupPrivilegeValue(NULL,SE_TCB_NAME,
//SE_TCB_NAME,
&tp.Privileges[0].Luid)) {
printf("\nLookupPriv error");
}
tp.PrivilegeCount = 1;
tp.Privileges[0].Attributes =
SE_PRIVILEGE_ENABLED;//SE_PRIVILEGE_ENABLED;
if (!AdjustTokenPrivileges(handle, FALSE, &tp, 0, NULL, 0)) {
printf("\nAdjustToken error");
}
i = LogonUser(user, domain, password, LOGON32_LOGON_INTERACTIVE, LOGON32_PROVIDER_DEFAULT, &handle);
printf("\nLogonUser return : %d",i);
i = GetLastError();
printf("\nLogonUser getlast : %d",i);
if (! ImpersonateLoggedOnUser(handle) ) printf("\nImpLoggedOnUser!");
i = CreateProcessAsUser(handle, "c:\\windows\\system32\\notepad.exe",NULL, NULL, NULL, true,
CREATE_UNICODE_ENVIRONMENT |NORMAL_PRIORITY_CLASS | CREATE_NEW_CONSOLE, NULL, NULL,
&StartInfo, &ProcInfo);
printf("\nCreateProcessAsUser return : %d",i);
i = GetLastError();
printf("\nCreateProcessAsUser getlast : %d",i);
CloseHandle(handle);
CloseHandle(ProcInfo.hProcess);
CloseHandle(ProcInfo.hThread);
提前致谢!
【问题讨论】:
-
你很幸运,你甚至知道错误号。调用 GetLastError 的正确方法是在调用 API 后立即调用,如果 API 失败。如果您在两者之间调用其他任何内容(例如 printf),则 GetLastError 通常会给您一个稍后的错误,而不是您想要的错误。
-
是的,你是对的,我也知道,但是我尝试了很多方法来解决这个问题,我忘了删除 printf。我的错误:(
-
ERROR_PRIVILEGE_NOT_HELD 以防万一有人搜索错误名称而不是 1314。