【问题标题】:CreateProcessAsUser error 1314CreateProcessAsUser 错误 1314
【发布时间】: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。

标签: createprocessasuser


【解决方案1】:

运行您的应用的本地帐户必须在本地安全策略中启用这些权限:

  • 作为操作系统的一部分
  • 创建令牌对象
  • 作为批处理作业登录

编辑:请参阅下面 Patel 的回答。在这种情况下,正确的权限应该是:

  • “替换进程级令牌”

【讨论】:

  • 嗨!我也想使用域和本地帐户。我认为也许创建一个令牌对象将是最简单的方法,我希望它可以在两个帐户下工作。您能否给我一个示例代码,如何生成具有所需权限的令牌对象?谢谢,坎皮
  • 如何设置这些权限?
  • 对于所有过来的人:我最终不需要其中的前两个(尽管我已经在“作为批处理作业登录”)。相反,我终于通过像@Patel 建议的那样添加“替换进程级别令牌”来让它工作。
  • 我不相信这个答案是正确的,尽管被标记为这样。 “创建令牌对象”是一个非常受保护的特权,通常只由诸如 winlogon 和 lsass 等安全管理器的进程持有。第二个答案是正确的。 “替换进程级令牌”是唯一需要的权限,默认情况下由所有服务进程持有。
【解决方案2】:

在寻找了几个小时的答案后,我终于在 MSDN 的以下链接中找到了它。希望它可以帮助将来的人。

https://social.msdn.microsoft.com/Forums/vstudio/en-US/c905c900-cae1-4081-b0c9-00f10238e7ad/createprocessasuser-failed?forum=clr

“要解决此问题,您需要使用 “替换进程级别令牌” 权限提升调用 CreateProcessAsUser 的帐户的权限。为此,请打开控制面板/管理工具/本地安全策略并将用户帐户添加到“替换进程级别令牌”权限。(您可能必须注销甚至重新启动才能使此更改生效。)“

【讨论】:

  • 位于:Local PoliciesUser Rights Assignment
  • 德语/Auf Deutsch:Öffne Lokale Sicherheitsrichtlinie,unter Lokale RichtlinieZuweisen von Benutzerrechten,在 dem Eintrag Ersetzen eines Tokens auf Prozessebene den Benutzer,bzw。 die Gruppe hinzufügen。
  • 顺便说一句,“本地安全策略”是 secpol.msc,应该适用于任何语言。
【解决方案3】:

您的代码将 SE_TCB_NAME 权限添加到您的令牌。

MSDN 说“通常,调用 CreateProcessAsUser 函数的进程必须具有 SE_ASSIGNPRIMARYTOKEN_NAME 和 SE_INCREASE_QUOTA_NAME 权限。”

【讨论】:

  • 是的,我也知道。我的问题是,我应该如何添加这些权限?如果我尝试这个: if (!LookupPrivilegeValue(NULL,SE_ASSIGNPRIMARYTOKEN_NAME & SE_INCREASE_QUOTA_NAME, &tp.Privileges[0].Luid)) 我得到错误: Invalid operands of types to binary operator '&' 那么我如何在同一时间?
  • 我请求了一些帮助(一些工作代码或解释)。不想帮忙的请不要加cmets!!
【解决方案4】:

我检查了链接,效果很好。 Check this

void main()
{

DWORD dwSessionId;
HANDLE hToken = NULL;

TOKEN_PRIVILEGES tp;
PROCESS_INFORMATION pi;
STARTUPINFOW si;

// Initialize structures.
ZeroMemory(&tp, sizeof(tp));
ZeroMemory(&pi, sizeof(pi));
ZeroMemory(&si, sizeof(si));
si.cb = sizeof(si);


LPTSTR lpszUsername = "user\0";
LPTSTR lpszDomain = ".";//"bgt\0";
LPTSTR lpszPassword = "password\0";

if (!OpenProcessToken(GetCurrentProcess(), TOKEN_QUERY
| TOKEN_ADJUST_PRIVILEGES , &hToken)) {

MyError();
}



// Look up the LUID for the TCB Name privilege.
if (!LookupPrivilegeValue(NULL,SE_TCB_NAME, //SE_SHUTDOWN_NAME ,
//SE_TCB_NAME,
&tp.Privileges[0].Luid)) {
MyError();
}


tp.PrivilegeCount = 1;
tp.Privileges[0].Attributes =
SE_PRIVILEGE_ENABLED;//SE_PRIVILEGE_ENABLED;
if (!AdjustTokenPrivileges(hToken, FALSE, &tp, 0, NULL, 0)) {

MyError();
}


if(LogonUser(lpszUsername,lpszDomain,lpszPassword,
LOGON32_LOGON_INTERACTIVE,LOGON32_PROVIDER_DEFAULT,&hToken) == 0)
{
MyError();
}
else
{
STARTUPINFO sInfo;
PROCESS_INFORMATION ProcessInfo;
memset(&sInfo,0,sizeof(STARTUPINFO));
sInfo.cb = sizeof(STARTUPINFO);
sInfo.dwX = CW_USEDEFAULT;
sInfo.dwY = CW_USEDEFAULT;
sInfo.dwXSize = CW_USEDEFAULT;
sInfo.dwYSize = CW_USEDEFAULT;


bool bRet = CreateProcessAsUser(hToken,
"c:\\windows\\system32\\notepad.exe",
NULL,
NULL,
NULL,
TRUE,
CREATE_NEW_CONSOLE,
NULL,
NULL,
&sInfo,
&ProcessInfo);

if(bRet == 0)
MyError();
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多