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

时间:2013-09-19 09:19:34

标签: windows winapi service

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

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

我正在我的服务中创建此活动

CreateEvent(NULL,             真正,             假,             TEXT( “测试”))

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

OpenEvent(EVENT_ALL_ACCESS,            真正,            TEXT( “测试”))

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

更新

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

2 个答案:

答案 0 :(得分:4)

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

请参阅MSDN上的Kernel object namespaces中的示例和说明:

  

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

     

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

另见:

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

答案 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"));