代码之家  ›  专栏  ›  技术社区  ›  Sam Saffron James Allen

执行安装后需要提升的自定义操作

  •  6
  • Sam Saffron James Allen  · 技术社区  · 15 年前

    我有以下wix片段:

    <Property Id="WIXUI_EXITDIALOGOPTIONALCHECKBOX" Value="1" />
    <CustomAction Id="StartAppOnExit" 
                  FileKey="Configurator.exe" 
                  ExeCommand="" 
                  Execute="immediate" 
                  Impersonate="yes" 
                  Return="asyncNoWait" />
    <Property Id="WIXUI_EXITDIALOGOPTIONALCHECKBOXTEXT" 
              Value="Configure initial settings" />
    <UI>
      <Publish Dialog="ExitDialog" 
               Control="Finish" 
               Order="1" 
               Event="DoAction" 
               Value="StartAppOnExit"
      >WIXUI_EXITDIALOGOPTIONALCHECKBOX = 1 and NOT Installed</Publish>
    </UI>
    

    基本上,在退出对话框中,我会显示一个框,上面写着:启动应用程序。注意:此应用程序需要提升。这一切都很好,除了一个障碍。如果启用了UAC,那么似乎MSI会干扰用户令牌并剥离其组,因此当它试图启动需要提升的应用程序时,它不再是一个选项。

    我怎样把这个串在一起工作?

    我试着模仿一个“不”,但到了那个时候,这还太迟了。

    2 回复  |  直到 11 年前
        1
  •  12
  •   Sam Saffron James Allen    15 年前

    UI序列作为受限用户运行,它通过调用CreateProcess启动应用程序。如果你使用像 WixShellExec 使用[wixshellexectarget]代替,它将像资源管理器一样,在目标需要提升时显示UAC提示。或者,您可以修改configurator.exe以允许在没有提升权限的情况下启动,检测这种情况,并使用提升权限重新启动自己。

    例如,这应该有效:

    <Property Id="WIXUI_EXITDIALOGOPTIONALCHECKBOX" Value="1" />
    <CustomAction Id="StartAppOnExit" BinaryKey="WixCA" DllEntry="WixShellExec" Execute="immediate" Return="check" Impersonate="yes"/>
    <Property Id="WixShellExecTarget" Value="[#Configurator.exe]"/>
    <Property Id="WIXUI_EXITDIALOGOPTIONALCHECKBOXTEXT" Value="Configure initial settings" />
    <UI>
      <Publish Dialog="ExitDialog" Control="Finish" Order="1" Event="DoAction" Value="StartAppOnExit">WIXUI_EXITDIALOGOPTIONALCHECKBOX = 1 and NOT Installed</Publish>
    </UI>
    
        2
  •  0
  •   Bryan Batchelder    15 年前

    仅供参考,即时自定义操作始终是模拟的(即,它们始终作为执行MSI的用户运行)。

    我喜欢迈克尔·厄曼关于让configurator.exe处理提升问题的想法。

    我想知道您是否也可以在您的exe中包含一个清单,以便操作系统知道总是需要提升。