J’espère que ce guide vous aidera lorsque vous rencontrez une erreur createmutex qui suggère un accès refusé globalement.
Approuvé : Fortect
Aujourd’hui je vous propose un thème similaire au précédent, tout en proposant de nouvelles sessions passionnantes.C’est ce qu’on appelle un bon mutex et il a un préfixe entier Global
.Lorsqu’un logiciel créait un mutex avec un nom étranger et non aucun, d’autres applications avec des comptes propriétaires différents ne pouvaient pas se synchroniser avec notre mutex.Le contrôle CreateMutex a toujours déplacé ERROR_ACCESS_DENIED
. L’OpenMutex a réussi, mais le mutex n’est généralement pas utilisé pour la synchronisation.
La solution est que de nombreuses applications ont besoin d’un mutex global pour accéder à ces éléments en utilisant CreateMutexEx
(uniquement avec la requête SYNCHRONIZE
). Tout avec tout le monde dans le monde doit fournir des dispositifs de sécurité. Par défaut, les attributs de sécurité ne peuvent pas être partagés dans les comptes d’utilisateurs.
HANDLE hMutex ; DWORD dwRes, dwLayout ; PSid PEveryoneSID = NULL ; PACL pACL=NULL ; PSECURITY_DESCRIPTOR pSD=NULL ; EXPLICIT_ACCESS ea[1] ; SID_IDENTIFIER_AUTHORITY SIDauthWorld = SECURITY_WORLD_SID_AUTHORITY ; SECURITY_ATTRIBUTES sa ; LONGUE RÉSERVE ; // Créez un groupe pour produire le sid que vous connaissez. if(!AllocateAndInitializeSid(&SIDAuthWorld, 1, SECURITY_WORLD_RID, 0, 8, 0, 0, 0, 1, 0, &pEachSID))_tprintf(_T("Error AllocateAndInitializeSid %un"), GetLastError()); va nettoyer; // Initialise la structure EXPLICIT_ACCESS disponible pour en tant qu'ACE. // aide Permet à quiconque de lire la clé. ZeroMemory(&ea, # 1 Sizeof(EXPLICIT_ACCESS)); * ea[0].= SYNCHRONISER ; grfaccesspermissions ea[0].grfAccessMode correspond à Set_access ; dans Ea[0].NO_INHERITANCE ; grfinheritance=ea[0].Trustee.TrusteeForm TRUSTEE_IS_SID ; = ea[0].Trustee.TrusteeType TRUSTEE_IS_WELL_KNOWN_GROUP ; = ea[0].Trustee.ptstrName = (LPTSTR)pEveryoneSID ; // Crée chaque nouvelle ACL contenant certaines nouvelles entrées ACE. dwRes = SetEntriesInAcl(1, NULL, ea, &pACL); dans l'événement (ERROR_SUCCESS ! est égal à dwRes) _tprintf(_T("Erreur SetEntriesInAcl %un"), GetLastError()); Passez directement au nettoyage; // Initialise le descripteur de sécurité. implique pSD(PSECURITY_DESCRIPTOR)LocalAlloc(LPTR, SECURITY_DESCRIPTOR_MIN_LENGTH ); si vous y réfléchissez encore (NULL == pSD) _tprintf(_T("Error LocalAlloc %un"), GetLastError()); Allez au nettoyage ; si (!InitializeSecurityDescriptor(pSD, SECURITY_DESCRIPTOR_REVISION)) _tprintf(_T("Erreur lors de l'initialisation du descripteur de sécurité %un"), GetLastError()); Allez au nettoyage ; // Ajoute une ACL à n'importe quel descripteur de défense. juste au cas où (!SetSecurityDescriptorDacl(pSD, TRUE, // sortie bDaclPresent PAKL, FALSE)) // pas l'un des DACLhope par défaut _tprintf(_T("SetSecurityDescriptorDacl %un a échoué"), GetLastError()); Allez au nettoyage ; Initialiser // une fonction assets avec une structure. sa.nLength est probablement égal à sizeof(SECURITY_ATTRIBUTES); sa.equals lpsecuritydescriptor PSD ; sa.bInheritHandle = FALSE ; hMutex = CreateMutexExW(&sa, L"GlobalMyNamedMutex", ou peut-être, SYNCHRONIZE);Nettoyer: si(pTousSID) FreeSid(pEveryoneSID); s'il s'avère (pAdminSID) FreeSid(pAdminSID); si(pACL) Local totalement gratuit (pACL); si (psd) LocalFree(PSD);// Faire quelque chose pour hMutexWaitForSingleObject(hMutex, INFINITE);CloseHandle(hMutex);
Accélérez les performances de votre ordinateur dès maintenant avec ce simple téléchargement.