18

関連するトピックをすべて読みましたが、問題に対する完全な回答が見つかりませんでした。

Program Files の下のフォルダの SYSTEM に完全な権限を付与し、Users グループに読み取りと実行の権限を付与したいと考えています。それ以上でもそれ以下でもありません。

WIX を使用してフォルダにアクセス許可を与える方法は 3 つありますが、どれも私にとってはあまり良いものではありません。その理由を説明します。

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>

問題:「Users」キーワードを認識しないため、外国の OS では失敗します。SIDでも試しました。それに加えて、Test ディレクトリ内の各ファイルの下に Permission 要素を配置する必要があります (ただし、これが唯一のケースである場合は、なんとかできたはずです)。

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) Sddl を使用した PermissionEx:

問題:この要素は、MSI 5.0 をインストールする場合にのみ使用できます。インストーラー 3.01 を使用しています。

カスタムアクションを含むソリューションを含め、喜んで解決策を提供します...

4

5 に答える 5

10

私はこれとまったく同じ問題を抱えていて、それについてRob Mに話しました. Christian G の回答 ( https://stackoverflow.com/a/5296967/18475 ) を実行するつもりでしたが、Rob は WixQueryOsWellKnownSID ( http://wix.sourceforge.net/manual-wix3/osinfo.htm ) を使用して取得することを提案しました。非 en-US ロケール周辺。

ファイルに次を追加し.wxsます。

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

さらに、アクセス許可を適用するファイルのさらに下は、.wxs次のようになります。

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

これで、ライトを実行したら、リンクするだけですWixUtilExtension

light -ext WiXUtilExtension ...

注: WiX のバージョンによっては、これが完全にサポートされていない場合があります。うまくいかない場合は、 SID の変換に使用できる他のオプションがあるかもしれません。

于 2013-08-03T23:32:46.243 に答える
7

次のコードを使用して、カスタム アクションなしでこれを実現します。これが機能することを確認しました(子フォルダーでも)。また、ユーザー Everyoneは、ローカライズされた Windows オペレーティング システムにマップされます。

<CreateFolder>
      <Permission User="Everyone" GenericAll="yes" ChangePermission="yes"/>
</CreateFolder>
于 2012-06-21T15:09:19.153 に答える
2

もう1つのオプションは、SIDを含むmsiプロパティをローカライズされたOSからのグループの実際の名前に変換するだけの単純なCAを用意することです。CAは延期する必要はなく、権限を設定する実際の作業を実行していません。

以下は、PROPERTY_TO_BE_TRANSLATED msiプロパティの値を読み取り、それによって示されるmsiプロパティを変換するCAのサンプルです。このようにして、CAを実行してさまざまなmsiプロパティを変換できます。

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

WiXでは、アカウントのSIDを使用して変換するプロパティを定義します。

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

PROPERTY_TO_BE_TRANSLATEDプロパティを設定するCAを作成してから、変換を行うCAを呼び出します。

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

権限を設定するときは、msiプロパティを使用することを忘れないでください。

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

最後に、CreateFolderの前にCAをスケジュールします

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

このように、CAはいくつかの簡単な作業のみを実行し、アクセス許可の設定はWiX要素に任せます。

于 2011-03-14T09:46:13.740 に答える
1

<Permission> 要素は親フォルダーからのアクセス許可の継承をクリアするため、ユーザー "Everyone" または "Administrators" に対して単一の <Permission> 要素を使用し、その後に <util:PermissionEx> 要素を使用して、ユーザー名のアクセス許可を設定することを試みることができます。 <Permission> 要素ではサポートされていません。例:

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

これらはインストーラーによって自動的に追加されるため、SYSTEM のアクセス許可を明示的に設定する必要はありません。

于 2011-06-24T11:14:02.010 に答える
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でセッションプロパティにアクセスする必要があります

于 2010-02-16T11:50:34.290 に答える