Windows File Protection を無視する方法

Windows 2000やMe以降のOSにはシステムファイルを置き換えても元に戻す機能が搭載されています。
Windows File ProtectionやSystem File Checker と呼ばれる機能です。(MeはSystemFileProtection)

でも、パッチを当てたりしたシステムファイルが置きかえれなくて困ることもあります。
そこで、これらを無効にする方法や、有効にしたまま置き換える方法を紹介します

Windows 2000のsfc.dllを少し解析してみたので、通常説明されていない値についても書いています。

レジスタの変更後は再起動が必要です。

レジストリ HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon と
HKEY_LOCAL_MACHINE\Software\Policies\Microsoft\Windows NT\Windows File Protection
後者が優先される。

SfcScan(DWORD)

0x0= 再起動後に保護されたファイルをスキャンしない (デフォルト値)
0x1= 再起動のたびにすべての保護されたファイルをスキャンする (sfc /scanboot を実行した場合に設定)
0x2= 再起動後 1 回のみすべての保護されたファイルをスキャンする (sfc /scanonce を実行した場合に設定)

SFCQuota(DWORD)
Dllcache で保護される検証済みのキャッシュサイズ。
ただし、仮想ディスクの最大値を差し引いたHDDの空き容量が600M未満の場合や、ネットワークインストールしたときのi386\lang 内のファイルは除外される。

SFCDllCacheDir(REG_EXPAND_SZ)
DllCacheのデフォルトの場所、デフォルトは%SystemRoot%\System32

SFCDisable(DWORD)
1のときSFCが無効になる起動の際、再び有効にするかどうか確認される。デバッガが必要。
2の時は次の起動の時のみ、ただし、デバッガが必要。
3はsetup.exeやsfctest.exeのパフォーマンステスト用。有効になる。
4の時は有効だが、ポップアップを表示しない(サーバーOSのデフォルト)
0xffffffd9 無効にする。

SFCShowProgress(DWORD)
System File Checker がスキャン中に進行メーターを表示しない場合は0を指定する(デフォルトは表示)

SFCDebug(DWORD)
SFCのデバッグ用?読み込むだけで未使用。

SFCChangeLog(DWORD)
0以外の時、%systemroot%\sfclog.txt にログを出力する。

SFCStall(DWORD)
指定時間(秒)の間SFCの機能を停止する

Windows Meの場合は
HKey_Local_Machine\Software\Microsoft\Windows\CurrentVersion\SystemFileProtection
レジストリのShowPopups の値を1にするとポップアップ表示が有効になります。
以前の記事で書いたようにmsconfigでスタートアップの *STATEMGRを無効にして再起動 するとSFPを無効にすることもできます。

Windows 2000やXPは以下のフォルダを参照してファイルを復元します。

%SystemRoot%\system32\dllcache %SystemRoot%\ServicePackFiles
%SystemRoot%\Driver Cache\i386

ですから、これらの参照もとのファイルを置き換えたり、フォルダを一時的に別の名前にしてしまうと、参照して復元することができません。

それを利用して、SFCを無効化せずにファイルを置き換えることもできます。

これらを、IE6 BonusPackがインストールできない人は試してみてください。

関連サイト:
Windows ファイル保護機能について
Windows ファイル保護と Windows
システム ファイルの保護のポップアップ通知を表示する方法

関連記事:
Windows Me に Windows Script Host 5.7をインストール
Internet Explorer 6 Bonus Pack 作りました

おすすめ

