检查(正常用户)pipe理进程是否正在运行(C,Windows)

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

问题是,我们的应用程序从Windows XP迁移到Windows 7.这个应用程序的一部分是服务,它启动一些进程。 另一部分是对话程序。 此对话框应用程序尝试识别服务进程是否正在运行。 进程的pid存储在共享内存中,所以我可以使用WinApi中的OpenProcess()来处理这个句柄,并在Windows XP上运行。 如果我试图在Windows 7上做到这一点,该function给我错误 – 访问被拒绝。

我想,我知道,为什么是这样的(在Windows7中新的0级隔离),但我需要find一些解决方法。

我的问题是如果有可能在创build的进程上设置访问权限,以及如何(请给我一些解释的例子)?

我发现, 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 ); 我也尝试了SYNCHRONIZEPROCESS_QUERY_INFORMATIONPROCESS_QUERY_LIMITED_INFORMATION 。 但总是访问被拒绝..

每个想法都是有用的。

问题不是会话0隔离(不影响过程对象),而是UAC。 在Windows XP中,用户进程可能具有管理权限,所以它可以做任何喜欢的事情。 在Windows 7中,您将不得不使用“以管理员身份运行”来获得相同级别的权限。

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

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