3

IS2010にInstallScriptプロジェクトがあります。インストールされるサービスがいくつかあります。一部はC++exeであり、「NTサービス用のInstallShieldオブジェクト」を使用します。その他は、LaunchAppAndWaitコマンドライン呼び出しを介してJavaServiceWrapperを使用してサービスとしてインストールされるJavaアプリです。Tomcatも、service.batの呼び出しを通じてサービスとしてインストールされています。

インストーラーがアップグレードモードで実行されると、サービスが再インストールされ、設定(自動起動と手動起動、失敗時の再起動、ログオンアカウントなど)がデフォルトに戻ります。

ファイル転送の前にサービス設定を保存し、後で再入力したいのですが、これを行うための適切なメカニズムを見つけることができませんでした。サービス設定を保存および復元するにはどうすればよいですか?

4

1 に答える 1

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;
于 2010-06-03T13:48:23.670 に答える