5

我使用该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 或“进程资源管理器”中观察到的进程“mstsc.exe”的 id 不同。

4

2 回答 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 之前调用此函数。

于 2012-08-23T16:02:40.563 回答
3

您的主机进程是 32 位的并且您在 64 位窗口上运行吗?

如果是这样,您正在调用 32 位 mstsc 并且它正在生成 64 位版本,因此 PID 不同。看看这个线程

于 2012-08-23T15:56:26.273 回答