16件のフィードバック

  1. gas detector より:

    HKEY_LOCAL_MACHINE\Software\Policies\Microsoft\Windows NT\Windows File Protectionというキーが見あたりません。
    HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoftまでは有るのですが
    以降Windows NTというキーが無く代わりにWindowsといったキーが有ります。
    HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windowsには
    Windows File Protectionというキーは有りません。
    レジストリ内を「Windows File Protection」で検索したところ
    HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Eventlog\System\Windows File Protectionというキーは有りましたが
    上記のDWORD値は有りませんでした。

  2. gas detector より:

    HKEY_LOCAL_MACHINE\Software\Policies\Microsoft\Windows NT\Windows File Protectionというキーが見あたりません。
    HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoftまでは有るのですが
    以降Windows NTというキーが無く代わりにWindowsといったキーが有ります。
    HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windowsには
    Windows File Protectionというキーは有りません。
    レジストリ内を「Windows File Protection」で検索したところ
    HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Eventlog\System\Windows File Protectionというキーは有りましたが
    上記のDWORD値は有りませんでした。

  3. blackwingcat より:

    sfc.dll上では Software\Policies\Microsoft\Windows NT\Windows File Protection を参照してるので間違いないようです。
    ある場合に最優先されるだけなので、気にしなくて良いでしょう。

  4. blackwingcat より:

    sfc.dll上では Software\Policies\Microsoft\Windows NT\Windows File Protection を参照してるので間違いないようです。
    ある場合に最優先されるだけなので、気にしなくて良いでしょう。

  5. gas detector より:

    SFCDisableに「ffffffd9」を入力して再起動すると「0」に戻ってしまいました。
    変更後再起動せずにWindowsXP-Windows2000-Script58-v3-x86-jpn.EXEを実行しても
    jscript.dllのバージョンは変わらないようです。

  6. gas detector より:

    SFCDisableに「ffffffd9」を入力して再起動すると「0」に戻ってしまいました。
    変更後再起動せずにWindowsXP-Windows2000-Script58-v3-x86-jpn.EXEを実行しても
    jscript.dllのバージョンは変わらないようです。

  7. blackwingcat より:

    SFCの件は調べてみますが
    ためしに、explorer.exeを全て終了させた状態で、Jscript.dllをコマンドプロンプトで削除できるか確認して(復活しないのを確認して)、WindowsXP-Windows2000-Script58-v3-x86-jpn.EXE か IE6Bonus-Packを実行してみてください。
    復活するなら、復旧元のフォルダを一時的に変更してみてください。

  8. blackwingcat より:

    SFCの件は調べてみますが
    ためしに、explorer.exeを全て終了させた状態で、Jscript.dllをコマンドプロンプトで削除できるか確認して(復活しないのを確認して)、WindowsXP-Windows2000-Script58-v3-x86-jpn.EXE か IE6Bonus-Packを実行してみてください。
    復活するなら、復旧元のフォルダを一時的に変更してみてください。

  9. gas detector より:

    ファイルが復活するのは、元のファイルがバックアップとして残ってるからです。
    この記事にあるように、元のフォルダ名を変更します。
    C:\WINNT\system32は復旧元ではなく復旧先です
    Jscript.dllを削除してもすぐに復活してしまうのですが
    「復旧元のフォルダを一時的に変更してみてください。」
    とはどういう事でしょうか。
    Jscript.dllが存在するC:\WINNT\system32のフォルダ名を変更しろという事でしょうか。
    復旧元のフォルダがわかりません。

  10. gas detector より:

    ファイルが復活するのは、元のファイルがバックアップとして残ってるからです。
    この記事にあるように、元のフォルダ名を変更します。
    C:\WINNT\system32は復旧元ではなく復旧先です
    Jscript.dllを削除してもすぐに復活してしまうのですが
    「復旧元のフォルダを一時的に変更してみてください。」
    とはどういう事でしょうか。
    Jscript.dllが存在するC:\WINNT\system32のフォルダ名を変更しろという事でしょうか。
    復旧元のフォルダがわかりません。

  11. blackwingcat より:

    ファイルが復活するのは、元のファイルがバックアップとして残ってるからです。
    この記事にあるように、元のフォルダ名を変更します。
    C:\WINNT\system32は復旧元ではなく復旧先です

  12. blackwingcat より:

    ファイルが復活するのは、元のファイルがバックアップとして残ってるからです。
    この記事にあるように、元のフォルダ名を変更します。
    C:\WINNT\system32は復旧元ではなく復旧先です

  13. gas detector より:

    C:\WINNT\Driver Cache\i386をC:\WINNT\Driver Cache_tmp\i386_tmpに変更し
    C:\WINNT\system32\dllcacheをC:\WINNT\system32\dllcache_tmpに変更した上で
    (%SystemRoot%\ServicePackFilesは容量確保の為既に削除済みでした)
    jscript.dllを削除しても復活してしまいました。
    Cドライブを対象に「jscript.dll」をWindows標準の検索ツールで検索しても
    C:\WINNT\system32\jscript.dll以外に見あたりません。
    バックアップ元はどこにあるのでしょうか。

  14. gas detector より:

    C:\WINNT\Driver Cache\i386をC:\WINNT\Driver Cache_tmp\i386_tmpに変更し
    C:\WINNT\system32\dllcacheをC:\WINNT\system32\dllcache_tmpに変更した上で
    (%SystemRoot%\ServicePackFilesは容量確保の為既に削除済みでした)
    jscript.dllを削除しても復活してしまいました。
    Cドライブを対象に「jscript.dll」をWindows標準の検索ツールで検索しても
    C:\WINNT\system32\jscript.dll以外に見あたりません。
    バックアップ元はどこにあるのでしょうか。

  15. blackwingcat より:

    復活と言う話なのですが、コピー自体はできていますか?
    一度 Explorer.exe / IExplore.exeを終了後、コマンドプロンプトで
    JScript.dllを削除してみて、ファイルが復活するかチェックしてみてください。
    復活するならば、Filemonでどこからコピーされているか見てみましょう。

  16. blackwingcat より:

    復活と言う話なのですが、コピー自体はできていますか?
    一度 Explorer.exe / IExplore.exeを終了後、コマンドプロンプトで
    JScript.dllを削除してみて、ファイルが復活するかチェックしてみてください。
    復活するならば、Filemonでどこからコピーされているか見てみましょう。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です