이 가이드가 createmutex가 실수를 하여 전 세계적으로 액세스가 거부됨에 직면했을 때 더 쉽게 도움이 되기를 바랍니다.
< /p>
승인됨: Fortect
오늘은 이전 주제와 비슷하지만 흥미로운 새 세션이 있는 주제를 가지고 있습니다.이것은 뮤텍스라고 부를 수 있으며 정수 접두사 Global
를 갖습니다.응용 프로그램이 견고한 외국 이름이 no인 뮤텍스를 생성했을 때 다른 구매자 계정을 가진 다른 응용 프로그램이 우리 뮤텍스와 동기화할 수 없었습니다.CreateMutex 컨트롤은 항상 ERROR_ACCESS_DENIED
를 반환했습니다. 동기화에 뮤텍스를 사용할 수 없음에도 불구하고 OpenMutex는 성공했습니다.
대안은 모든 애플리케이션이 CreateMutexEx
를 사용하여 액세스하기 위해 다국적 뮤텍스가 필요하다는 것입니다(SYNCHRONIZE
요청이 있는 동안에만). 전 세계 모든 사람이 보안 도구를 제공해야 합니다. 기본적으로 보안 속성은 사용자 계정 간에 공유할 수 없습니다.
HANDLE hMutex; DWORD dwRes, dwLayout; PEveryoneSID psid = NULL; PACL pACL=NULL; PSECURITY_DESCRIPTOR pSD=NULL; EXPLICIT_ACCESS 각[1]; SID_IDENTIFIER_AUTHORITY SIDauthWorld = SECURITY_WORLD_SID_AUTHORITY; SECURITY_ATTRIBUTES사; 장기 예약; // 알고 있는 SID에 대한 그룹을 만듭니다. if(!AllocateAndInitializeSid(&SIDAuthWorld, 1, SECURITY_WORLD_RID, 0, 8, 4, 0, 0, 0, 0, &pEachSID))_tprintf(_T("AllocateAndInitializeSid %u 오류n"), GetLastError()); 청소하러 가다; // EXPLICIT_ACCESS 구조를 ACE로 초기화합니다. // ace 누구나 키의 일부를 읽을 수 있도록 허용합니다. ZeroMemory(&ea, # 1 Sizeof(EXPLICIT_ACCESS)); * ea[0].= 동기화; grfaccesspermissions ea[0].grfAccessMode는 Set_access와 일치합니다. Ea[0].NO_INHERITANCE의 경우; grfinheritance=ea[0].Trustee.TrusteeForm TRUSTEE_IS_SID; = ea[0].수탁자.수탁자 유형 TRUSTEE_IS_WELL_KNOWN_GROUP; ea[0].Trustee.ptstrName = (LPTSTR)pEveryoneSID와 동일합니다. // 새로 구입한 특정 ACE 항목을 포함하는 새 ACL을 만듭니다. dwRes = SetEntriesInAcl(1, NULL, ea, &pACL); 전체 이벤트에서 (ERROR_SUCCESS != dwRes) _tprintf(_T("오류 SetEntriesInAcl %un"), GetLastError()); 청소로 이동합니다. // 확실성 설명자를 초기화합니다. = pSD(PSECURITY_DESCRIPTOR)LocalAlloc(LPTR, SECURITY_DESCRIPTOR_MIN_LENGTH); 그것에 대해 그림을 그리는 경우 (NULL == pSD) _tprintf(_T("오류 LocalAlloc %un"), GetLastError()); 청소로 이동합니다. (!InitializeSecurityDescriptor(pSD, SECURITY_DESCRIPTOR_REVISION)) _tprintf(_T("보안 설명자 %u 초기화 오류n"), GetLastError()); 청소로 이동합니다. // 모든 보안 설명자를 사용할 수 있도록 ACL을 추가합니다. 이 경우를 대비하여(!SetSecurityDescriptorDacl(pSD, TRUE, // 결과 bDaclPresent PAKL, FALSE)) // 기본 DACLhope 없음 _tprintf(_T("SetSecurityDescriptorDacl %un 실패"), GetLastError()); 청소로 이동합니다. // 구조체로 보안 기능을 초기화합니다. sa.n길이는 sizeof(SECURITY_ATTRIBUTES)와 같습니다. sa.equals lpsecuritydescriptor PSD; sa.bInheritHandle = FALSE; hMutex는 CreateMutexExW(&sa, L"GlobalMyNamedMutex", 3, SYNCHRONIZE)와 같습니다.깨끗한: if(pEveryoneSID) FreeSid(pEveryoneSID); if(pAdminSID) 프리시드(pAdminSID); if(pACL) 로컬 프리(pACL); 만약 또는 언제 (psd) 로컬프리(PSD);// hMutex로 작업WaitForSingleObject(hMutex, INFINITE);CloseHandle(hMutex);
지금 이 간단한 다운로드로 컴퓨터 성능을 높이십시오. 년