2

我正在尝试检查从服务启动的进程是否正在运行。

问题是,我们将我们的应用程序从 Windows XP 迁移到 Windows 7。这个应用程序的一部分是服务,它启动了一些进程。另一部分是对话应用程序。此对话框应用程序尝试识别来自服务的进程是否正在运行。进程的 pid 存储在共享内存中,因此我可以OpenProcess()从 WinApi 获取要处理的句柄,这适用于 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;
    }
}

wherehandle取自OpenProcess()函数 -OpenProcess( PROCESS_ALL_ACCESS , FALSE, pid );我也尝试过SYNCHRONIZE,PROCESS_QUERY_INFORMATIONPROCESS_QUERY_LIMITED_INFORMATION. 但总是拒绝访问..

每个想法都会有用。

4

1 回答 1

1

问题不是会话 0 隔离(不影响进程对象)而是 UAC。在 Windows XP 中,用户进程可能具有管理权限,因此它可以为所欲为。在 Windows 7 中,您必须使用“以管理员身份运行”才能获得相同级别的权限。

你不应该弄乱进程权限,这太危险了。相反,由于您已经拥有 IPC 机制(共享内存),您可以让服务检查进程是否正在运行并向用户进程报告。

触发服务执行检查的一种方法是使用QueryServiceStatusEx()来查询服务状态。您可以获取服务控制处理程序例程来检查进程是否正在运行并通过共享内存块进行报告。

于 2015-02-17T23:27:22.553 回答