当信号量首次由服务创建时,普通应用程序中的信号量被拒绝访问

Access denied for a semaphore in a normal application, when it was first created by a service

我在普通应用程序和服务使用的库中创建了一个全局信号量。 如果我在服务之前 运行 我的正常应用程序,一切都很好,但是如果我更改顺序(我的意思是,在应用程序之前 运行 宁服务),我将在正常应用程序中遇到访问被拒绝的错误我试图创建或打开现有的信号量。 我在创建信号量时设置了SEMAPHORE_ALL_ACCESS,但并没有解决问题。可笑的是,我还添加了 SYNCHRONIZE 和 SEMAPHORE_MODIFY_STATE(通过 | 操作数),但它也没有解决问题。

你有什么想法吗? 我正在使用 windows 8.1 (x64) 和 运行 32 位版本的服务和应用程序。

您需要降低资源的完整性级别,尝试这样创建。

 SECURITY_DESCRIPTOR sd;
 SECURITY_ATTRIBUTES sa;

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

 if(InitializeSecurityDescriptor(&sd,  SECURITY_DESCRIPTOR_REVISION))
 {
     if(SetSecurityDescriptorDacl(&sd, TRUE, (PACL) NULL, FALSE))   
     {
         PSECURITY_DESCRIPTOR pSD = NULL;   

         // Try to lower Integrity, if OS is Vista or higher        
         if(bIsOSVistaOrLater)
         {
             if(ConvertStringSecurityDescriptorToSecurityDescriptor("S:(ML;;NW;;;LW)", SDDL_REVISION_1, &pSD, NULL))
             {
                  PACL pSacl = NULL;
                  BOOL fSaclPresent = FALSE;
                  BOOL fSaclDefaulted = FALSE;
                  if(GetSecurityDescriptorSacl(pSD, &fSaclPresent, &pSacl, &fSaclDefaulted) )
                  {
                      if(SetSecurityDescriptorSacl(sa.lpSecurityDescriptor, TRUE, pSacl, FALSE))
                      {
                         ... = CreateSemaphore(&sa, 1, 1, "xpto");

                      }                      
                  }              
              }
         }          
         else
         {
            ... = CreateSemaphore(&sa, 1, 1, "xpto");           
         }
     }
 }

您可以阅读更多相关信息:here