2016-10-25 4 views
1

WIX Toolset (3.10.3)을 사용하여 설치 패키지를 빌드하는 프로젝트를 상속했습니다. 응용 프로그램은 공유 데이터를 다운로드하여 c:\ProgramData\Vendor\ApplicationName에 저장합니다. 그러나이 경로는 설치 중에 작성되는 것이 아니라 처음에 경로가 요청 될 때마다 응용 프로그램 자체의 실행 중에 작성됩니다.WiX Toolset을 사용하여 ProgramData의 기존 폴더 및 파일에 대한 사용 권한 설정

이제 여러 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의 폴더.

그러나 이전 권한 문제로 인해 파일 가상화가 이미 활성화되어 있으면 사용 권한을 변경하는 것으로 충분하지 않습니다.

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

가 이전에 사용 VirtualStore이 중요한 파일이 포함되어있는 경우, 그들은 자동으로 경우 ProgramData 폴더에 표시되지 않습니다 유의 사항 : 파일 가상화를 해제하려면, 나는 내 실행에 app.manifest을 추가했다.

파일/레지스트리 가상화에 대한 자세한 내용은 여기를 참조하십시오. https://blogs.technet.microsoft.com/mrsnrub/2010/08/11/uac-virtualization-allowing-standard-users-to-update-a-system-protected-area/