2010-02-14 16 views
16

İlgili tüm konuları okudum ve sorunuma tam bir yanıt bulamadım.WIX: Bir klasöre izin verilmesi

SİSTEM'e tam izin vermek ve Program Files'ın altındaki bir klasöre Kullanıcılar grubuna & Yürütme izinlerini okumak istiyorum. Ne fazla ne eksik.

Ben WIX kullanarak bir klasöre izinleri vermek için 3 yolu bunların hiçbiri benim için gerçekten çok iyi, orada biliyorum ve açıklayacağım neden:

1) Düzenli İzin elemanı:

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

Sorun: "Kullanıcılar" anahtar sözcüğünü bilmediğinden yabancı işletim sisteminde başarısız oluyor. Ben de SID ile denedim.

<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> 

: Bunun yanı sıra ben (bu sadece durum olsaydı ama, ben yönetilen olurdu)

2) WixUtilsExtension PermissionEx eleman Testi dizindeki her dosya altında izin elemanı yerleştirmek gerekir Sorun: Klasör ayrıca Program Files klasörünün varsayılan izinlerini de korur. Buna izin veremem. Sddl ile

3) PermissionEx:

sorun MSI 5.0 ile yüklerken Bu eleman kullanılabilir. Yükleyici 3.01 kullanıyorum.

Ben özel eylemler ile çözümleri de dahil olmak üzere, herhangi bir çözüm elde etmek mutlu olacağım ...

cevap

1

izinleri değiştirmek için ertelenmiş özel eylemi uygulamak gerekir. C# özel eylem örneği:

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

sen may C++ üzerinde, özel eylem ertelenmiş olması gerekir liman - Sen Başka bir seçenek basit CA sahip olacaktır CustomActionData

2

ederek oturumu özelliklerini erişmesi gereken daha bu sadece irade SID'yi içeren bir msi özelliğini, yerelleştirilmiş işletim sisteminden grubun gerçek ismine çevirir. CA'nın ertelenmesi gerekmez ve bu izinleri ayarlama asıl işini yapmaz.

Aşağıda, PROPERTY_TO_BE_TRANSLATED msi özelliğinin değerini okuyan ve onun tarafından gösterilen msi özelliğini çeviren CA örneği verilmiştir. Bu şekilde, farklı msi özelliklerini çevirmek için CA'yı çalıştırabilirsiniz.

<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" /> 
: PROPERTY_TO_BE_TRANSLATED özelliğini ayarlayın ve sonra çevirisini yapıyor CA arayacak CA oluşturma

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

: WiX olarak

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

Eğer SID for the accounts kullanılarak Çevrilecek özellikleri tanımlamak

İzinleri ayarlarken msi özelliklerini kullanmayı unutmayın:

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

Son olarak, WiX elemana izinlerin ayarı bırakarak, CA sadece bazı basit işi bu sayede

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

CreateFolder

önce CA planlamak. > eleman üst klasörler izinlerin devralınması temizler < İzin gibi

1

, kullanıcıların "Herkes" ya < util ardından "Yöneticiler" için tek < İzin > elemanı kullanarak deneyebilirsiniz: izinlerini ayarlamak > unsurları PermissionEx örneğin, <izni> elemanı tarafından desteklenmeyen kullanıcı adları:

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

bu yükleyici tarafından otomatik olarak eklenir gibi, açıkça SİSTEMİ izni vermek için gerekli değildir.

6

Özel bir eylem olmadan bunu gerçekleştirmek için aşağıdaki kodu kullanın. Bu çalışmaları doğruladım (çocuk klasörlerinde de). Ayrıca, User Everyone yerelleştirilmiş windows işletim sistemlerinde eşlenmiştir.

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

Bu, ABD dışındaki yerel kullanıcılar için çalışmayacaktır, çünkü "Herkes" yerelleştirilmelidir. – John

+0

Bildirilen hiçbir sorunum olmadı ve tüm kültürlere dağıldık. Nasıl tamir ettin? –

6

Bu aynı sorunu yaşadım ve bununla ilgili Rob M ile konuştum. Christian G'nin cevabını (https://stackoverflow.com/a/5296967/18475) yapacaktım, ancak Rob, ABD dışındaki bölgeleri dolaşmak için WixQueryOsWellKnownSID (http://wix.sourceforge.net/manual-wix3/osinfo.htm) kullanmayı önerdi. daha aşağı .wxs dosyasında bunu sadece bu gibi izinleri uygulamak istediğiniz yere

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

Ve:: Artık çalıştırdığınızda

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

.wxs dosyasında

aşağıdaki ekleyin Işık, sadece WixUtilExtension bağlamanız gerekir.

light -ext WiXUtilExtension ... 

NOT: WiX sürümüne bağlı olarak, bu tamamen desteklenmiyor olabilir. Sizin için çalışmazsa, translate SIDs için kullanabileceğiniz başka seçenekler de olabilir.

+0

Dikkatli olun, bence bir sebepten dolayı bunu geri almamız gerekiyordu. – ferventcoder

+0

Bu benim için çalışmıyor.[WIX_ACCOUNT_USERS] "BUILTIN \ Users" olarak çözülecek ve "BUILTIN" adlı kullanıcıya izin verecek. –

+0

Yukarıda belirtilen davranış, yalnızca birleştirme modülünde izinleri ayarlarsanız geçerlidir! WiX birleştirme modülünde değil, bir WiX projesinde [WIX_ACCOUNT_USERS] kullanılması, kullanıcı grubunun izinlerini doğru bir şekilde ayarlar. –