首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >CreateProcessAsUser和createevent权限

CreateProcessAsUser和createevent权限
EN

Stack Overflow用户
提问于 2020-01-11 16:31:57
回答 1查看 365关注 0票数 1

我正在创建一个在端口上侦听的应用程序,当客户端发出请求时,它会使用LogonUser,CreateProcessAsUser与另一个用户一起产生一个新的进程。

我用CreateEvent()函数设置了2个事件,向子进程发出信号,表示WSADuplicateSocket准备通过内存映射文件将SOCKADD_STORAGEW结构传递给子进程。

子进程中的OpenEvent()在从应用程序生成时一直失败,错误5(访问被拒绝)。

如果我使用OpenEvent函数成功地打开事件(shift +右键单击,运行为)手动运行子/客户端。

该事件是在全局命名空间( global )中创建的,为了测试目的,我创建了一个null Dacl (我已经通过winobj验证了该事件的权限)传递给了CreateEvent()函数。

我不知道我错过了什么。

下面是相关的代码片段:

服务器:

代码语言:javascript
复制
SECURITY_ATTRIBUTES sa;
CreateNullDacl(&sa);


if ((ghParentFileMappingEvent = CreateEvent(&sa, TRUE, FALSE, szParentEventName)) == NULL) {
    fprintf(stderr, "CreateEvent() failed: %d\n", GetLastError());
    return false;
}

if ((ghChildFileMappingEvent = CreateEvent(&sa, TRUE, FALSE, szChildEventName)) == NULL) {
    fprintf(stderr, "CreateEvent() failed: %d\n", GetLastError());
    CloseHandle(ghParentFileMappingEvent);
    return false;
}





PROCESS_INFORMATION pi = { 0 };
STARTUPINFO si = { 0 };
SECURITY_ATTRIBUTES procSa;
CreateNullDacl(&procSa);

HANDLE htok;
if (!LogonUser(chall->user, ".", chall->pass, LOGON32_LOGON_BATCH, LOGON32_PROVIDER_DEFAULT, &htok)) {
    fprintf(stderr, "LogonUser() failed: %d\n", GetLastError());
    return false;

}


if(CreateProcessAsUser(htok, 0, szChildComandLineBuf, &procSa, 0, FALSE, NULL, NULL, "C:\\Users\\ch99", &si, &pi)) {
 //... 
}

CLient从CreateProcessAsUser()派生而来

代码语言:javascript
复制
 if ((ghParentFileMappingEvent = OpenEventA(SYNCHRONIZE, FALSE, szParentEventName)) == 0)  // return 5 , access denied
{
    fprintf(fp, "OpenParentEvent failed: %d\n", GetLastError());
    return INVALID_SOCKET;
}

if ((ghChildFileMappingEvent = OpenEventA(SYNCHRONIZE, FALSE, szChildEventName)) == 0) { // return 5 access denied
    fprintf(fp, "OpenChildEvent failed: %d\n", GetLastError());
    CloseHandle(ghParentFileMappingEvent);
    ghParentFileMappingEvent = NULL;
    return INVALID_SOCKET;
}

感谢您的回复。

EN

回答 1

Stack Overflow用户

发布于 2020-01-14 02:20:15

基于CreateProcessAsUser文档的

表示用户的主令牌的句柄。句柄必须具有TOKEN_QUERY和TOKEN_ASSIGN_PRIMARY访问权限。

以下代码适用于我:

代码语言:javascript
复制
if (!OpenProcessToken(GetCurrentProcess(), TOKEN_QUERY | TOKEN_DUPLICATE | TOKEN_ASSIGN_PRIMARY, &htok))
    printf("OpenProcessToken() failed: %d\n", GetLastError());
if (!CreateProcessAsUser(htok, L"childProc.exe", NULL, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi)) {
    printf("CreateProcessAsUser() failed: %d\n", GetLastError());
}

或者您可以使用CreateProcessWithToken (这要求以管理员身份运行):

代码语言:javascript
复制
HANDLE htok;
if (!LogonUser(L"userName", L"domain", L"password", LOGON32_LOGON_BATCH, LOGON32_PROVIDER_DEFAULT, &htok)) {
    printf("LogonUser() failed: %d\n", GetLastError());
    return false;
}

if (!CreateProcessWithTokenW(htok, LOGON_WITH_PROFILE,L"childProc.exe", NULL, 0, NULL, NULL, &si, &pi)) {
    printf("CreateProcessAsUser() failed: %d\n", GetLastError());
}

使用上述两种方法,子进程都可以成功地打开事件。

对于您的代码,我得到了错误代码1314 (客户端不拥有所需的特权)。当调用CreateProcessAsUser时。指出我错过了什么,并为你的问题复制步骤。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59696361

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档