Я должен добавить пояснение к другим ответам и предупреждение безопасности.
Во-первых, передача значения NULL в качестве аргумента lpSemaphoreAttributes
для ::CreateSemaphore()
означает , а не означает отсутствие доступа ни к кому;скорее это означает, что будет назначено управление доступом по умолчанию. MSDN кристально чист на этом : Если этот параметр имеет значение NULL, семафор получает дескриптор безопасности по умолчанию.ACL-списки в дескрипторе безопасности по умолчанию для семафора происходят из основного маркера или маркера олицетворения создателя.
Обычно семафор может открываться и использоваться одним и тем же идентификатором пользователя.Таким образом, если семафор используется совместно процессами, выполняющимися в одном и том же интерактивном сеансе или под одним и тем же идентификатором службы, он может быть открыт другим процессом, даже если он создан с дескриптором безопасности по умолчанию.Как уже отмечалось @hmjd, вы всегда должны явно вызывать право, которое вы хотите отстаивать на семафоре: SYNCHRONIZE|SEMAPHORE_MODIFY_STATE
позволяет как ждать, так и освободить его.
Во-вторых, слово предостережения.Предоставляя всем полный доступ к семафору, как это было предложено выше, потенциально создается дыра в безопасности для DoS-атаки.Вы должны подумать, хотите ли вы, чтобы произвольные процессы могли захватывать и освобождать семафор.Предназначено ли оно для неограниченного публичного использования?Хорошей практикой всегда является назначение минимальных, узко разрешенных списков ACL для объектов.Использование SDDL , вероятно, является самым простым способом кодирования дескриптора безопасности, хотя сам скрипт не очень удобочитаем.