在网络路径上设置权限时 Wix MSI 失败 (util:PermissionEx)

Wix MSI fails when setting permissions on network path (util:PermissionEx)

我有一个 MSI 在本地安装时运行良好。如果数据路径设置为网络位置,则失败。

相关日志:

MSI (s) (BC:4C) [17:01:57:322]: Executing op: ActionStart(Name=ExecSecureObjects_64,,)
MSI (s) (BC:4C) [17:01:57:322]: Executing op: CustomActionSchedule(Action=ExecSecureObjects_64,ActionType=3073,Source=BinaryData,Target=ExecSecureObjects,CustomActionData=\ravel\TeamData\lrieger\Tim2015Pre_Data\CreateFolderEveryone-1073741824C:\ProgramData\Nemetschek Engineering\TIM 2015.0.0.477590057-pre\CreateFolderEveryone-1073741824)
MSI (s) (BC:78) [17:01:57:324]: Invoking remote custom action. DLL: C:\Windows\Installer\MSIAEDE.tmp, Entrypoint: ExecSecureObjects
MSI (s) (BC:A8) [17:01:57:324]: Generating random cookie.
MSI (s) (BC:A8) [17:01:57:325]: Created Custom Action Server with PID 4488 (0x1188).
MSI (s) (BC:60) [17:01:57:335]: Running as a service.
MSI (s) (BC:60) [17:01:57:337]: Hello, I'm your 64bit Elevated custom action server.
ExecSecureObjects:  Error 0x80070005: failed to get security info for object: \ravel\TeamData\lrieger\Tim2015Pre_Data\
CustomAction ExecSecureObjects_64 returned actual error code 1603 (note this may not be 100% accurate if translation happened inside sandbox)
MSI (s) (BC:4C) [17:01:57:393]: Note: 1: 2265 2:  3: -2147287035 
MSI (s) (BC:4C) [17:01:57:393]: User policy value 'DisableRollback' is 0
MSI (s) (BC:4C) [17:01:57:393]: Machine policy value 'DisableRollback' is 0
Action ended 17:01:57: InstallExecute. Return value 3.

WIX代码:

        <Component Directory="DATA_DIRECTORY">
            <RegistryValue Root="HKLM" Key="$(var.RegRoot)\Setup" Name="TIM_DATA_DIRECTORY" Value="0xff" Type="string" />
            <CreateFolder>
                <util:PermissionEx User="Everyone" GenericRead="yes" GenericWrite="yes" Domain="[LOGONDOMAIN]" />
            </CreateFolder>
        </Component>

没有 util:PermissionEx 它可以在网络共享上运行,但设置这些权限是一项要求,至少如果目标目录是本地的。

问: 是否可以使用 wix/msi 设置网络位置的权限?
如果不是,我如何检测它是网络目录?
或者,在 MSI 中,是否有任何方法可以将组件标记为允许失败?

如果无法执行上述任何操作,我可能需要编写一个自定义操作来尝试设置权限但抑制任何失败...

简而言之,我认为这是不可能的。问题是使用系统帐户提升自定义操作 运行,并且该帐户没有任何网络权限。 WiX utils 代码已经是一个自定义操作,作为常见任务的助手提供,因此编写您自己的自定义操作不会有帮助。如果您 运行 未模拟 CA,它不会 运行 提升(除非您在启动时提升整个 MSI 安装),所以这也不太可能有帮助。您需要一个提升的用户应用程序来为网络共享执行此操作,也许 运行 在第一次使用应用程序本身时。这可能有帮助:

http://wixtoolset.org/documentation/manual/v3/howtos/ui_and_localization/run_program_after_install.html

如果它以 \ 开头,我认为它是网络共享。驱动器号无论如何都不能与 CA 一起使用,因为驱动器号是用户配置文件映射(而不是系统映射),因此系统帐户不会知道它们。在 .Net 中,FileSystem.GetDriveInfo 会有所帮助。