我有一个使用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。
答案 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这样的东西会更好,因为安装,启动或停止服务或使用帐户配置服务不需要代码。