2015-02-04 2 views
0

일반 응용 프로그램과 서비스에서 사용하는 라이브러리에 전역 세마포를 만듭니다. 서비스 이전에 정상적인 응용 프로그램을 실행하면 모든 문제가 발생하지만 응용 프로그램을 실행하기 전에 서비스를 실행하는 순서를 변경하면 기존 응용 프로그램을 만들거나 열려고하면 액세스가 거부됩니다. 신호기. 세마포어 작성 중에 SEMAPHORE_ALL_ACCESS를 설정했지만 문제가 해결되지 않습니다. 우스운 방법으로, 필자는 SYNCHRONIZE와 SEMAPHORE_MODIFY_STATE (피연산자로)를 추가하지만, 문제를 해결하지는 못한다.일반 응용 프로그램에서 세마포어가 액세스가 처음 거부되었을 때 액세스가 거부되었습니다.

의견이 있으십니까? Windows 8.1 (x64)을 사용하고 32 비트 버전의 서비스와 응용 프로그램을 실행합니다.

+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

+0

감사를 원하는 경우 예, 무결성을 낮출 필요가 나는 것 내 문제가 Windows 보안 설명자와 관련이 있음을 발견했습니다. –