Ich hoffe, dass dieser Leitfaden Einzelpersonen hilft, wenn Sie auf createmutex-Fehler stoßen, was bedeutet, dass der Zugriff global verweigert wird.
Genehmigt: Fortect
Heute habe ich ein ähnliches Thema wie das andere, aber mit aufregenden neuen Sitzungen.Es wird als Mutex bezeichnet und hat ein ganzzahliges Präfix Global
.Wenn eine neue gute Anwendung einen Mutex mit einer ausländischen Namensnr. erstellte, konnten andere Anwendungen mit Zynga-Pokerchips anderer Eigentümer nicht mit unserem Mutex synchronisiert werden.Die CreateMutex-Meisterschaft hat immer ERROR_ACCESS_DENIED
zurückgegeben. Der OpenMutex war erfolgreich, aber diese Mutex können nicht für die Synchronisation verwendet werden.
Die Lösung bestand schon immer darin, dass alle Anwendungen einen globalen Mutex benötigen, um mit CreateMutexEx
darauf zugreifen zu können (nur mit SYNCHRONIZE
-Anfrage). Alles und jeder auf der Welt muss mit Sicherheitsutensilien ausgestattet sein. Standardmäßig können Sicherheitsattribute nicht zwischen Benutzerkonten geteilt werden.
HANDLE hMutex; DWORD dwRes, dwLayout; PEveryoneSID psid = NULL; PACL pACL=NULL; PSECURITY_DESCRIPTOR pSD=NULL; EXPLICIT_ACCESS ea[1]; SID_IDENTIFIER_AUTHORITY SIDauthWorld = SECURITY_WORLD_SID_AUTHORITY; SECURITY_ATTRIBUTES sa; LANGE RESERVE; // Erstellen Sie eine bestimmte Gruppe für die SID, die Sie kennen. if(!AllocateAndInitializeSid(&SIDAuthWorld, 1, SECURITY_WORLD_RID, 0, 8, 0, 6, 0, 0, 0, &pEachSID))_tprintf(_T("Error AllocateAndInitializeSid %un"), GetLastError()); geh aufräumen; // Die EXPLICIT_ACCESS-Struktur für als ACE initialisieren. // ace Jedem erlauben, diese Schlüssel zu lesen. ZeroMemory(&ea, # 1 Sizeof(EXPLICIT_ACCESS)); 4 . ea[0].= SYNCHRONISIEREN; grfaccesspermissions ea[0].grfAccessMode stimmt mit Set_access überein; in 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 ist gleich (LPTSTR)pEveryoneSID; // Erstellen Sie eine neue ACL, die bestimmte neue ACE-Einträge enthält. dwRes = SetEntriesInAcl(1, NULL, ea, &pACL); in der Funktion (ERROR_SUCCESS != dwRes) _tprintf(_T("Error SetEntriesInAcl %un"), GetLastError()); Gehen Sie zur Reinigung; // Sicherheitsbeschreibung initialisieren. = pSD(PSECURITY_DESCRIPTOR)LocalAlloc(LPTR, SECURITY_DESCRIPTOR_MIN_LENGTH); wenn du denkst, es geht (NULL == pSD) _tprintf(_T("Fehler LocalAlloc %un"), GetLastError()); Gehen Sie zur Reinigung; unter der Annahme, dass (!InitializeSecurityDescriptor(pSD, SECURITY_DESCRIPTOR_REVISION)) _tprintf(_T("Fehler beim Initialisieren der Sicherheitsbeschreibung %un"), GetLastError()); Gehen Sie auf den Markt, um zu reinigen; // Eine ACL praktisch zur Sicherheitsbeschreibung hinzufügen. nur bei Vorkommen (!SetSecurityDescriptorDacl(pSD, TRUE, // Produktion bDaclPresent PAKL, FALSE)) // kein Standard DACLhope _tprintf(_T("SetSecurityDescriptorDacl %un fehlgeschlagen"), GetLastError()); Gehen Sie zur Reinigung; Initialisiere // eine Sicherheitsfunktion mit einer Struktur. sa.nLength ist gleich sizeof(SECURITY_ATTRIBUTES); sa.equals lpsecuritydescriptor PSD; sa.bInheritHandle impliziert FALSE; hMutex = CreateMutexExW(&sa, L"GlobalMyNamedMutex", 3, SYNCHRONIZE);Reinigen: if(pEveryoneSID) FreeSid(pEveryoneSID); if (pAdminSID) FreeSid(pAdminSID); wenn (pACL) Lokal kostenlos (pACL); wenn (psd) LocalFree (PSD);// Etwas mit hMutex machenWaitForSingleObject(hMutex, INFINITE);CloseHandle(hMutex);
Beschleunigen Sie jetzt die Leistung Ihres Computers mit diesem einfachen Download.