如何在VC ++ 2005中使用OpenProcessToken,AdjustTokenPrivileges和GetExitCodeProcess

我读了几篇关于如何检查一个进程是否从一个不同的进程退出的post(我意识到有些人在这里挂了语义,但只是幽默我),我试图实现它,但运行到错误代码5 (“ERROR_ACCESS_DENIED”)到处都是。

这是我做的。

1)进程1(P1)启动进程2并将自己的PID写入共享内存位置。

2)进程2(P2)从共享内存中读取PID

3)P2用P1的PID调用OpenProcess(…)来保存稍后可以检查的句柄。

4)P2用P1的PID重复地调用GetExitCodeProcess(…)并检查STILL_ACTIVE代码。

在上面的方法中,我一直在GetExitCodeProcess上获取ACCESS_DENIED错误。 我已经尝试使用MSDN文档中的以下代码修改P2的权限:

HANDLE proc_h = OpenProcess(SYNCHRONIZE, FALSE, GetCurrentProcessId()); HANDLE hToken; OpenProcessToken(proc_h, TOKEN_ADJUST_PRIVILEGES, &hToken); LookupPrivilegeValue(NULL, lpszPrivilege, &luid ); tp.PrivilegeCount = 1; tp.Privileges[0].Luid = luid; tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED; // Enable the privilege AdjustTokenPrivileges(hToken, FALSE, &tp, sizeof(TOKEN_PRIVILEGES), (PTOKEN_PRIVILEGES) NULL, (PDWORD) NULL); 

但是我一直在调用OpenProcessToken(…)方法时遇到ACCESS_DENIED错误。 那么这是否表明某种系统级的障碍? 我有我的机器pipe理员权限,我正在运行XP。

在此先感谢您的帮助。

传递给GetExitCodeProcess的句柄需要PROCESS_QUERY_INFORMATION访问权限。 以下工作正常:

 int main(int a_argc, char** a_argv) { int pid = atoi(*(a_argv + 1)); HANDLE h = OpenProcess(PROCESS_QUERY_INFORMATION, FALSE, pid); if (NULL != h) { Sleep(2000); DWORD exit_code; if (FALSE == GetExitCodeProcess(h, &exit_code)) { std::cerr << "GetExitCodeProcess() failure: " << GetLastError() << "\n"; } else if (STILL_ACTIVE == exit_code) { std::cout << "Still running\n"; } else { std::cout << "exit code=" << exit_code << "\n"; } } else { std::cerr << "OpenProcess() failure: " << GetLastError() << "\n"; } return 0; } 

而不是轮询GetExitCodeProcess打开与SYNCHRONIZE的句柄,并等待它退出:

 int main(int a_argc, char** a_argv) { int pid = atoi(*(a_argv + 1)); HANDLE h = OpenProcess(SYNCHRONIZE | PROCESS_QUERY_INFORMATION, FALSE, pid); if (NULL != h) { WaitForSingleObject(h, 5000); // Change to 'INFINITE' wait if req'd DWORD exit_code; if (FALSE == GetExitCodeProcess(h, &exit_code)) { std::cerr << "GetExitCodeProcess() failure: " << GetLastError() << "\n"; } else if (STILL_ACTIVE == exit_code) { std::cout << "Still running\n"; } else { std::cout << "exit code=" << exit_code << "\n"; } } else { std::cerr << "OpenProcess() failure: " << GetLastError() << "\n"; } return 0; } 

OpenProcesstoken需要PROCESS_QUERY_INFORMATION,你只用SYNCHRONIZE访问来打开进程。 看看你是否添加| PROCESS_QUERY_INFORMATION | PROCESS_QUERY_INFORMATION如果有效。

如果你只想让P2在P1退出的时候做一些事情,还有另外一种方式可能会比较简单:让P1创建一个管道,让P2继承一个管道。 在P2中,执行从管道读取。 当P2对ReadFile的调用返回错误ERROR_BROKEN_PIPE ,P1已经退出。