正常应用程序中的信号量在服务首次创建时被拒绝访问

时间:2015-02-04 12:45:41

标签: c++ ms-access semaphore

我在库中创建一个由普通应用程序和服务使用的全局信号量。 如果我在服务之前运行我的正常应用程序,一切都很顺利,但是如果我改变顺序(我的意思是,在应用程序之前运行服务),当我尝试创建或打开现有的信号量时,我将在正常应用程序中获得访问被拒绝错误。 我在信号量创建期间设置了SEMAPHORE_ALL_ACCESS,但它并没有解决问题。以一种荒谬的方式,我还添加了SYNCHRONIZE和SEMAPHORE_MODIFY_STATE(通过|操作数),但它没有'也解决了这个问题。

你知道吗? 我使用的是Windows 8.1(x64)并运行32位版本的服务和应用程序。

1 个答案:

答案 0 :(得分:0)

您需要降低资源的完整性级别,尝试使用此类内容进行创建。

 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