我在IS2010中有一个InstallScript项目。它有一些安装的服务。一些是C ++ exes并使用“用于NT服务的InstallShield对象”。其他是使用Java Service Wrapper通过LaunchAppAndWait命令行调用作为服务安装的Java应用程序。 Tomcat也通过调用service.bat作为服务安装。
当安装程序在升级模式下运行时,将重新安装服务,并且设置(自动与手动启动,失败时重启,登录帐户等)将恢复为默认值。
我想在文件传输之前保存服务设置,然后再重新填充它们,但我找不到一个好的机制来执行此操作。如何保存和恢复服务设置?
答案 0 :(得分:4)
我通过从OnUpdateUIBefore中的注册表中读取服务信息,将其存储在全局变量中,并将信息写回OnUpdateUIAfter中的注册表来实现此目的。
代码:
export prototype void LoadServiceSettings();
function void LoadServiceSettings()
number i, nResult;
string sServiceNameArray(11), sRegKey, sTemp;
BOOL bEntryFound;
begin
PopulateServiceNameList(sServiceNameArray);
RegDBSetDefaultRoot(HKEY_LOCAL_MACHINE);
//write service start values to the registry
for i = 0 to 10
if (ServiceExistsService(sServiceNameArray(i))) then
sRegKey = "SYSTEM\\CurrentControlSet\\Services\\" + sServiceNameArray(i);
nResult = RegDBSetKeyValueEx(sRegKey, "Start", REGDB_NUMBER, sServiceSettings(i), -1);
if(nResult < 0) then
MessageBox ("Unable to save service settings: " + sServiceNameArray(i) + ".", SEVERE);
endif;
endif;
endfor;
RegDBSetDefaultRoot(HKEY_CLASSES_ROOT); //set back to default
end;
export prototype void SaveServiceSettings();
function void SaveServiceSettings()
number i, nType, nSize, nResult;
string sServiceNameArray(11), sRegKey, sKeyValue;
begin
PopulateServiceNameList(sServiceNameArray);
RegDBSetDefaultRoot(HKEY_LOCAL_MACHINE);
for i = 0 to 10
if (ServiceExistsService(sServiceNameArray(i))) then
//get service start values from registry
sRegKey = "SYSTEM\\CurrentControlSet\\Services\\" + sServiceNameArray(i);
nResult = RegDBGetKeyValueEx(sRegKey, "Start", nType, sKeyValue, nSize);
if(nResult < 0) then
MessageBox ("Unable to save service settings: " + sServiceNameArray(i) + ".", SEVERE);
endif;
sServiceSettings(i) = sKeyValue;
endif;
endfor;
RegDBSetDefaultRoot(HKEY_CLASSES_ROOT); //set back to default
end;