【问题标题】:Custom Actions Installer for Windows ServiceWindows 服务的自定义操作安装程序
【发布时间】:2017-12-15 03:16:36
【问题描述】:

我有一个 Windows 服务,我使用 msiexec.exe 静默安装,我正在传递“设置服务登录”的用户名和密码

服务已成功安装,但在启动服务时,我收到“错误 1069:由于登录问题,服务未启动”我的登录帐户是管理员,我已经测试过,当我使用相同的 msi 文件手动安装时启动它正在成功启动的服务,我被卡住了,需要一些关于我所缺少的想法和指导。

这是我从安装程序类中重写的方法。

 public override void Install(IDictionary stateSaver)
    {
        base.Install(stateSaver);

        var userName = Context.Parameters["USERNAME"];
        var password = Context.Parameters["PASSWORD"];
        if (!string.IsNullOrWhiteSpace(userName) && userName.ToLower() != "admin")
        {
            CustomInstallerParameters customParameters = new CustomInstallerParameters(Context);

            SaveCustomParametersInStateSaverDictionary(stateSaver, customParameters);
        }
        else
        {
            Context.Parameters.Remove("USERNAME");
            Context.Parameters.Remove("PASSWORD");
        }
    }

TIA。

【问题讨论】:

    标签: c# windows-installer custom-action visual-studio-setup-proje


    【解决方案1】:

    您似乎正在使用 Visual Studio 安装项目,并且很可能还使用其中一个 TextBoxes 对话框来收集输入。

    您不能在命令行上静默传递这些参数,因为 Visual Studio 会生成自定义操作来清除它们(我不知道为什么)。在静默安装中,Windows 仅运行 InstallExecuteSequence,如果您使用(例如)Orca 进行查看,您将看到自定义操作,例如“CustomTextA_SetProperty_EDIT1”,这些操作会清除这些值。很明显,您当前获得的值将是空白的,您可以通过在某处记录值来验证这一点。

    因此,使其工作的一个起点是使用 Orca 删除 InstallExecuteSequence 表中的那些自定义操作调用。

    之后,存在一个潜在问题,即这些值不会出现在您的自定义操作中,因为它们不安全,因此您需要在属性表中将这些属性名称添加到 SecureCustomProperties 列表中,半冒号分隔(EDIT1;EDIT2 等)。

    Visual Studio 安装项目不擅长这些,像 WiX 这样的项目会更好,因为安装、启动或停止服务或使用帐户配置它们不需要代码。

    【讨论】:

    • 你有例子吗? @PhilDW,而且我在安装程序类中传递用户名和密码,没有用户交互。 TIA
    • 究竟是什么例子? WiX SertviceInstall 元素是您设置用户名和密码的地方 在其他 MSI 工具(如 WiX)中不需要这些 VS 东西(用于安装服务和传递帐户信息的安装程序类),但与 VS 设置项目相比,这是一个陡峭的学习曲线.
    【解决方案2】:

    很可能,不同的十年,同样的问题.... (SeServiceLogonRight)

    http://iswix.com/2008/09/22/different-year-same-problem/

    FWIW,那时我还不是 WiX 大用户(当时我只是涉足),但我的 Matthew Rowan 的 cmets 中有一些真正的宝石。他是对的……如果您使用 WiX,所有这一切都会变得更容易。

    例如,您可以按照本教程进行操作:

    https://github.com/iswix-llc/iswix-tutorials

    这会创建一个以 SYSTEM 身份运行的 Windows 服务。添加对 WiXUtil 扩展和命名空间的引用,并使用 LogonAsService 权限集和您的所有设置创作一个 User 元素。

    FWIW,我对这一切的唯一担心是,如果您不想进行修复并破坏用户名和密码,MSI 需要属性持久性。属性持久性很容易记住(请参阅:http://robmensching.com/blog/posts/2010/5/2/the-wix-toolsets-remember-property-pattern/),但问题是提供足够的加密以不暴露帐户。

    这是因为我通常建议仅作为 NetworkService 或 SYSTEM 运行并授予域中的计算机对象权限。另一种方法是让安装程序创建服务帐户并在每次修复时随机化密码,这样您就不必保留它。

    【讨论】:

    • 我没有使用 WIX。
    • 我链接的博客文章展示了如何使用 LsaUtil 解决问题。老实说,尽管您使用的工具还有很多不足之处。它不会公开底层的原生 Windows Installer 服务功能,导致您不得不重新发明轮子。
    • 感谢您的反馈,我今天会尝试这个,因为我坚持让它工作 2 天。
    • stackoverflow.com/questions/6859660/… 我不知道这家伙是否成功了,我无法对他的回答添加评论
    猜你喜欢
    • 1970-01-01
    • 2010-12-07
    • 2013-01-06
    • 1970-01-01
    • 1970-01-01
    • 2011-11-28
    • 2019-02-22
    • 1970-01-01
    • 2018-10-12
    相关资源
    最近更新 更多