一个进程可以用不同的用户名(两个进程在不同的用户名下运行)发出另一个进程创建的事件的信号吗?

Posted

技术标签:

【中文标题】一个进程可以用不同的用户名(两个进程在不同的用户名下运行)发出另一个进程创建的事件的信号吗?【英文标题】:Can one Process signal the event created by another process under different username(both process running under different username) ? 【发布时间】:2012-01-25 09:01:05 【问题描述】:

在 Windows 7 中发生:

我已将进程 proc1.exe 作为服务安装。在 proc1 中,我通过创建会话 id 和令牌并传递给 CreateProcessAsUser() 来创建新进程 proc2.exe。

在 Proc2 中,我正在创建一个等待信号的事件。 在 Proc1 中,当我停止服务时,我通过 OpenEvent 和 SetEvent 向该事件发送信号。

如果我启动服务,proc1.exe 正在 SYSTEM 用户名下运行,而 proc2.exe 正在登录用户名(Taskmanager)下运行。

当我停止服务时,Proc1 试图通过调用 OpenEvent 来发送信号。但是 OpenEvent 返回 NULL。

两个进程都在不同的用户下运行。访问该事件是否有问题? 如果是这样,如何在不同的进程和用户下发出事件信号? 请帮我找出来.....

【问题讨论】:

【参考方案1】:

您的事件可能在创建它的会话中是本地的,即如果 Proc2 创建了一个名为“ShutdownSystem”的事件,那么该事件只有该会话中的其他进程知道,就像函数中的局部变量一样。

如果您希望您的事件对象以全局方式存在并且可以从其他会话访问,则应在其前面加上“Global\”(例如,将其命名为“Global\ShutdownSystem”)。然后系统会在全局命名空间中创建它。

【讨论】:

正确,我忘记了安全属性。另外,不要忘记转义反斜杠(“\\”)。当您从 proc1(服务)打开事件时,将 EVENT_MODIFY_STATE 指定为 OpenEvent() 的第一个参数。 感谢您的回复。我正在创建这样的事件,HANDLE lStopHandle = CreateEvent(NULL, FALSE, FALSE, "mousestopevent");在这里我必须更改如下 HANDLE lStopHandle = CreateEvent(&sa_in, FALSE, FALSE, "Global\mousestopevent"); ? 非常感谢...好的..我使用 EVENT_ALL_ACCESS 作为 OpenEvent() 中的第一个参数..可以吗?在 OpenEvent 中,我也使用“Global\\name”作为名称吗? EVENT_ALL_ACCESS 也可以。是的,OpenEvent() 指定的名称与 CreateEvent() 中的名称完全相同。它对系统说:在全局命名空间中寻找这个对象,而不是在本地存储中。

以上是关于一个进程可以用不同的用户名(两个进程在不同的用户名下运行)发出另一个进程创建的事件的信号吗?的主要内容,如果未能解决你的问题,请参考以下文章

在 ASP.NET 中以不同用户身份启动进程

CentOS 7 查看和控制进程

python中的多进程为两个不同的函数

程序进程逐步显示,并可以控制停止和继续

Linux进程管理及作业控制的启动进程

无法以不同用户身份运行 C# 进程