2016-10-25 14 views
1

Ich habe ein Projekt geerbt, das WIX Toolset (3.10.3) verwendet, um das Installationspaket zu erstellen. Die Anwendung lädt und speichert freigegebene Daten in c:\ProgramData\Vendor\ApplicationName. Dieser Pfad wird jedoch nicht während der Installation erstellt, sondern während der Ausführung der Anwendung selbst, wenn der Pfad zum ersten Mal angefordert wird.Berechtigungen für vorhandene Ordner und Dateien in ProgramData mit WiX Toolset festlegen

Ich habe jetzt ein Problem mit Berechtigungen festgestellt, das auftritt, wenn mehrere Windows-Benutzer die Anwendung verwenden. Wenn die Anwendung neue Datendateien vom Back-End herunterlädt, erhält der aktuelle Windows-Benutzer die Berechtigungen für die vollständige Kontrolle für diese Dateien. Wenn sich jemand mit einem anderen Windows-Konto anmeldet, hat er nur Leseberechtigungen für diese Dateien. Und diese gemischten Berechtigungen verursachen Probleme, wenn die Anwendung versucht, die lokalen Dateien mit dem Back-End synchronisiert zu halten.

Da die Anwendung keine erhöhten Privilegien erfordert, muss ich dies während der Installation korrigieren. Als ersten Schritt habe ich jetzt sichergestellt, dass der Ordner während der Installation erstellt wird und dass er die richtigen Berechtigungen mit <util:PermissionEx User="Everyone" GenericAll="yes" /> erhält. Da diese Berechtigungen vererbt werden, wird das Problem für alle Benutzer behoben, die eine Neuinstallation durchführen.

Das Problem ist, dass die Berechtigungen nur von Ordnern/Dateien geerbt werden, die nach der Installation erstellt werden. Dies bedeutet, dass Benutzer, die von einer früheren Version upgraden, weiterhin Datendateien mit gemischten Berechtigungen haben. Ich muss daher sicherstellen, dass alle vorhandenen Ordner und Dateien die neuen Berechtigungen während der Installation erhalten. Wie erreiche ich das?

Antwort

1

Ok, so habe ich es gelöst. Hoffe, dass es jemand anderen in der Zukunft helfen kann.

Zuerst habe ich die folgenden Dinge in die wxs-Datei für das MSI:

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

Und dann enthalten:

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

Diese drei Dinge sorgte dafür, dass alle Benutzer vollen Zugriff musste der Ordner in ProgramData, auch wenn der Ordner bereits vorhanden ist.

Das Ändern der Berechtigungen ist jedoch nicht ausreichend, wenn die Dateivirtualisierung aufgrund vorheriger Berechtigungsprobleme bereits aktiv ist. Um Datei-Virtualisierung zu deaktivieren, fügte ich eine app.manifest meine ausführbare Datei mit:

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

Beachten Sie, dass, wenn das zuvor verwendete Virtuals enthält Dateien, die wichtig sind, werden sie nicht automatisch erscheinen im Ordner Programdata.

Weitere Informationen zur Datei-/Registrierungsvirtualisierung finden Sie hier: https://blogs.technet.microsoft.com/mrsnrub/2010/08/11/uac-virtualization-allowing-standard-users-to-update-a-system-protected-area/

Verwandte Themen