wix customaction UAC dtf

wix customaction UAC dtf

我正在为 IIS 网站创建 Wix 安装程序,可能 UI 选择网站、应用程序池并选择虚拟目录。事情是:我成功创建了安装程序,它在关闭 UAC 的情况下工作,但 UAC 设置为最大。我收到错误 - 来自 MSI 日志:

MSI (c) (A0:C8) [16:41:21:692]:调用远程自定义操作。 DLL:C:\Users\kovac\AppData\Local\Temp\MSI1AEF.tmp,入口点:EnumerateIISWebSitesAndAppPools MSI (c) (A0:CC) [16:41:21:692]:启用伪装。 MSI (c) (A0:CC) [16:41:21:692]: 在服务器上调用安装之前尝试启用所有禁用的权限 MSI (c) (A0:CC) [16:41:21:692]:连接到 CA 接口服务。 SFXCA:将自定义操作提取到临时目录:C:\Users\kovac\AppData\Local\Temp\MSI1AEF.tmp-\ SFXCA:绑定到 CLR 版本 v4.0.30319 调用自定义操作 WebAppInstallCustomActions!WebAppInstallCustomActions.CustomActions.EnumerateIISWebSitesAndAppPools 枚举 IISWebSitesAndAppPools:开始 EnumerateIISWebSitesAndAppPools:尝试 运行 没有管理员权限 CustomAction EnumerateIISWebSitesAndAppPools 返回实际错误代码 1603(请注意,如果翻译发生在沙箱内,这可能不是 100% 准确) 操作结束 16:41:23:EnumerateIISWebSitesAndAppPools。 Return 值 3。 MSI (c) (A0:B0) [16:41:23:878]: 执行操作: FatalError 操作 16:41:23:致命错误。

我尝试关注文章 - 我只知道我应该 运行 我的自定义操作与 Impersonate="no" 所以我做了但没有成功 附加信息:UAC 没有询问自定义操作是否可以 运行 是否正确,它只是结束安装程序...

<CustomAction Id="EnumerateIISWebSitesAndAppPools"
              BinaryKey="WebAppCA"
              DllEntry="EnumerateIISWebSitesAndAppPools"
              Execute="immediate"
              Return="check" Impersonate="no" /> 

我还在某处读到,操作需要 运行 延迟 - 但在这种情况下这是不可能的 - 因为我需要在安装之前为用户提供网站列表。

我的问题是如何 运行 具有完全权限的自定义操作 - 在 UAC 开启的情况下,特别是 UAC 与 运行ning CA 上应用的管理员权限有何关系?感谢任何帮助或任何建议... 因为我不知道重要性和问题域,所以我宁愿附加用 C# 编写的自定义操作脚本:

/// <summary>
    /// Adds the II7 web sites and the application pool names to the 
    /// ComboBox table in the MSI file.
    /// </summary>
    /// <param name="session">
    /// The installer session.
    /// </param>
    /// <returnenter code heres>
    /// Always returns ActionResult.Success, otherwise rethrows the error
    /// encountered.
    /// </returns>
    /// <exception cref="ArgumentNullException">
    /// Thrown if the <paramref name="session"/> parameter is null.
    /// </exception>
    [CustomAction]
    public static ActionResult EnumerateIISWebSitesAndAppPools(
                                                            Session session)
    {

        Debugger.Launch();

        if (null == session)
        {
            throw new ArgumentNullException("session");
        }

        session.Log("EnumerateIISWebSitesAndAppPools: Begin");

        // Check if running with admin rights and if not, log a message to
        // let them know why it's failing.
        if (false == HasAdminRights())
        {
            session.Log("EnumerateIISWebSitesAndAppPools: " +
                        "ATTEMPTING TO RUN WITHOUT ADMIN RIGHTS");
            return ActionResult.Failure;
        }

        session.Log("EnumerateIISWebSitesAndAppPools: " +
                                "Getting the IIS 7 management object");
        ActionResult result;
        using (ServerManager iisManager = new ServerManager())
        {
            result = EnumSitesIntoComboBox(session, iisManager);
            if (ActionResult.Success == result)
            {
                result = EnumAppPoolsIntoComboBox(session, iisManager);
            }
        }

        session.Log("EnumerateIISWebSitesAndAppPools: End");
        return result;
    }

private static ActionResult EnumSitesIntoComboBox(Session session, 服务器管理器 iisManager) { 尝试 { // Debugger.Break(); session.Log("EnumSites: Begin");

            // Grab the combo box but make sure I'm getting only the one 
            // from WebAppInstallDlg.
            View view = session.Database.OpenView(
           "SELECT * FROM ComboBox WHERE ComboBox.Property='WEBSITE_NAME'");
            view.Execute();

            Int32 index = 1;
            session.Log("EnumSites: Enumerating the sites");
            foreach (Site site in iisManager.Sites)
            {
                // Create a record for this web site. All I care about is
                // the name so use it for fields three and four.
                session.Log("EnumSites: Processing site: {0}", site.Name);
                Record record = session.Database.CreateRecord(4);
                record.SetString(1, "WEBSITE_NAME");
                record.SetInteger(2, index);
                record.SetString(3, site.Name);
                record.SetString(4, site.Name);

                session.Log("EnumSites: Adding record");
                view.Modify(ViewModifyMode.InsertTemporary, record);
                index++;
            }

            view.Close();

            session.Log("EnumSites: End");
        }
        catch (Exception ex)
        {
            session.Log("EnumSites: exception: {0}", ex.Message);
            throw;
        }

        return ActionResult.Success;
    }

    static bool HasAdminRights()
    {
        WindowsIdentity identity = WindowsIdentity.GetCurrent();
        WindowsPrincipal principal = new WindowsPrincipal(identity);
        return principal.IsInRole(WindowsBuiltInRole.Administrator);
    }

UI 序列中安排的所有 ca 必须立即执行。模拟不适用于直接 ca。最佳做法是 UI 不提升,因此最佳做法表示 CA 不应要求提升权限。如果没有办法解决这个问题,您将需要使用引导程序来调用 MSI 并在调用之前提升它。

您使用对话框在 UI 模式下收集数据,这将设置一堆属性,然后您可以在没有 UI 的延迟自定义操作中使用这些属性。如果您将软件包 InstallPrivileges 设置为提升的,则延迟 CA 运行 具有您需要的权限。如果您真的想在您编写的代码中执行所有这些操作,运行 在安装后使用提升清单来配置网站内容。

或者看看 WiX IIS 扩展是否能满足您的需求。或者也许是这样的: http://www.codeproject.com/Articles/115036/Creating-WIX-Installer-for-ASP-NET-Web-Application

这一切都已经做过很多次了,不值得重新发明它。