Я считал все связанные темы и не нашел полное решение моей проблемы.
Я хотел бы дать полные полномочия СИСТЕМЕ и 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.
Я буду рад получить любое решение, включая решения с пользовательскими действиями...
вам необходимо реализовать отложенное настраиваемое действие для изменения разрешений. Пример настраиваемого действия 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