我正在尝试检查从服务启动的进程是否正在运行。
问题是,我们将应用程序从Windows XP迁移到Windows 7.此应用程序的一部分是启动某些进程的服务。另一部分是对话框应用程序。此对话框应用程序尝试识别来自服务的进程是否正在运行。
进程的pid存储在共享内存中,因此我可以使用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
。但总是拒绝访问..
每个想法都会有用。
答案 0 :(得分:1)
问题不是会话0隔离(它不会影响进程对象),而是UAC。在Windows XP中,用户进程可能具有管理权限,因此它可以执行任何喜欢的操作。在Windows 7中,您必须使用"以管理员身份运行"获得相同级别的特权。
你不应该混淆过程权限,这太危险了。相反,由于您已经拥有IPC机制(共享内存),因此您可以获取服务以检查进程是否正在运行并向用户进程报告。
触发服务执行检查的一种方法是使用QueryServiceStatusEx()来查询服务状态。您可以获取服务控制处理程序例程以检查进程是否正在运行并通过共享内存块报告。