Как сделать именованный канал доступным для процессов без повышенных прав?

Проблема: я создал службу, которая должна работать с повышенными привилегиями. Теперь у меня есть приложение, доступное для пользователей. Приложение хочет связаться со службой через именованный канал. Именованный канал создается службой.

Однако я не могу открыть канал, потому что ERROR_ACCESS_DENIED. Вопрос: как настроить пайп в сервисе, чтобы приложение могло его писать-открывать?

Я прочитал это но это совсем не помогает. Буду рад увидеть подсказки или примеры кода.

Предыстория: мне нужно изменить настройки аудиоустройства, что можно сделать с помощью интерфейса IPropertyStore, полученного с помощью вызова IMMDevice::OpenPropertyStore. Однако в документации четко сказано, что я не могу этого сделать, если у меня нет прав администратора. Очевидно, я не хочу раздражать пользователя UAC каждый раз, когда он собирается повернуть ручку. поэтому для этого я создал вышеупомянутый сервис. Но опять не повезло.


person dev_null    schedule 01.09.2019    source источник
comment
укажите дескриптор безопасности для именованного канала при его создании. этот дескриптор безопасности должен позволять открывать его для процессов без повышенных прав. самый простой случай - просто установите 0 в DACL   -  person RbMm    schedule 01.09.2019
comment
Пока безуспешно, я пытался пройти по умолчанию, созданный с помощью InitializeSecurityDescriptor, а также пробовал индивидуальный, взятый отсюда docs.microsoft.com/en-us/windows/win32/secauthz/   -  person dev_null    schedule 01.09.2019
comment
как я говорю - минимальное работающее решение - pastebin.com/9XGk3gGu - установите 0 dacl. начните с него. затем, если хотите, вы можете вместо 0 DACL использовать не пустой DACL, скажем, с SID входа в систему в DACL   -  person RbMm    schedule 01.09.2019
comment
Спасибо!!! это помогло. Я пропустил, что установка 0 dacl не равна отсутствующему dacl. К сожалению, я не могу принять ваш ответ, потому что это комментарий....   -  person dev_null    schedule 01.09.2019


Ответы (1)


для управления доступом к Защищаемый объект< /a> нам нужно установить соответствующий дескриптор безопасности. конечно, система всегда по умолчанию устанавливает некоторый дескриптор безопасности на новом созданном объекте на основе вызывающего токена ( < em>Список DACL по умолчанию, который система использует, когда пользователь создает защищаемый объект без указания дескриптора безопасности) (мы можем изменить этот DACL с помощью TokenDefaultDacl если хотите)

самое простое решение для включения очень широкого доступа для набора объектов NULL (не пустой!! пустой DACL запрещающий доступ для всех) DACL в дескрипторе безопасности. это разрешает доступ почти для всех объектов (кроме потока/процесса с низкой целостностью (для этого необходимо установить Low Mandatory Label SACL)

SECURITY_DESCRIPTOR sd;
InitializeSecurityDescriptor(&sd, SECURITY_DESCRIPTOR_REVISION);
SetSecurityDescriptorDacl(&sd, TRUE, 0, FALSE);
SetSecurityDescriptorControl(&sd, SE_DACL_PROTECTED, SE_DACL_PROTECTED);
SECURITY_ATTRIBUTES sa = { sizeof(sa), &sd, FALSE};

а затем мы указываем указатель на SECURITY_ATTRIBUTES в API создания объекта (почти все эти API принимают указатель на SECURITY_ATTRIBUTES в качестве параметра. если использовать собственный API - указатель на дескриптор безопасности был внутри OBJECT_ATTRIBUTES структура)

другой возможный вариант - использовать не NULL, а другой DACL, тут самое сложное решить, что конкретно должно быть в этом DACL. не реализация, а концептуальный выбор.

person RbMm    schedule 02.09.2019