2010-02-14 42 views
16

Tôi đã đọc tất cả các chủ đề liên quan và chưa tìm thấy câu trả lời đầy đủ cho vấn đề của mình.WIX: Cấp quyền cho một thư mục

Tôi muốn cấp quyền đầy đủ cho SYSTEM và Đọc & Cấp quyền cho nhóm Người dùng vào thư mục trong Tệp chương trình. Không hơn không kém.

Tôi biết có 3 cách để cung cấp cho quyền truy cập vào thư mục sử dụng WIX, không ai trong số đó là thực sự tốt cho tôi và tôi sẽ giải thích tại sao:

1) yếu tố Permission Regular:

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

Sự cố: Không thành công trên hệ điều hành nước ngoài vì nó không biết từ khóa "Người dùng". Tôi đã thử nó với SID là tốt. Bên cạnh đó tôi cần phải đặt yếu tố Permission dưới mỗi tập tin trong thư mục Test (nhưng nếu điều này là trường hợp duy nhất, tôi sẽ quản lý)

yếu tố

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> 

Sự cố: Thư mục cũng giữ quyền mặc định của thư mục Tệp Chương trình. Tôi không thể cho phép điều đó.

3) PermissionEx với SĐL:

Vấn đề: yếu tố này chỉ có sẵn khi cài đặt với MSI 5.0. Tôi đang sử dụng trình cài đặt 3.01.

Tôi sẽ rất vui khi nhận được bất kỳ giải pháp, trong đó có giải pháp với hành động tùy chỉnh ...

Trả lời

1

bạn cần phải thực hiện hành động tùy chỉnh thu nhập hoãn lại việc thay đổi quyền. c dụ # tùy chỉnh hành động:

[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; 
} 

bạn có thể cổng mà trên C++, hành động tùy chỉnh phải được hoãn lại - hơn là bạn phải truy cập vào tài sản phiên của bạn bằng cách CustomActionData

2

Một lựa chọn khác sẽ có một CA đơn giản mà sẽ chỉ dịch một thuộc tính msi có chứa SID thành tên thực của nhóm từ hệ điều hành được bản địa hoá. CA không phải được hoãn lại và nó không làm công việc thực tế của việc thiết lập các điều khoản.

Dưới đây là mẫu CA đọc giá trị của thuộc tính PROPERTY_TO_BE_TRANSLATED msi và dịch thuộc tính msi được chỉ định bởi nó. Bằng cách này bạn có thể chạy CA để dịch các thuộc tính msi khác nhau.

[CustomAction] 
    public static ActionResult TranslateSidToName(Session session) 
    { 
    var property = session["PROPERTY_TO_BE_TRANSLATED"]; 
    if (String.IsNullOrEmpty(property)) 
    { 
     session.Log("The {0} property that should say what property to translate is empty", translateSidProperty); 
     return ActionResult.Failure; 
    } 
    var sid = session[property]; 
    if (String.IsNullOrEmpty(sid)) 
    { 
     session.Log("The {0} property that should contain the SID to translate is empty", property); 
     return ActionResult.Failure; 
    } 
    try 
    { 
     // convert the user sid to a domain\name 
     var account = new SecurityIdentifier(sid).Translate(typeof(NTAccount)).ToString(); 
     session[property] = account; 
     session.Log("The {0} property translated from {1} SID to {2}", property, sid, account); 
    } 
    catch (Exception e) 
    { 
     session.Log("Exception getting the name for the {0} sid. Message: {1}", sid, e.Message); 
     return ActionResult.Failure; 
    } 
    return ActionResult.Success; 
    } 

Trong WiX bạn xác định các thuộc tính được dịch bằng cách sử dụng SID for the accounts:

<Property Id="AdminAccount" Value="S-1-5-32-544" /> 
    <Property Id="EveryoneAccount" Value="S-1-1-0" /> 

Tạo CA sẽ thiết lập thuộc tính PROPERTY_TO_BE_TRANSLATED và sau đó gọi CA làm dịch:

<CustomAction Id="TranslateAdmin_SetProperty" Property="PROPERTY_TO_BE_TRANSLATED" Value="AdminAccount"/> 
<CustomAction Id="TranslateAdmin" BinaryKey="CommonCustomActions" DllEntry="TranslateSidToName" Impersonate="no" /> 
<CustomAction Id="TranslateEveryone_SetProperty" Property="PROPERTY_TO_BE_TRANSLATED" Value="EveryoneAccount" /> 
<CustomAction Id="TranslateEveryone" BinaryKey="CommonCustomActions" DllEntry="TranslateSidToName" Impersonate="no" /> 

