関連するすべてのトピックを読みましたが、問題に対する完全な答えが見つかりませんでした。
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>
問題:このフォルダーは、ProgramFilesフォルダーのデフォルトのアクセス許可も保持します。私はそれを許すことはできません。
3)PermissionEx with Sddl:
問題:この要素は、MSI5.0でインストールする場合にのみ使用できます。インストーラー3.01を使用しています。
カスタムアクションを使用したソリューションを含め、あらゆるソリューションを喜んで入手します...
私はこれとまったく同じ問題を抱えていて、それについてロブMに話しました。私はクリスチャンGの答えをするつもりでした( https://stackoverflow.com/a/5296967/18475 )、しかしロブはWixQueryOsWellKnownSID( http://wix.sourceforge.net /manual-wix3/osinfo.htm )米国以外のロケールを回避します。
の中に .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の変換 に使用できる他のオプションがあるかもしれません。
次のコードを使用して、カスタムアクションなしでこれを実行します。これが機能することを確認しました(子フォルダーでも)。また、 ser Everyone は、ローカライズされたWindowsオペレーティングシステムにマップされます。
<CreateFolder>
<Permission User="Everyone" GenericAll="yes" ChangePermission="yes"/>
</CreateFolder>
もう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要素に任せます。
権限を変更するには、遅延カスタムアクションを実装する必要があります。 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によってセッションプロパティにアクセスする必要があるよりも、カスタムアクションを延期する必要があることを移植できます。
<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の権限はインストーラーによって自動的に追加されるため、明示的に設定する必要はありません。