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