Đừng quên sử dụng thuộc tính msi khi đặt quyền:

<CreateFolder>     
    <Permission GenericAll="yes" User="[AdminAccount]" /> 
    <Permission GenericRead="yes" GenericExecute="yes" User="[EveryoneAccount]" /> 
</CreateFolder> 

Cuối cùng, lịch CA trước CreateFolder

<InstallExecuteSequence> 
    <Custom Action='TranslateAdmin_SetProperty' Before='TranslateAdmin' /> 
    <Custom Action='TranslateAdmin' Before='CreateFolders' /> 
    <Custom Action='TranslateEveryone_SetProperty' Before='TranslateEveryone' /> 
    <Custom Action='TranslateEveryone' Before='CreateFolders' /> 
    </InstallExecuteSequence> 

Bằng cách này, CA đang làm chỉ có một số công việc đơn giản, để lại các thiết lập các điều khoản để các yếu tố WiX.

1

Khi <Permission> yếu tố xóa thừa kế quyền từ thư mục cha mẹ, bạn có thể thử sử dụng một <Permission> yếu tố duy nhất cho người sử dụng "Mọi người" hoặc "Quản trị viên" tiếp theo < util: PermissionEx > yếu tố để thiết lập quyền cho tên người dùng mà không được hỗ trợ bởi các yếu tố <Permission>, ví dụ:

<Permission User="Everyone" GenericRead="no" /> 
<util:PermissionEx User="Users" Domain="[LOCAL_MACHINE_NAME]" GenericRead="yes" Read="yes" GenericExecute="yes" ChangePermission="yes" /> 

Nó không phải là cần thiết để thiết lập một cách rõ ràng cho phép HỆ THỐNG, vì đây là những bổ sung tự động bởi trình cài đặt.

6

Sử dụng mã sau để thực hiện việc này mà không cần thao tác tùy chỉnh. Tôi đã xác minh tác phẩm này (cũng trên các thư mục con). Ngoài ra, User Everyone được ánh xạ trên các hệ điều hành windows được bản địa hóa.

<CreateFolder> 
     <Permission User="Everyone" GenericAll="yes" ChangePermission="yes"/> 
</CreateFolder> 
+1

Điều này sẽ không hoạt động đối với miền địa phương không phải của Hoa Kỳ vì "Mọi người" phải được bản địa hóa. – John

+0

Tôi không có bất kỳ vấn đề nào được báo cáo và chúng tôi triển khai cho tất cả các nền văn hóa. Làm thế nào bạn sửa chữa nó? –

6

Tôi đã gặp vấn đề tương tự và nói chuyện với Rob M về vấn đề này. Tôi sẽ làm câu trả lời của Christian G (https://stackoverflow.com/a/5296967/18475), nhưng Rob đã đề xuất sử dụng WixQueryOsWellKnownSID (http://wix.sourceforge.net/manual-wix3/osinfo.htm) để khám phá các địa điểm không thuộc Hoa Kỳ.

Trong tập tin .wxs bạn thêm như sau:

<PropertyRef Id="WIX_ACCOUNT_LOCALSYSTEM" /> 
<PropertyRef Id="WIX_ACCOUNT_USERS" /> 

Và tiếp tục xuống trong file .wxs nơi bạn muốn áp dụng các điều khoản nó chỉ là như thế này:

<Permission GenericAll="yes" User="[WIX_ACCOUNT_LOCALSYSTEM]" /> 
<Permission GenericRead="yes" GenericExecute="yes" User="[WIX_ACCOUNT_USERS]" /> 

Bây giờ khi bạn chạy ánh sáng, bạn chỉ cần liên kết WixUtilExtension.

light -ext WiXUtilExtension ... 

LƯU Ý: Tùy thuộc vào phiên bản của WiX, điều này có thể không được hỗ trợ đầy đủ. Nếu nó không hoạt động cho bạn, có thể có các tùy chọn khác bạn có thể sử dụng để translate SIDs.

+0

Được cảnh báo, tôi nghĩ chúng tôi cần phải trả lời điều này vì một lý do nào đó. – ferventcoder

+0

Điều này không hiệu quả đối với tôi.[WIX_ACCOUNT_USERS] sẽ được giải quyết thành "BUILTIN \ Users" và cấp quyền cho người dùng có tên "BUILTIN". –

+0

Hành vi nói trên chỉ đúng nếu bạn đặt quyền trong mô-đun hợp nhất! Sử dụng [WIX_ACCOUNT_USERS] trong dự án WiX và không phải trong mô-đun hợp nhất WiX đặt quyền cho nhóm người dùng một cách chính xác. –

Các vấn đề liên quan