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

5

我使用CreateProcess()函数来启动rdp客户端应用程序,使用“mstsc.exe”。之后,我想要终止它,所以我使用TerminateProcess()函数,但是它失败了,错误代码为5。如果我将“mstsc.exe”替换为“notepad.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与任务管理器或进程探索器中观察到的进程“mstsc.exe”的id不同。


1
错误 5 是 ERROR_ACCESS_DENIED - Adam Rosenfield
2个回答

3

在终止另一个进程之前,您必须获取特权。

尝试以下操作:

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


通常情况下,在终止在与您相同上下文中运行的进程时,这通常是不必要的。您还应该注意,在调用OpenProcess之前需要执行此操作,如果在调用OpenProcess之后和TerminatProcess之前执行此操作,则无效。 - Harry Johnston
1
抱歉,Rango。 我按照你给我的函数调用,在创建进程之前或终止进程之前调用它,但结果仍然相同。 - Henry

3

你的主机进程是32位的,而你正在64位的Windows上运行吗?

如果是这样,你正在调用32位的mstsc,并且它会生成一个64位版本,因此PID会不同。请查看这个帖子


谢谢,我明白了。我在Win7 64位系统上运行win32应用程序。 - Henry
我在运行mstsc.exe之前添加了以下代码,并使用“c:\ windows \ system32”下的32位版本的mstsc.exe,然后可以终止它:PVOID OldValue = NULL; BOOL result = Wow64DisableWow64FsRedirection(&OldValue); - Henry

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接