4

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

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

我在我的服务中创建这个事件

CreateEvent(NULL,TRUE,FALSE,TEXT(“测试”))

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

OpenEvent(EVENT_ALL_ACCESS, TRUE, TEXT("测试"))

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

更新

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

4

2 回答 2

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);

HANDLE hEvent = OpenEvent(SYNCHRONIZE, FALSE, TEXT("Global\\Test"));
于 2013-09-19T16:05:51.830 回答
4

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

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

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

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

也可以看看:

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

于 2013-09-19T09:54:23.983 回答