WIX: Предоставление Полномочий к папке

Я считал все связанные темы и не нашел полное решение моей проблемы.

Я хотел бы дать полные полномочия СИСТЕМЕ и Read и Выполнить полномочия Группе пользователей к папке под Программными файлами. Ничто больше, ничто меньше.

Я знаю, что существует 3 способа дать полномочия папке с помощью WIX, ни один из них не действительно хорош для меня, и я объясню почему:

1) Регулярный элемент Разрешения:

    <CreateFolder Directory="Test">
      <Permission User="SYSTEM" GenericAll="yes"/>
      <Permission User="Users" Domain="[LOCAL_MACHINE_NAME]" 
      GenericRead="yes" Read="yes" GenericExecute="yes" ChangePermission="yes"/>
    </CreateFolder>

Проблема: Это перестало работать на внешней ОС, так как это не делает знает "Пользовательское" ключевое слово. Я попробовал его SID также. Около этого я должен поместить элемент Разрешения под каждым файлом в каталоге Test (но если бы это было единственным случаем, я справился бы),

2) Элемент WixUtilsExtension PermissionEx:

    <CreateFolder Directory="Test">
      <util:PermissionEx User="SYSTEM" GenericAll="yes"/>
      <util:PermissionEx User="Users" Domain="[LOCAL_MACHINE_NAME]" 
      GenericRead="yes" Read="yes" GenericExecute="yes" ChangePermission="yes"/>
    </CreateFolder>

Проблема: папка также сохраняет полномочия по умолчанию папки Program Files. Я не могу позволить это.

3) PermissionEx с Sddl:

Проблема: Этот элемент только доступен при установке с MSI 5.0. Я использую установщик 3.01.

Я буду рад получить любое решение, включая решения с пользовательскими действиями...

18
задан Stein Åsmul 5 August 2014 в 22:04
поделиться

1 ответ

вам необходимо реализовать отложенное настраиваемое действие для изменения разрешений. Пример настраиваемого действия c #:

[CustomAction]
public static ActionResult SetFolderPermission(Session session)
{
     string folder = session.CustomActionData["Folder"].Trim('\"');
     string sid = session.CustomActionData["SID"].Trim('\"');
     System.Security.Principal.SecurityIdentifier sidID =  new System.Security.Principal.SecurityIdentifier(sid);

     System.Security.AccessControl.DirectorySecurity ds = System.IO.Directory.GetAccessControl(folder);
     ds.AddAccessRule(new System.Security.AccessControl.FileSystemAccessRule(sidID 
                , System.Security.AccessControl.FileSystemRights.Write
                , System.Security.AccessControl.InheritanceFlags.ObjectInherit
                , System.Security.AccessControl.PropagationFlags.NoPropagateInherit
                , System.Security.AccessControl.AccessControlType.Allow));
     System.IO.Directory.SetAccessControl(folder , ds);

     return ActionResult.Success;
}

вы можете перенести это на C ++, настраиваемое действие должно быть отложено - тогда вы должны получить доступ к свойствам сеанса с помощью CustomActionData

1
ответ дан 30 November 2019 в 09:03
поделиться
Другие вопросы по тегам:

Похожие вопросы: