我创建了一个Windows服务。我正在创建一个事件“测试”。我想使用我的应用程序设置/重置相同的事件对象。但我似乎没有通过我的应用程序获取事件对象的句柄。但是可以看到事件列在BaseNamed对象中。
我想我需要对创建事件的安全属性做一些事情。
我正在我的服务中创建此活动
CreateEvent(NULL, 真正, 假, TEXT( “测试”))
并在我的应用程序中使用OpenEvent。
OpenEvent(EVENT_ALL_ACCESS, 真正, TEXT( “测试”))
请建议我需要做出哪些更改,以便我的应用程序获得处理。
更新
更换TEXT("Test") with TEXT("Global\\Test")
后。我仍然没有得到Event对象句柄。
是的,现在至少它识别出错误返回(拒绝访问)的事件对象的存在。它之前收到错误返回(系统找不到指定的文件)。
正如我所说,我认为这里有一些安全方面。
这是我发现的:当会话在会话0中创建事件时。它不能由我在Session 1中创建的应用程序继承。为此,在创建Event对象时,我需要指定一个安全属性结构。适当的安全调度员这样做。
有人能告诉我怎么做吗?
答案 0 :(得分:4)
服务和应用程序可能在不同的会话中运行,您需要使用“全局”内核对象命名空间前缀来使服务和应用程序都可以看到该对象。
请参阅MSDN上的Kernel object namespaces中的示例和说明:
单独的客户端会话命名空间允许多个客户端运行 相同的应用程序不会相互干扰。对于 进程在客户端会话下启动,系统使用会话 命名空间默认。但是,这些过程可以使用全局 通过在对象名称前加上“Global \”前缀来命名空间。对于 例如,以下代码调用CreateEvent并创建一个事件 全局命名空间中名为CSAPP的对象:
CreateEvent( NULL, FALSE, FALSE, "Global\\CSAPP" );
另见:
由于默认事件安全性可能会拒绝来自应用程序的访问,因此您需要在创建事件后立即更新它,并且您已准备好公开它。
SetSecurityDescriptorDacl
和朋友。答案 1 :(得分:4)
试试这个:
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"));