Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 使用CreateProcessWithTokenW在CMD中启动CMD_C++_C_Visual Studio - Fatal编程技术网

C++ 使用CreateProcessWithTokenW在CMD中启动CMD

C++ 使用CreateProcessWithTokenW在CMD中启动CMD,c++,c,visual-studio,C++,C,Visual Studio,我有一个控制台应用程序,它调用CreateProcessWithTokenW()WinAPI函数来创建一个新的进程,启动cmd控制台。通过调用它,它将启动一个新的CMD窗口。我想在调用cmd窗口中生成另一个cmd(而不是在新窗口中) 所以我想模拟相同的行为,比如启动cmd并键入“cmd” 摆脱CREATE\u NEW\u控制台标志: 创建新的控制台 0x00000010 新进程有一个新控制台,而不是继承父进程的控制台。此标志不能与分离的\u进程标志一起使用 默认情况下,此标志处于启用状态 正是这

我有一个控制台应用程序,它调用
CreateProcessWithTokenW()
WinAPI函数来创建一个新的进程,启动cmd控制台。通过调用它,它将启动一个新的CMD窗口。我想在调用cmd窗口中生成另一个cmd(而不是在新窗口中)

所以我想模拟相同的行为,比如启动cmd并键入“cmd”


摆脱
CREATE\u NEW\u控制台
标志:

创建新的控制台
0x00000010

新进程有一个新控制台,而不是继承父进程的控制台。此标志不能与分离的\u进程标志一起使用

默认情况下,此标志处于启用状态


正是这个闪存迫使创建一个新的CMD窗口。否则,将在调用进程的现有CMD窗口中创建新进程

就我而言,您应该使用
CREATE\u NEW\u CONSOLE
。根据守则:

STARTUPINFOEX startup_info = {};
PROCESS_INFORMATION process_info = {};
BOOL CreateProcTokenRes = FALSE;

CreateProcTokenRes = CreateProcessWithTokenW(NewToken, 0, L"C:\\Windows\\system32\\cmd.exe", NULL, CREATE_NEW_CONSOLE, NULL, NULL, &startup_info, &process_info);

