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