2016-10-25 19 views
1

WIX Toolset(3.10.3)を使用してインストールパッケージをビルドするプロジェクトを継承しました。アプリケーションは、共有データをダウンロードして、c:\ProgramData\Vendor\ApplicationNameに格納します。ただし、このパスはインストール中に作成されるのではなく、初めてパスが要求されるたびにアプリケーション自体の実行中に作成されます。ProgramDataの既存のフォルダとファイルに対するアクセス許可をWiX Toolsetで設定する

複数のWindowsユーザーがアプリケーションを使用するときに発生するアクセス許可に関連する問題を発見しました。アプリケーションがバックエンドから新しいデータファイルをダウンロードするたびに、それらのファイルに対して「フルコントロール」権限を取得するのは現在のWindowsユーザーです。他の誰かが別のWindowsアカウントでログインすると、それらのファイルに対する読み取り権限しか持ちません。また、アプリケーションがローカルファイルをバックエンドと同期させようとすると、これらの混在したアクセス許可によって問題が発生します。

アプリケーションに昇格した権限が必要ないため、インストール中にこれを修正する必要があります。最初のステップとして、インストール時にc:\ProgramData\Vendor\フォルダが作成され、<util:PermissionEx User="Everyone" GenericAll="yes" />で正しいアクセス権が取得されていることを確認しました。これらのアクセス許可は継承されるため、新規インストールを行うすべてのユーザーの問題を解決します。

問題は、インストールされたの後に作成されたのフォルダ/ファイルによってのみアクセス許可が継承されることです。つまり、以前のバージョンからアップグレードしたユーザーのデータファイルには、混在した権限が残っています。したがって、既存のすべてのフォルダとファイルがインストール時に新しい権限を取得するようにする必要があります。これをどのように達成するのですか?

答えて

1

これは私が解決した方法です。将来誰かを助けてくれることを願っています。

まず、私はMSIのためにWXSファイルに次のものを追加しました:

<Directory Id="CommonAppDataFolder"> 
    <Directory Id="ProgramDataVendorFolder" Name="MyVendor"> 
     <!--This will create the \ProgramData\MyVendor\MyProductName\ folder. --> 
     <Directory Id="ProgramDataAppFolder" Name="MyProductName" /> 
    </Directory> 
</Directory> 

<DirectoryRef Id="ProgramDataAppFolder"> 
<Component Id="CmpCreateCommonAppDataFolderWithPermissions" Guid="13ae94b7-9ef5-4181-bfa9-933844a13418" Permanent="yes"> 
    <CreateFolder> 
    <!--This will ensure that everyone gets full permissions to the folder that we create in the ProgramData folder. --> 
    <util:PermissionEx User="Everyone" GenericAll="yes" /> 
    </CreateFolder> 
</Component> 
</DirectoryRef> 

し、それを含ま:

<Feature Id="ProductFeature" Title="$(var.ProductName)" Level="1"> 
    <!--Add folder --> 
    <ComponentRef Id="CmpCreateCommonAppDataFolderWithPermissions" /> 
</Feature> 

すべてのユーザーがへのフルアクセスを持っていたことを確認しましたこれら三つのことフォルダが既に存在する場合でも、ProgramData内のフォルダ。

ただし、以前のアクセス許可の問題のためにファイル仮想化が既にアクティブな場合は、アクセス許可を変更するだけでは不十分です。ファイル仮想化をオフにするには、私は私の実行可能ファイルにapp.manifestを追加しました:

<requestedExecutionLevel level="asInvoker" uiAccess="false" /> 

以前に使用VirtualStoreが重要なファイルが含まれている場合、彼らは自動的にはProgramDataフォルダに表示されないことに留意してください。

ファイル/レジストリの仮想化に関する詳細は、こちらをご覧ください。https://blogs.technet.microsoft.com/mrsnrub/2010/08/11/uac-virtualization-allowing-standard-users-to-update-a-system-protected-area/

関連する問題