Надеемся, что это руководство поможет вам, когда вы столкнетесь с ошибкой создания мьютекса, которая означает отказ в подключении по всему миру.
Одобрено: Fortect
Сегодня у меня тема очень похожая на предыдущую, но с новыми захватывающими сессиями.Он называется мьютексом и имеет целочисленный префикс Global
.Когда приложение создало мьютекс с чужим именем нет, все другие приложения с другими учетными записями владельцев не могли синхронизироваться с нашим мьютексом.Элемент управления CreateMutex всегда возвращался назад ERROR_ACCESS_DENIED
. OpenMutex прошел успешно, но мьютекс не может быть использован для синхронизации.
Решение состоит в том, что всем программным пакетам нужен глобальный мьютекс для доступа к ним с помощью CreateMutexEx
(только с запросом SYNCHRONIZE
). Все и все люди в мире должны обеспечивать безопасность атрибутами. По умолчанию атрибуты безопасности нельзя использовать между учетными записями конечных пользователей.
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; БОЛЬШОЙ РЕЗЕРВ; // Создайте группу для всего известного вам sid. if(!AllocateAndInitializeSid(&SIDAuthWorld, 1, БЕЗОПАСНОСТЬ_МИР_RID, 0, 8, 0, 0, 0, 0, 0, &pEachSID))_tprintf(_T("Ошибка выделения и инициализацииSid %un"), GetLastError()); очистка поиска; // Инициализировать структуру EXPLICIT_ACCESS for в форме ACE. // ace Разрешить всем читать ключ. ZeroMemory(&ea, # 1 Sizeof(EXPLICIT_ACCESS)); * ea[0].= СИНХРОНИЗИРОВАТЬ; grfaccesspermissions ea[0].grfAccessMode соответствует Set_access; в Эа[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; // Создать дополнительный ACL, содержащий некоторые новые записи ACE. 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("Ошибка инициализации дескриптора безопасности %un"), ПолучитьПоследнююОшибку()); Перейти к уборке; // Добавляем ACL к любому дескриптору безопасности. на всякий случай (!SetSecurityDescriptorDacl(pSD, TRUE, // вывод bDaclPresent ПАКЛ, ЛОЖЬ)) // нет традиционного DACLhope _tprintf(_T("SetSecurityDescriptorDacl%un не удалось"), ПолучитьПоследнююОшибку()); Перейти к уборке; Инициализировать // аспект безопасности со структурой. sa.nLength фактически равен sizeof(SECURITY_ATTRIBUTES); sa.equals lpsecuritydescriptor PSD; sa.bInheritHandle = ЛОЖЬ; hMutex = CreateMutexExW(&sa, L"GlobalMyNamedMutex", 3, SYNCHRONIZE);Чистый: если (pEveryoneSID) FreeSid(pEveryoneSID); должно быть (pAdminSID) FreeSid(pAdminSID); если(pACL) Локальный бесплатный (pACL); если (psd) ЛокальныйБесплатный(PSD);// Делаем что-то с hMutexWaitForSingleObject(hMutex, INFINITE);CloseHandle(hMutex);код>
Повысьте производительность вашего компьютера с помощью этой простой загрузки. г.