检查(作为普通用户)是不是正在运行管理进程(C、Windows)

Posted

技术标签:

【中文标题】检查(作为普通用户)是不是正在运行管理进程(C、Windows)【英文标题】:Check (as normal user) if admin process is running (C, Windows)检查(作为普通用户)是否正在运行管理进程(C、Windows) 【发布时间】:2015-02-17 16:39:29 【问题描述】:

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

问题是,我们将应用程序从 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 ); 我也尝试过使用SYNCHRONIZEPROCESS_QUERY_INFORMATIONPROCESS_QUERY_LIMITED_INFORMATION。但总是拒绝访问..

每个想法都会有用。

【问题讨论】:

【参考方案1】:

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

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

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

【讨论】:

您可以使用在服务HandlerEx 中处理的用户定义控制代码调用ControlService @eryksun:是的,我没想到。虽然这需要更改服务的权限。 @HarryJohnston - 你知道吗,它(改变进程权限)有多危险?我只想做这个操作PROCESS_QUERY_INFORMATION。我认为QueryServiceStatusEx() 行不通。我的服务启动了另一个进程,我需要检查其中一个进程的状态。 哦,我想如果你添加了一个 ACE 来允许 SYNCHRONIZE 和 PROCESS_QUERY_LIMITED_INFORMATION 这并不重要。但是更改权限的代码中的错误可能会导致严重的麻烦。请注意,QueryServiceStatusEx() 会导致服务控制管理器向您的服务发送查询请求。在您的代码中的某个地方,您正在响应该请求,并且您可以在那里做任何您喜欢的事情 - 它没有必须只报告服务进程本身的状态,它可以进行任何其他检查这是必要的。

以上是关于检查(作为普通用户)是不是正在运行管理进程(C、Windows)的主要内容,如果未能解决你的问题,请参考以下文章

C# 使用登录的用户凭据启动进程

C++:如何检查外部程序是不是正在运行?

检查文件是由进程创建还是由用户使用C ++创建

如何使用 C++ 检查进程是不是正在运行

Linux普通用户运行串口

如何检查 impala 守护进程实例和状态存储守护进程实例是不是正在运行?