winapi - Vista 上的 IPC(服务和应用程序)

标签 winapi windows-vista service ipc

我正在 Vista 上创建一个应用程序,其中包括一个服务和一个控制台应用程序。两者都在同一个用户帐户中运行

在服务中,我正在创建一个事件并等待该事件。在控制台应用程序中,我打开相同的事件(问题从这里开始)并调用 SetEvent 函数。我无法在控制台应用程序中打开事件(出现错误 5,拒绝访问)。我在网上搜索并看到了有关完整性级别的信息(我不确定问题是否与完整性级别有关)。它告诉该服务并且应用程序具有不同的完整性级别。

这是代码的一部分,IPC发生的地方

服务

DWORD
WINAPI IpcThread(LPVOID lpParam)
{
HANDLE ghRequestEvent = NULL ;

ghRequestEvent = CreateEvent(NULL, FALSE,
FALSE, "Global\\Event1") ; //creating the event

if(NULL == ghRequestEvent)
{
//error
}
while(1)
{
WaitForSingleObject(ghRequestEvent, INFINITE) //waiting for the event
//here some action related to event
}
}

控制台应用程序

在应用程序中,打开事件并设置事件
unsigned int
event_notification()
{
HANDLE ghRequestEvent = NULL ;



 ghRequestEvent = OpenEvent(SYNCHRONIZE|EVENT_MODIFY_STATE, FALSE, "Global\\Event1") ;

if(NULL == ghRequestEvent)
{
//error
}
SetEvent(ghRequestEvent) ;
} 

我正在以管理权限运行这两个应用程序(服务和控制台应用程序)(我以管理员身份登录并通过右键单击并使用“以管理员身份运行”选项运行控制台应用程序)。

我在控制台应用程序(我打开事件的地方)中遇到的错误是错误号 5(访问被拒绝。)。

因此,如果您告诉如何在 Vista 中的服务和应用程序之间进行 IPC,这将非常有帮助

提前致谢

纳瓦尼特

最佳答案

服务和应用程序是作为具有不同完整性级别的同一用户运行,还是作为不同用户运行?

如果是前者,那么这篇文章来自MSDN which talks about integrity levels might help .他们有一些用于降低文件完整性级别的示例代码。不过,我不确定这是否与事件相关。

#include <sddl.h>
#include <AccCtrl.h>
#include <Aclapi.h>

void SetLowLabelToFile()
{
  // The LABEL_SECURITY_INFORMATION SDDL SACL to be set for low integrity 
  #define LOW_INTEGRITY_SDDL_SACL_W L"S:(ML;;NW;;;LW)"
  DWORD dwErr = ERROR_SUCCESS;
  PSECURITY_DESCRIPTOR pSD = NULL;    

  PACL pSacl = NULL; // not allocated
  BOOL fSaclPresent = FALSE;
  BOOL fSaclDefaulted = FALSE;
  LPCWSTR pwszFileName = L"Sample.txt";

  if (ConvertStringSecurityDescriptorToSecurityDescriptorW(
         LOW_INTEGRITY_SDDL_SACL_W, SDDL_REVISION_1, &pSD;, NULL)) 
  {
    if (GetSecurityDescriptorSacl(pSD, &fSaclPresent;, &pSacl;, 
         &fSaclDefaulted;))
    {
      // Note that psidOwner, psidGroup, and pDacl are 
      // all NULL and set the new LABEL_SECURITY_INFORMATION
      dwErr = SetNamedSecurityInfoW((LPWSTR) pwszFileName, 
                 SE_FILE_OBJECT, LABEL_SECURITY_INFORMATION, 
                 NULL, NULL, NULL, pSacl);
    }
    LocalFree(pSD);
  }
}

如果是后者,您可以查看此链接 suggests creating a NULL ACL并将它与对象相关联(在示例中它是一个命名管道,但我确定事件的方法类似:
BYTE sd[SECURITY_DESCRIPTOR_MIN_LENGTH];
SECURITY_ATTRIBUTES sa;

sa.nLength = sizeof(sa);
sa.bInheritHandle = TRUE;
sa.lpSecurityDescriptor = &sd;

InitializeSecurityDescriptor(&sd, SECURITY_DESCRIPTOR_REVISION);
SetSecurityDescriptorDacl(&sd, TRUE, (PACL) 0, FALSE);

CreateNamedPipe(..., &sa);

关于winapi - Vista 上的 IPC(服务和应用程序),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/113951/

相关文章:

c - 如何使用 WinAPI 识别光驱中的光盘类型?

windows - 线程等待原因

vb6 - 如何将 VB6 应用程序从 XP 更新到 Vista?

c++ - 警告 LNK4099 : PDB 'vc80.pdb' was not found after switching to vista

java - 两个模块和一项服务。如何处理?

.net - TimeZoneInfo 和 CultureInfo 的 System.DateTime 和缓存

winapi - 为什么我的 Windows 应用程序按照规则不应获得焦点?

windows-vista - Tortoise SVN 图标覆盖显示无处不在......为什么?

android - 服务和 BroadCastReceiver

Android 从后台服务更新 arrayadapter 数据