- ベストアンサー
Windows2000でfind.exeを無視する方法?
Windows2000標準のfind.exeについて2つ質問です。 ご存知の方、よろしくお願いします。 1)標準のfind.exeを無効にしたいのですが、C:\ Winnt\Systtem32 配下のfind.exeは、削除してもリネームしても、すぐに自律的に復活するようで上手く出来ません。この理由や仕組みを教えてください。 2)VCを使って、Win32Consoleアプリを作った際の現象です。 Cygwinと混在した環境で使う際に、Windows側のPATHも、Cygwin側のパスもC:\Cygwin/binを先に参照するように宣言しているのですが、VCで作成したWin32Consoleアプリから、system("find ..."); として呼び出した際に、Windows標準のfind.exeが呼び出されるようで上手く出来ません。 これらの仕組みや対処方法について、よろしくご教示ください。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
1)のほうはズバリの回答が出ているようですが、もう1つ補足を。 WFPの有効・無効を切り替えるのが面倒なので、私はいつも「プロテクトされたファイル」と「dllcacheフォルダ内のファイル」の両方をまとめて上書きするようにしています。 WFPで保護されているファイルが上書きされてからWFPが動作してdllcacheフォルダ内のファイルで再度上書きされるまで、数秒のタイムラグがあるので、この作業は手作業でもそこそこ可能です。 2)はおそらく、こういうことだと思います。 VCでsystem("find.exe");を実行すると、環境変数comspecで指定されたシェル(通常はcmd.exe)を使ってcmd.exe /c find.exeを起動します。 そして、cmd.exeはfind.exeを実行しようとするのですが、その際cmd.exeはCreateProcess() APIを使用するはずです。この部分は想像ですが、これ以外の方法はないのでまず間違いないでしょう。 CreateProcess() APIは環境変数PATHに優先してWindowsのシステムフォルダ内を検索するので、標準のfind.exeが残っている場合はそちらが先に見つかり実行されます。 これが原因だとすれば、Win32コンソールアプリケーションからCygwinのfind.exeを使わせるには次のいずれかの方法が必要になります。 (1) CreateProcess() APIがファイル検索を行う必要がないように、必ず絶対パスでCygwinのfind.exeを指定する (2) Windowsシステムフォルダ内にあるfind.exeをCygwinのものに置き換える(あるいはリンクしてしまう)
その他の回答 (3)
- hope10
- ベストアンサー率48% (17/35)
古典的で思い付きではありますが、実行したいモジュール名(cygwinのそれを)を find.com と名付けて呼び出すのはどうでしょうか? 昔ながらの .exe より .com を先に起動する規則が生きていればの話ですが...
お礼
ご返信ありがとうございました。 この方法を試してみましたが、 Cygwin側で、findとして使えなくなってしまうようで、 だめでした。。 $ /bin/find bash: /bin/find: No such file or directory でもアイデアとして、ありがとうございました。
- deadline
- ベストアンサー率63% (1239/1943)
ANo.#1の補足。 WFPを一時的に無効にするには、レジストリの HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon SFCDisable REG_DWORD 0x00000000 を0x00000001または0xffffff9dに変更して、再起動します。 『Microsoft MSDN Online:System File Protection機能』 http://www.microsoft.com/japan/developer/windows2000/technologies/ac-win2kcompat/ac-sfp.asp
お礼
初めて知りました。大変勉強になりました。 即答ありがとうございました。
- deadline
- ベストアンサー率63% (1239/1943)
1).Windows 2000には、Windowsのシステムファイルを不用意な削除や上書きから保護するための『Windows File Protection(WFP)』機能というのがあり、WFPがオンになった状態(レジストリの変更で意図的にオフにしても、再々起動をすると自動的にオンになる(再起動後、オフ⇒次の再起動後、オン)でシステムファイルを削除したり上書きしたりすると、自動的に、キャッシュフォルダ("C:\WINNT\system32\dllcache")にバックアップされているファイルで書き戻すようになっています。("dllcache"フォルダにあるバックアップが壊れていたり、削除したりしていると、WindowsのCD-ROMを要求されます。) 『Microsoft サポートオンライン:Windows ファイル保護機能について』 http://support.microsoft.com/kb/222193/ja/ 2).こっちは原因が良くわかりませんが・・・、 Windows側のPATHの設定は、バッチファイル OR プログラム内で行っているのでしょうか? それとも、[マイコンピュータ]を右クリック⇒[プロパティ]⇒[詳細]タブ⇒[環境変数]で設定しても、ダメとか? (バッチファイル内だと、そのバッチファイル内でしか、設定が反映されない。)
お礼
お礼が大変遅くなりました。 皆様ありがとうございました。 結局、直接的な解決はしていないのですが、 他の方法(findをシステムコールせずに、dosfindfirst/nextをコーディングする)にて 解決させることにしました。 色々なご説明ありがとうございました。
補足
deadlineさん何度もありがとうございます。 2)の方ですが、マイコンピュータからの環境変数(システム変数側)の設定を変えています。 Cygwinの方は、起動用のCygwin.batの中でPATH指定しています。 VCの方のソースで、system("find …");の直前の行で、 system("which find.exe");としてやると、DOSコンソールには、C:\Cygwin\bin/find.exe のように出てきますし、ますます以って、謎になっています。
お礼
1)は試してみたのですが、どうも上手くいきませんでした。(方法が何かおかしかったのか、絶対パス指定しても、command not foundが出てしまう・・・) でもこちら、ちょっと試してみます。 2)はなるほど、その手が!。と盲点でした。 同じファイル名にしてしまえば、SFPでも上書きしないと・・・・ これも試してみたのですが、find.exeを上書きしてやっても元のWindows版のに戻ってしまいました。(何となく、意思を持ってそうで気持ち悪いです・・・) とにかく、ヒント・アイデアありがとうございました。