用于Windows服务的自定义操作安装程序

时间:2017-12-15 03:16:37

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

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

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

这是来自Installer Class的覆盖方法。

 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。

2 个答案:

答案 0 :(得分:0)

最有可能的是,不同的十年,相同的问题....(SeServiceLogonRight)

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

FWIW,我当时还不是一个伟大的WiX用户(我当时只是涉足这个问题)但是我的Matthew Rowan的评论中有一些真正的宝石。他是正确的......如果你使用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并授予域中的计算机对象权限。另一种方法是让安装程序创建服务帐户并在每次修复时随机化密码,这样您就不必保留它。

答案 1 :(得分:0)

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

您无法在命令行上静默传递这些参数,因为Visual Studio会生成自定义操作以清除它们(我不知道原因)。在静默安装中,Windows仅运行InstallExecuteSequence,如果您查看(例如)Orca,您将看到自定义操作,例如" CustomTextA_SetProperty_EDIT1"清除价值观。说明显而易见的是,您当前获得的值将为空,您可以通过在某处记录值来验证这一点。

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

之后,存在一个潜在的问题,即由于它们不受保护,因此这些值不会影响您的自定义操作,因此在Property表中您需要将这些属性名称添加到SecureCustomProperties中list,分号分隔(EDIT1; EDIT2等)。

Visual Studio安装项目并不擅长这一点,而像WiX这样的东西会更好,因为安装,启动或停止服务或使用帐户配置服务不需要代码。