Как создать объект SystemAcl из списка управления доступом, представленного в виде строки?

Код из этого вопроса P / Вызывает ConvertStringSecurityDescriptorToSecurityDescriptorW() функцию WinAPI для преобразования следующей магической строки

S:(ML;;NW;;;LW)

в объект дескриптора безопасности, который затем используется для установки контроля доступа к именованному каналу. Магическая строка на самом деле является так называемым системным списком управления доступом, также упоминаемым как SACL или системный ACL в MSDN.

Я пытаюсь использовать .NET-класс System.IO.Pipes.PipeSecurity для достижения того же эффекта без P / Invoke. Похоже, мне нужно создать объект SecurityIdentifier, но когда я передаю строковое представление ACL, показанное выше, в конструктор SecurityIdentifier, я получаю ArgumentException, поэтому похоже, что это неправильная строка SDDL.

Я попытался использовать RawSecurityDescriptor, который позже смогу преобразовать в форму SDDL и передать результат преобразования в конструктор SecurityIdentifier. Если я построю RawSecurityDescriptor из приведенной выше строки, я получу дескриптор с пустым SACL (метод получения SystemAcl возвращает S:). Однако у RawSecurityDescriptor есть сеттер для SystemAcl, так что, возможно, я смогу создать его сам и назначить его полю SystemAcl.

Я просмотрел довольно много примеров и до сих пор не могу понять, как преобразовать строку, показанную выше, в SystemAcl. Есть ли какое-нибудь описание того, как эти партии заглавными буквами следует интерпретировать и преобразовывать в SystemAcl?


person sharptooth    schedule 12.11.2020    source источник
comment
Вас интересует общий случай или конкретно эта строка?   -  person Evk    schedule 12.11.2020
comment
@Evk Любой из них поможет. Я нашел это объяснение строк ACE docs.microsoft.com/en -us / windows / win32 / secauthz / ace-strings, и я понимаю, когда эта строка означает, но я не могу понять, как ее перевести во что-нибудь пригодное для использования.   -  person sharptooth    schedule 12.11.2020
comment
в чем вопрос / проблема? вы хотите установить (а лучше просто создать) объект с низкой обязательной меткой или что является целью?   -  person RbMm    schedule 12.11.2020
comment
@RbMm NamedPipeServerStream принимает PipeSecurity объект. Было бы неплохо, если бы конвейерный сервер запускался в обычном процессе, чтобы он принимал запросы от процессов с низким уровнем целостности.   -  person sharptooth    schedule 13.11.2020
comment
@sharptooth - я не знаю .net, и как это сделать в такой среде, но это очень легко сделать в win32 / native api   -  person RbMm    schedule 13.11.2020
comment
@RbMm Я связался с ответом, который содержит код, который P / вызывает функции WinAPI для достижения того же эффекта.   -  person sharptooth    schedule 13.11.2020
comment
@sharptooth - не нужен вызов SetSecurityInfo или SetKernelObjectSecurity - нужно с самого начала создать канал с дескриптором безопасности. ConvertStringSecurityDescriptorToSecurityDescriptor правильно используется для преобразования строковой формы в двоичную. и чем нужно использовать это внутри SECURITY_ATTRIBUTES   -  person RbMm    schedule 13.11.2020