从我的应用程序打开由我的服务创建的 Event 对象

WIN*_*LIV 4 windows service winapi

我创建了一个 Windows 服务。我正在创建一个事件“测试”。我想使用相同的事件对象由我的应用程序设置/重置。但是我似乎没有通过我的应用程序获取事件对象的句柄。但是可以看到在 BaseNamed 对象中列出的事件。

我想我需要对创建事件的安全属性做一些事情。

我正在我的服务中创建此事件

CreateEvent(NULL, TRUE, FALSE, TEXT("Test"))

并在我的应用程序中使用 OpenEvent。

OpenEvent(EVENT_ALL_ACCESS, TRUE, TEXT("Test"))

请建议我需要进行哪些更改,以便我的应用程序获得处理。

更新

更换后TEXT("Test") with TEXT("Global\\Test")。我仍然没有得到 Event 对象句柄。是的,现在至少它通过错误返回(拒绝访问)识别事件对象的存在。它之前收到错误返回(系统找不到指定的文件)。正如我所说,我认为这里有一些安全方面。这是我发现的:当会话在会话 0 中创建事件时。它不能被我在会话 1 中创建的应用程序继承。为此,在创建事件对象时,我需要指定安全属性结构适当的安全调度员这样做。有人能告诉我怎么做吗?

Rom*_* R. 5

服务和应用程序可能在不同的会话中运行,并且您需要使用“全局”内核对象命名空间前缀以使服务和应用程序都可见该对象。

请参阅 MSDN 上的内核对象命名空间中的示例和描述:

单独的客户端会话命名空间使多个客户端能够运行相同的应用程序而不会相互干扰。对于在客户端会话下启动的进程,系统默认使用会话命名空间。但是,这些进程可以通过在对象名称前添加“Global\”前缀来使用全局命名空间。例如,以下代码调用 CreateEvent 并在全局命名空间中创建名为 CSAPP 的事件对象:

CreateEvent( NULL, FALSE, FALSE, "Global\\CSAPP" );

也可以看看:

由于默认事件安全性可能会拒绝应用程序的访问,因此您需要在创建事件并准备好公开它后立即更新它。


Rem*_*eau 5

尝试这个:

PSECURITY_DESCRIPTOR psd = (PSECURITY_DESCRIPTOR) LocalAlloc(LPTR, SECURITY_DESCRIPTOR_MIN_LENGTH); 
InitializeSecurityDescriptor(psd, SECURITY_DESCRIPTOR_REVISION);
SetSecurityDescriptorDacl(psd, TRUE, NULL, FALSE);

SECURITY_ATTRIBUTES sa = {0};
sa.nLength = sizeof(sa);
sa.lpSecurityDescriptor = psd;
sa.bInheritHandle = FALSE;

HANDLE hEvent = CreateEvent(&sa, TRUE, FALSE, TEXT("Global\\Test"));
LocalFree(psd);
Run Code Online (Sandbox Code Playgroud)

HANDLE hEvent = OpenEvent(SYNCHRONIZE, FALSE, TEXT("Global\\Test"));
Run Code Online (Sandbox Code Playgroud)

  • 谁说安全很容易? (2认同)