【问题标题】:How to validate the user while installing service as user account?如何在将服务安装为用户帐户时验证用户?
【发布时间】:2014-05-05 04:44:16
【问题描述】:

我正在使用 wix 创建安装程序。我需要安装一个服务作为安装过程中给出的用户帐户。但是,在安装服务之前,我如何验证用户和密码是否有效以及是否有足够的权限来安装服务。有什么办法吗?

wix 中的以下代码可以帮助我安装服务。

<ServiceInstall Id="AServiceInstall" DisplayName="myservice"     Name="myservice" ErrorControl="normal" Start="auto" Vital="yes" Type="ownProcess" Account="[ACCOUNT]" Password="[PASSWORD]">
            <ServiceDependency Id="x"></ServiceDependency>
          </ServiceInstall>

【问题讨论】:

    标签: service wix


    【解决方案1】:

    为了验证复杂的用户输入,我通常必须创建一个自定义操作来执行此操作。

    这是一个示例对话框,用于验证 Web 服务的 URL 并确保其可访问:

    <?xml version="1.0" encoding="utf-8"?>
    <Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
    <Fragment>
        <CustomAction Id="ValidateProxyService" BinaryKey="XXX.CommServer.CustomActions.dll" DllEntry="ValidateProxyService" Return="check" />
    
        <UI>
          <Dialog Id="XxxInquiryServiceDlg" Width="370" Height="270" Title="CommService Setup">
            <Control Id="BannerBitmap" Type="Bitmap" X="0" Y="0" Width="370" Height="44" TabSkip="no" Text="!(loc.InstallDirDlgBannerBitmap)" />
            <Control Id="BannerLine" Type="Line" X="0" Y="44" Width="370" Height="0" />
            <Control Id="BottomLine" Type="Line" X="0" Y="234" Width="370" Height="2" />
            <Control Id="Description" Type="Text" X="25" Y="23" Width="280" Height="15" Transparent="yes" NoPrefix="yes" Text="Configure the settings for the xxx." />
            <Control Id="Title" Type="Text" X="15" Y="6" Width="210" Height="15" Transparent="yes" NoPrefix="yes" Text="{\WixUI_Font_Title}Configure xxx" />
            <Control Type="Text" Id="ProxyServiceLabel" Width="95" Height="10" X="11" Y="60" Text="XXX Proxy Service URL:" />
            <Control Type="Edit" Id="ProxyServiceTextBox" Width="244" Height="15" X="112" Y="58" Property="XXX_PROXY_SERVICE_URL" />
            <Control Id="Next" Type="PushButton" X="236" Y="243" Width="56" Height="17" Default="yes" Text="!(loc.WixUINext)">
              <Publish Event="DoAction" Value="ValidateProxyService" Order="1">1</Publish>
            </Control>
            <Control Id="Back" Type="PushButton" X="180" Y="243" Width="56" Height="17" Text="!(loc.WixUIBack)" />        
            <Control Id="Cancel" Type="PushButton" X="304" Y="243" Width="56" Height="17" Cancel="yes" Text="!(loc.WixUICancel)">
              <Publish Event="SpawnDialog" Value="CancelDlg">1</Publish>          
            </Control>
          </Dialog>
        </UI>
      </Fragment>
    </Wix>
    

    然后是我写的自定义动作:

    [CustomAction]
    public static ActionResult ValidateProxyService(Session session)
    {
        try
        {
            string proxyServiceUrl = session["XXX_PROXY_SERVICE_URL"];
            string message;
    
            if (string.IsNullOrWhiteSpace(proxyServiceUrl))
            {
                session["XXX_PROXY_SERVICE_VALID"] = string.Empty;
                MessageBox.Show(
                    "The proxy service URL is required.",
                    "Error",
                    MessageBoxButtons.OK,
                    MessageBoxIcon.Error);
                return ActionResult.Success;
            }
            else if (!ValidateUrl(proxyServiceUrl, out message))
            {
                if (MessageBox.Show(
                    message,
                    "Error",
                    MessageBoxButtons.OKCancel,
                    MessageBoxIcon.Warning) == DialogResult.Cancel)
                {
                    session["XXX_PROXY_SERVICE_VALID"] = string.Empty;
                    return ActionResult.Success;
                }
            }
    
            session["XXX_PROXY_SERVICE_VALID"] = "1";
        }
        catch (Exception ex)
        {
            session.Log("An error occurred during ValidateProxyService: {0}", ex);
            return ActionResult.Failure;
        }
    
        return ActionResult.Success;
    }
    

    正在发生的事情的一般概述是对话框要求一个 URL 并将其放在 XXX_PROXY_SERVICE_URL 属性中。当您按下对话框上的下一步按钮时,它将运行自定义操作。然后,自定义操作会读取 XXX_PROXY_SERVICE_URL 并测试它是否有效并尝试加载页面。如果它无效或失败,它将取消设置 XXX_PROXY_SERVICE_VALID 属性。

    在我拥有的安装程序的主 UI 中:

    <Publish Dialog="XXXServiceDlg" Control="Next" Event="NewDialog" Value="OtherDlg" Order="2">XXX_PROXY_SERVICE_VALID</Publish>
    

    所以在服务没有生效的情况下它不会进入下一页。

    一些注意事项:

    • 我只是显示一个警告对话框并询问他们是否要继续(是/否),即使输入无效,在现在无法访问服务但他们仍需要完成安装的情况下。李>
    • 我真的很想使用 WIX 对话框来处理消息对话框。由于我无法获得安装程序窗口的句柄,因此在我仍然不知道的某些情况下,使用 MessageBox 类往往会在安装程序下弹出。我还认为在 WIX 中处理所有 UI 会更简洁。
    • 验证某些有用的东西需要管理员访问权限。这会在生成 MSI 时产生烦人的可用性影响。要以管理员身份运行 MSI 的 UI 部分,需要通过具有管理员访问权限的命令行启动它,或者生成一个引导程序 (.exe),该引导程序 (.exe) 要么被用户告知以管理员身份运行,要么配置为以管理员访问权限启动.

    一些需要填写的空白:

    • 在 WIX 中使用自定义操作的所有缺失细节。
    • 检查用户凭据是否有效及其权限的确切方法。

    一旦你弄清楚了这两件事,调整上面的策略来验证任意用户输入应该不会太难。

    【讨论】:

      【解决方案2】:

      您可能需要重新表述问题。您正在谈论的凭据需要足够的权限才能作为服务运行 - 正如您的问题所暗示的那样,它们不用于安装服务。安装本身将(或应该!)在 UAC 系统上请求提升并为您安装服务。

      验证的第一部分基于调用 LogonUser(),类似这样的内容是 API 使用指南。

      http://msdn.microsoft.com/en-us/library/windows/desktop/aa378184(v=vs.85).aspx

      这里也有一些讨论:

      How to validate domain credentials?

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-05-12
        • 2020-12-30
        • 1970-01-01
        • 2020-06-18
        相关资源
        最近更新 更多