在网络路径上设置权限时 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 安装),所以这也不太可能有帮助。您需要一个提升的用户应用程序来为网络共享执行此操作,也许 运行 在第一次使用应用程序本身时。这可能有帮助:
如果它以 \ 开头,我认为它是网络共享。驱动器号无论如何都不能与 CA 一起使用,因为驱动器号是用户配置文件映射(而不是系统映射),因此系统帐户不会知道它们。在 .Net 中,FileSystem.GetDriveInfo 会有所帮助。
我有一个 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 安装),所以这也不太可能有帮助。您需要一个提升的用户应用程序来为网络共享执行此操作,也许 运行 在第一次使用应用程序本身时。这可能有帮助:
如果它以 \ 开头,我认为它是网络共享。驱动器号无论如何都不能与 CA 一起使用,因为驱动器号是用户配置文件映射(而不是系统映射),因此系统帐户不会知道它们。在 .Net 中,FileSystem.GetDriveInfo 会有所帮助。