web-dev-qa-db-ja.com

複数のコンピューター間でWindowsレジストリを同期する

Windows XPレジストリに、Dropboxスタイルの2台のコンピューター間で同期したい特定のフォルダーがあります。レジストリを変更するたびに、そのようにしたいのです。 1台のコンピューターでは、他のコンピューターに表示されます。

可能?どうやって?

(なぜ私がこれをしたいのか知りたい場合:すべてのコンピューターで同じPuTTYセッションを持ちたいです。)

9
Ram Rachum

時間がかかってすみません、これは私が答えを書くのにかかった最長だと思います!

何年も前、私は非常によく似た機能が欲しかったのですが、それを行う方法が見つかりませんでした...プログラミングがかなりわかったので、何かを作ってみる価値があると思いました。

それで、数時間後、私はあなたに_RegSync v1_を与えます。

enter image description here

完全なレジストリパス(この場合は_HKEY_CURRENT_USER\Software\SimonTatham\PuTTY_)のコピーを取り、ボックスに貼り付けるだけです。

[開始]をクリックすると、そのレジストリキーが追加、削除、または変更されていないか自動的に監視されます。

変更を検出すると、_*_は、アプリケーションが実行されているのと同じフォルダーに_regsync.reg_というレジストリファイルをエクスポートします。

_*_一度に複数の変更があった場合、最初の変更後5秒間待機します。

スタートボタンが押されたとき/後に、_regsync.reg_ファイルへの変更がないかフォルダを監視し、変更を検出すると、ローカルで選択したレジストリキーのすべてのエントリを削除してインポートしますレジストリファイル。 (注意してください。_.Reg_ファイルが監視している場所と一致するかどうかはチェックされないため、PCごとに異なる場所を入力すると、問題が発生する可能性があります)。

つまり...これは、DropboxやWindowsの共有、またはその他のフォルダー共有サービスから実行できます。両方のコンピューターで実行し、監視するレジストリキーを選択します。

追記...

  • これには、.NETFrameworkバージョン4が必要です。

  • サブキーは監視されません。別のフォルダーでツールの追加コピーを実行できます(これを改善するためのアイデアはすでにありますが、ツールが必要な場合に限ります)。

  • UACの昇格は必要ありませんが、レジストリからインポートまたはエクスポートしようとするたびに昇格のバグが発生します(基本的には_regedit.exe_/_reg.exe_を呼び出します)。したがって、実行することをお勧めします。プログラムが昇格しました...これを数回実行すると、非常に煩わしくなります。

  • 保証はありません-「Worksonmy PC」バッジを取得し、いくつかのマシンでテストしましたが、コードレビューと何時間ものテストがありませんでした...数時間で終了します。

使わなくても、誰かのお役に立てば幸いです!

ダウンロードリンク

6
William Hilsum

必要なエントリを正確に含むレジストリファイルを使用して、サイレントモードでregedit.exeを実行する方が簡単な場合があります。共有の場所から実行するように各コンピューターを設定できるため、ファイルを更新するだけで、次にスケジュールされたregedit.exeの実行が各コンピューターで実行されたときに、新しいエントリが取得されます。

何かのようなもの:

regedit.exe /S puttyentries.reg

1台のコンピューターからレジストリキーを取得するには、次を使用します。

regedit.exe /E puttyentries.reg "registry_key"

レジストリのリモート読み取り/書き込み機能でvbscriptまたはautoitを使用して、プロセス全体を自動化するより洗練された方法があるでしょう。

これは、リモートコンピューターと30分ごとに同期するAutoItの例です(注意、私は実際にこれをテストしていません):

While 1 ;loop indefinitely
    $i1 = 1 ;set initial counter
    While 1 ;loops through all sessions
        $keyname = RegEnumVal("\\REMOTECOMPUTER\HKEY_CURRENT_USER\Software\SimonTatham\PuTTY\Sessions", $i1) ;reads session names
        If @error <> 0 Then ExitLoop ;exits when no more sessions exist
        $i2 = 1 ;set initial counter
        While 1 ;loops through all value in key until done
            $valuename = RegEnumVal("\\REMOTECOMPUTER\HKEY_CURRENT_USER\Software\SimonTatham\PuTTY\Sessions" & "\" & $keyname, $i2) ;read value name from remote machine
            If @error <> 0 Then ExitLoop ;errors and escapes when no more values to read
            $type = @extended ;sets registry value type
            $value = RegRead("HKEY_CURRENT_USER\Software\SimonTatham\PuTTY\Session" & "\" & $keyname, $valuename) ;read value
            RegWrite("HKEY_CURRENT_USER\Software\SimonTatham\PuTTY\Session" & "\" & $keyname, $valuename, $type, $value) ;write key value to local machine
            $i2 = $i2 + 1 ;increment by 1
        WEnd
        $i1 = $i1 + 1 ;increment by 1
    WEnd
    Sleep(1800000) ;sleep 30 min
WEnd
5
MaQleod