if (!CreateProcTokenRes)
{
    _tprintf(L"Cannot Create Process With Token. Failed with Error Code: %d\n", GetLastError());
    CloseHandle(NewToken);
ret=CreateProcessWithTokenW(pNewToken,0,L“C:\\Windows\\System32\\cmd.exe”,NULL,CREATE\u NEW\u控制台,NULL,NULL,&si,&pi)

问题不在于使用
CreateProcessWithTokenW()
winapi。能否请您提供一份复印本

代码如下:

STARTUPINFOEX startup_info = {};
PROCESS_INFORMATION process_info = {};
BOOL CreateProcTokenRes = FALSE;

CreateProcTokenRes = CreateProcessWithTokenW(NewToken, 0, L"C:\\Windows\\system32\\cmd.exe", NULL, CREATE_NEW_CONSOLE, NULL, NULL, &startup_info, &process_info);

if (!CreateProcTokenRes)
{
    _tprintf(L"Cannot Create Process With Token. Failed with Error Code: %d\n", GetLastError());
    CloseHandle(NewToken);

有关更多详细信息,我建议您可以参考链接:

这里是一个最小的可复制代码片段。 我添加了CreateProcess而不是CreateProcessWithToken…如果我为第5个参数(dwCreationFlag)定义了0,则它会在Powershell中启动CMD。但是对于CreateProcessWithToken,行为不同

使用提升的powershell运行此代码(因为它需要Se_Debug_Priv)

#包括
#包括
#包括
#包括
#包括
int main(){
//在此定义winlogon.exe的PID
DWORD pid=940;
句柄currentProcess={};
句柄AccessToken={};
currentProcess=OpenProcess(进程查询信息,TRUE,pid);
OpenProcessToken(currentProcess、TOKEN_ASSIGN_PRIMARY、TOKEN|u DUPLICATE、TOKEN|u IMPERSONATE、TOKEN|QUERY和AccessToken);
句柄pToken=AccessToken;
安全性模拟级别seImpersonateLevel=安全性模拟;
TOKEN_TYPE tokenType=TokenPrimary;
句柄pNewToken=新句柄;
DuplicateTokenEx(pToken、允许的最大值、NULL、seImpersonateLevel、tokenType和pNewToken);
STARTUPINFO si={};
进程信息pi={};
//测试1
//为这两个函数创建一个新窗口,因此第五个窗口似乎被忽略
CreateProcessWithTokenW(pNewToken,0,L“C:\\Windows\\System32\\cmd.exe),NULL,0,NULL,NULL,&si,&pi);
CreateProcessWithTokenW(pNewToken,0,L“cmds.bat”,NULL,CREATE_NEW_控制台,NULL,NULL,&si,&pi);
//测试2
//创建新窗口,假定行为
CreateProcessW(L“C:\\Windows\\System32\\cmd.exe”,NULL,NULL,NULL,TRUE,创建新控制台,NULL,NULL,&si,&pi);
//还创建一个新窗口,而不是假定的行为
CreateProcessW(L“C:\\Windows\\System32\\cmd.exe”,NULL、NULL、NULL、TRUE、0、NULL、NULL、&si、&pi);
返回0;
}

控制台进程可以使用CREATE\u NEW\u console的CreateProcess功能来创建具有新控制台的控制台进程。有关更多详细信息,我建议您可以参考以下链接:。这里有一个类似的问题:ret=CreateProcessWithTokenW(pNewToken,0,L“C:\\Windows\\System32\\cmd.exe”,NULL,NULL,NULL,NULL,&si,&pi);或者ret=CreateProcessWithTokenW(pNewToken,0,L“C:\\Windows\\System32\\cmd.exe”,NULL,0,NULL,NULL,&si,&pi);具有与CREATE_NEW_CONSOLE Flag相同的行为。若要清除:我不希望CREATE_NEW_CONSOLE的行为…它希望它在现有/调用cmd/powershell中生成。我读到我必须将标志设置为0。使用函数CreateProcess,它工作得很好,但是CreateProcessWithToken似乎忽略了这一点。
#include <stdio.h> 
#include <Windows.h> 
#include <WinBase.h> 
#include <iostream> 
#include <tchar.h> 

int main() {
    //DEFINE HERE PID OF winlogon.exe
    DWORD pid = 940;

    HANDLE currentProcess = {};
    HANDLE AccessToken = {};
    currentProcess = OpenProcess(PROCESS_QUERY_INFORMATION, TRUE, pid);
    OpenProcessToken(currentProcess, TOKEN_ASSIGN_PRIMARY | TOKEN_DUPLICATE | TOKEN_IMPERSONATE | TOKEN_QUERY, &AccessToken);
    HANDLE pToken = AccessToken;
    SECURITY_IMPERSONATION_LEVEL seImpersonateLevel = SecurityImpersonation;
    TOKEN_TYPE tokenType = TokenPrimary;
    HANDLE pNewToken = new HANDLE;
    DuplicateTokenEx(pToken, MAXIMUM_ALLOWED, NULL, seImpersonateLevel, tokenType, &pNewToken);
    STARTUPINFO si = {};
    PROCESS_INFORMATION pi = {};

    //TEST1
    //Creates a new window for both functions so the 5th seems to be ignored 
    CreateProcessWithTokenW(pNewToken, 0, L"C:\\Windows\\System32\\cmd.exe", NULL, 0, NULL, NULL, &si, &pi);
    CreateProcessWithTokenW(pNewToken, 0, L"cmds.bat", NULL, CREATE_NEW_CONSOLE, NULL, NULL, &si, &pi);

    //TEST2
    //Create a new windows, assumed behavior
    CreateProcessW(L"C:\\Windows\\System32\\cmd.exe", NULL, NULL, NULL, TRUE, CREATE_NEW_CONSOLE, NULL, NULL, &si, &pi);
    //Creates also a new window, NOT assumed behavior
    CreateProcessW(L"C:\\Windows\\System32\\cmd.exe", NULL, NULL, NULL, TRUE, 0, NULL, NULL, &si, &pi);
    return 0;
}