在安装过程中将参数传递给Windows服务
本文关键字:Windows 服务 参数传递 安装 过程中 | 更新日期: 2023-09-27 18:01:02
我正在创建一个windows服务,假设它在特定的表中查找数据,然后根据状态处理记录。
我想在使用installutill作为参数安装服务时传递DB凭据,并将其保存在注册表中。我试着用下面的代码来做这件事,但我在事件"OnBeforeInstall"上不断出错。
我认为要么是我传递参数不正确,要么是我在错误的事件中编写代码。需要你的帮助来弄清楚我做错了什么。
protected override void OnBeforeInstall(IDictionary savedState)
{
base.OnBeforeInstall(savedState);
_eventLog.WriteEntry("OnBeforeInstall Started");
try
{
RegistryKey key = Registry.CurrentUser.CreateSubKey(@"SOFTWARE'RyteRMS");
if (key != null)
{
_eventLog.WriteEntry("Write data to registry key");
key.SetValue("DBTYPE", this.Context.Parameters["dbtype"].ToString()); // This throws error, I am assuming as the above event entry is visible.
key.SetValue("DATASOURCE", this.Context.Parameters["datasource"].ToString());
key.SetValue("USERID", this.Context.Parameters["userid"].ToString());
key.SetValue("PASSWORD", this.Context.Parameters["password"].ToString());
key.SetValue("DBNAME", this.Context.Parameters["dbname"].ToString());
key.Close();
}
}
catch (Exception ex)
{
_eventLog.WriteEntry(ex.Message);
}
_eventLog.WriteEntry("OnBeforeInstall Finished");
}
我在命令提示符下写这篇文章:installutil RMSBGService.exe/dbtype=sqlserver/datasource=hitin lt/dbname=rms/userid=admin/password=passw0rd
错误:"对象引用未设置为对象实例。">
附言:我不知道如何调试Win服务,所以我用事件日志来记录每一件事。
我自己设法做到了,这就是我们应该做的。
protected override void OnBeforeInstall(IDictionary savedState)
{
_eventLog.WriteEntry("OnBeforeInstall Started");
try
{
RegistryKey key = Microsoft.Win32.Registry.LocalMachine.CreateSubKey(@"SOFTWARE'RMS");
if (key != null)
{
_eventLog.WriteEntry("Write data to registry key");
Process _prc = new Process();
_prc.StartInfo.FileName = "cmd.exe";
_prc.StartInfo.UseShellExecute = false;
_prc.StartInfo.RedirectStandardOutput = true;
_prc.StartInfo.RedirectStandardInput = true;
_prc.Start();
ConsoleColor _color = Console.ForegroundColor;
Console.ForegroundColor = ConsoleColor.DarkGreen;
Console.WriteLine("'n'n");
Console.WriteLine("PLEASE ENTER FOLLOWING DETAILS TO COMPLETE SETUP");
Console.WriteLine("NOTE: if you enter wrong information, you will need to reinstall the application.");
Console.WriteLine("'n'n");
Console.WriteLine("Enter DBTYPE (SQLSERVER or ORACLE):");
key.SetValue("DBTYPE", StringCipher.Encrypt(Console.ReadLine(), "@xx"));
Console.WriteLine("Enter DATASOURCE (SERVER NAME):");
key.SetValue("DATASOURCE", StringCipher.Encrypt(Console.ReadLine(), "@xx"));
Console.WriteLine("Enter DATABASE USER ID:");
key.SetValue("USERID", StringCipher.Encrypt(Console.ReadLine(), "@xx"));
Console.WriteLine("Enter PASSWORD:");
key.SetValue("PASSWORD", StringCipher.Encrypt(Console.ReadLine(), "@xx"));
Console.WriteLine("Enter DATABASE NAME:");
key.SetValue("DBNAME", StringCipher.Encrypt(Console.ReadLine(), "@xx"));
key.Close();
Console.ForegroundColor = _color;
_prc.Close();
}
}
catch (Exception ex)
{
_eventLog.WriteEntry(ex.Message);
}
_eventLog.WriteEntry("OnBeforeInstall Finished");
base.OnBeforeInstall(savedState);
}
StringCipher是我用来加密/解密文本的自定义函数。稍后,我将从注册表中读取这些存储的值,并对它们进行解密,将其传递到数据库连接代码中,然后执行必要的操作。
希望这能帮助到别人。
注意
您必须使用"InstallUtil"安装此服务,如果您选择使用安装程序项目进行安装,则此安装将在cmd窗口打开时卡住。