使用终止进程终止"mstsc.exe"进程时出现错误代码(5)访问被拒绝

Got error code(5) access denied when use TerminateProcess to terminate the "mstsc.exe" process

本文关键字:进程 终止 访问 错误代码 拒绝 mstsc exe      更新时间:2023-10-16

我使用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之前先调用此函数。