社内で使用している基幹ソフト (多分、VB.NETベース) があるのですが、平成から令和への対応パッチを含んだ Windows Update をインストールしてしまうと、基幹ソフトが利用している途中で強制的に終了されてしまう不具合が起きました。

 

ベンダーさんによると、不具合の原因は、Windows Update そのものではなく、基幹ソフト内で使用されているサードパーティー製のミドルウェアで、元号処理で何らかのハードコーディング1がなされているため、アプリケーションが終了させられるとのこと。

なお、開発元によると、この基幹ソフトで使用しているミドルウェアについてはパッチがないらしく、ひとまずレジストリをいじって問題を回避しないといけない。

どのようにいじるのかと言うと、もう使用しないであろう 「明治」に関するレジストリエントリを削除する (!) というもの。

元号に関するレジストリ

元号に関するレジストリは、次のレジストリパスにあります。

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Nls\Calendars\Japanese\Eras

キーに元号が変わった日付、データに元号の文字が入っています。

けっこうシンプルで単純ですね。これが令和パッチの正体。

グループポリシーでレジストリの削除を配布

以下の記事はレジストリの変更を伴う作業が含まれますので、実施される際は細心の注意を払ってください。
また、以下の作業において生じた問題についての責任は負えませんので、ご了承願います。

 

グループポリシーでレジストリの削除を配布するには次のようにします。

グループポリシーオブジェクトの作成

管理ツールから「グループポリシーの管理」を開きます。

[グループポリシーオブジェクト] を右クリックし、[新規]で新しいグループポリシーオブジェクトを作成します。

ここでは仮に名前を[reg_delete_sample] とします。

グループポリシーオブジェクトの編集

次に、グループポリシーオブジェクトの一覧に作成されたreg_delete_sample を右クリックして編集します。

左側のナビゲーションツリーを、

コンピューターの構成基本設定Windowsの設定レジストリ

と辿ります。

まだ、「表示する項目はありません」となっているとおもいますので、なにもないところを右クリックして

[新規作成] → [レジストリ項目]

とします。

すると、「新しいレジストリのプロパティ」が開きますので、以下のようにします。

「全般」タブで、

  • アクション: 削除
  • ハイブ: HKEY_LOCAL_MACHINE
  • キーのパス: SYSTEM\CurrentControlSet\Control\Nls\Calendars\Japanese\Eras
    (入力フィールドの横の[...] をクリックして順にキーをたどっていくと自動的に値の名前、値の種類、値のデータは埋めてくれます。)

適用範囲の設定

今回の事案では、あくまでWindows7 以降のコンピューターが対象になるので、もし対象を絞りたい場合には、「項目レベルで対象化する」必要が出てきます2。ここでは、Windows7、Windows8、Windows8.1、Windows10 を対象として設定する例を示します。

「新しいレジストリのプロパティ」の「共通」タブを開きます。

「項目レベルで対象化する」にチェックを入れて、[対象化] をクリックします。

「ターゲットエディター」が開くので、次のようにします。

  1. [新しい項目] → [オペレーティングシステム] を選択。
  2. 下部ペインから、製品を「Windows7」を選択
    → ”オペレーティングシステムが Windows7 である” と表示
  3. 再度、[新しい項目] → [オペレーティングシステム] を選択。
  4. 次に、[項目のオプション] → [または] を選択。
  5. 下部ペインから、製品を「Windows8」 を選択
    → " OR オペレーティングシステムが Windows8 である。” と表示。
  6. 以下、上記 3. ~ 5. を繰り返して残りの Windows8.1 、Windows10 も追加。

結果、次のようになっているのを確認してターゲットエディタを[OK]で閉じる。

グループポリシーオブジェクトの保存

ターゲットエディタを閉じたら、レジストリのプロパティも、[OK]をクリックして閉じます。

それから、グループポリシー管理エディタを閉じると、グループポリシーオブジェクト、reg_delete_sample が保存されます。

グループポリシーオブジェクトの割当

あとは、作成したグループポリシーオブジェクトを適切なOUに割り当てます。

今回の場合は、ローカルコンピュータに対するレジストリの割当なので、ドメインコンピューターに対して割り当てます。

以前の記事、「グループポリシー を使用して、タスクスケジューラでクライアントを自動で シャットダウン」と同じように、任意のOUを作成して、そこに先程のグループポリシーオブジェクトをリンクします。

ポリシー摘要の確認

該当するドメインメンバーのコンピュータに管理ユーザーでログオンした上で、コマンドラインでGPUPDATE /FORCE するか、あるいはコンピュータを再起動して、レジストリが削除されたかどうか、regedit で確認します。見事削除されていたら成功です。

まとめ

今回は、元号レジストリに細工をするという、大半の人には需要のない内容の話でしたが、グループポリシーでレジストリの操作が比較的簡単にできることがわかりました。あまりに簡単にできたので、少し怖いくらいですが・・

原則としては、レジストリ操作は最終手段だと思います。

通常のグループポリシーの項目だけでも十分すぎる内容があるので、それでもどうにもならないときにだけレジストリ操作するようにすべきですし、仮にレジストリを操作しなければいけない場合でも、オペレーションシステム毎の差異については、よく調査すべきかもしれませんね。


  1. 詳細は不明。エラー内容からすると、文字列バッファがハードコーディングされているのではないかと・・ 
  2. そもそも、Windows7 よりも前というのはすでにメーカーのサポート対象外なのでこの部分は必要ないかもしれませんが・・ 

0件のコメント

コメントを残す

メールアドレスが公開されることはありません。