我正在尝试检查从服务启动的进程是否正在运行。
问题是,我们将我们的应用程序从 Windows XP 迁移到 Windows 7。此应用程序的一部分是服务,它会启动一些进程。另一部分是对话应用程序。此对话框应用程序尝试识别来自服务的进程是否正在运行。
进程的 pids 存储在共享内存中,因此我可以使用 WinApi 中的 OpenProcess()
获取进程句柄,这适用于 Windows XP。如果我尝试在 Windows 7 上执行此操作,该函数会报错 - 访问被拒绝。
我想,我知道,为什么会这样(Windows7 中新的 0 级隔离),但我需要找到一些解决方法。
我的问题是是否可以对创建的进程设置访问权限以及如何设置(请给我一些示例和解释)?
我发现,CreateProcess()
中有一个参数,并且有一个函数 SetSecurityInfo()
,但我可能以错误的方式使用这些函数,因为不工作。
为了检查进程是否正在运行,我使用了
running = (WaitForSingleObject( handle, 0 ) == WAIT_TIMEOUT);
或
BOOL result = GetExitCodeProcess(handle, (LPDWORD) &code);
if(result) {
if(code == STILL_ACTIVE) {
running = true;
}
}
handle
取自 OpenProcess()
函数 - OpenProcess( PROCESS_ALL_ACCESS , FALSE, pid );
我也尝试过SYNCHRONIZE
、PROCESS_QUERY_INFORMATION
和 PROCESS_QUERY_LIMITED_INFORMATION
。但总是拒绝访问..
每个想法都会有用。
最佳答案
问题不是 session 0 隔离(不影响进程对象)而是 UAC。在 Windows XP 中,用户进程可能具有管理权限,因此它可以为所欲为。在 Windows 7 中,您必须使用“以管理员身份运行”才能获得相同级别的权限。
你不应该弄乱进程权限,那太危险了。相反,由于您已经有了 IPC 机制(共享内存),您可以获得服务来检查进程是否正在运行并向用户进程报告。
触发服务执行检查的一种方法是使用 QueryServiceStatusEx()查询服务状态。您可以获得服务控制处理程序例程来检查进程是否正在运行并通过共享内存块进行报告。
关于检查(作为普通用户)管理进程是否正在运行(C,Windows),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28566400/