使用终止进程终止"mstsc.exe"进程时出现错误代码(5)访问被拒绝
Got error code(5) access denied when use TerminateProcess to terminate the "mstsc.exe" process
我使用CreateProcess()
函数使用"mstsc.exe"启动rdp客户端应用程序。之后,我想终止它,所以我使用了TerminateProcess()
函数,但它失败了,错误代码为5。如果我用"notepad.exe"替换"mstsc.exe",那么终止函数就可以工作了。代码如下:
TCHAR szCommandLine[] = TEXT("mstsc.exe");
STARTUPINFO si = {sizeof(si)};
PROCESS_INFORMATION pi;
BOOL bResult = CreateProcess(NULL, szCommandLine, NULL, NULL,
FALSE, NORMAL_PRIORITY_CLASS, NULL, NULL, &si, &pi);
::Sleep(3000);
if (TerminateProcess(pi.hProcess, 0) == 0) {
printf("failed: %d", GetLastError());
}
有人能帮忙解释和解决吗?我观察到,返回的pi
的pid与在taksmanager或"process Explorer"中观察到的进程"mstsc.exe"的id不同。
您的主机进程是32位的吗?您在64位窗口上运行吗?
如果是这样,那么您调用的是32位mstsc,它生成的是64位版本,因此PID不同。查看此线程
在终止另一个进程之前,您必须获得特权。
试试这个:
void UpdatePrivilege(void)
{
HANDLE hToken;
TOKEN_PRIVILEGES tp;
LUID luid;
if(OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY,&hToken))
{
LookupPrivilegeValue(NULL,SE_DEBUG_NAME, &luid);
tp.PrivilegeCount = 1;
tp.Privileges[0].Luid = luid;
tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
AdjustTokenPrivileges(hToken, FALSE, &tp, sizeof(TOKEN_PRIVILEGES), NULL, NULL);
}
}
在调用TerminateProcess之前先调用此函数。
相关文章:
- 使用 waitpid 时等待子进程终止
- 检测到由于操作系统内存不足而导致子进程终止
- 终端进程终止,退出代码为:1有什么方法可以修复它吗
- 使用system("./some_program"),当"some_program"死亡时,如何防止父进程终止?
- Ubuntu 服务器管道在第一次退出时停止进程终止
- win32 进程终止检测:WMI 与 WaitForSingleObject
- 如何停止DLL中的进程终止异常
- 使用终止进程终止"mstsc.exe"进程时出现错误代码(5)访问被拒绝
- 在 Linux 上使用 C++ 记录进程终止的原因
- 可以终止线程从另一个进程终止线程
- 进程等待另一进程终止时的信号处理
- MPI::COMM::Create之后的死锁(所有进程终止)
- 代码::阻止进程终止,状态为1
- libpqxx:如何在连接进程终止后重新连接到Postgresql数据库
- Fork进程:在子进程终止时恢复父进程(Linux)
- Qt处理进程终止
- 在所有子进程终止后,不能运行父进程
- 调用函数时进程终止
- C/ c++窗口中的进程终止
- 由于c++ bool函数的StackOverflowException导致进程终止