• ベストアンサー

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が呼び出されるようで上手く出来ません。 これらの仕組みや対処方法について、よろしくご教示ください。

  • supob
  • お礼率81% (49/60)

質問者が選んだベストアンサー

  • ベストアンサー
  • xcrOSgS2wY
  • ベストアンサー率50% (1006/1985)
回答No.3

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のものに置き換える(あるいはリンクしてしまう)

supob
質問者

お礼

1)は試してみたのですが、どうも上手くいきませんでした。(方法が何かおかしかったのか、絶対パス指定しても、command not foundが出てしまう・・・) でもこちら、ちょっと試してみます。 2)はなるほど、その手が!。と盲点でした。 同じファイル名にしてしまえば、SFPでも上書きしないと・・・・ これも試してみたのですが、find.exeを上書きしてやっても元のWindows版のに戻ってしまいました。(何となく、意思を持ってそうで気持ち悪いです・・・) とにかく、ヒント・アイデアありがとうございました。

その他の回答 (3)

  • hope10
  • ベストアンサー率48% (17/35)
回答No.4

古典的で思い付きではありますが、実行したいモジュール名(cygwinのそれを)を find.com と名付けて呼び出すのはどうでしょうか? 昔ながらの .exe より .com を先に起動する規則が生きていればの話ですが...

supob
質問者

お礼

ご返信ありがとうございました。 この方法を試してみましたが、 Cygwin側で、findとして使えなくなってしまうようで、 だめでした。。 $ /bin/find bash: /bin/find: No such file or directory でもアイデアとして、ありがとうございました。

  • deadline
  • ベストアンサー率63% (1239/1943)
回答No.2

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

参考URL:
http://www.microsoft.com/japan/developer/windows2000/technologies/ac-win2kcompat/ac-sfp.asp
supob
質問者

お礼

初めて知りました。大変勉強になりました。 即答ありがとうございました。

  • deadline
  • ベストアンサー率63% (1239/1943)
回答No.1

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 プログラム内で行っているのでしょうか? それとも、[マイコンピュータ]を右クリック⇒[プロパティ]⇒[詳細]タブ⇒[環境変数]で設定しても、ダメとか? (バッチファイル内だと、そのバッチファイル内でしか、設定が反映されない。)

参考URL:
http://support.microsoft.com/kb/222193/ja/
supob
質問者

お礼

お礼が大変遅くなりました。 皆様ありがとうございました。 結局、直接的な解決はしていないのですが、 他の方法(findをシステムコールせずに、dosfindfirst/nextをコーディングする)にて 解決させることにしました。 色々なご説明ありがとうございました。

supob
質問者

補足

deadlineさん何度もありがとうございます。 2)の方ですが、マイコンピュータからの環境変数(システム変数側)の設定を変えています。 Cygwinの方は、起動用のCygwin.batの中でPATH指定しています。 VCの方のソースで、system("find …");の直前の行で、 system("which find.exe");としてやると、DOSコンソールには、C:\Cygwin\bin/find.exe のように出てきますし、ますます以って、謎になっています。

関連するQ&A

  • Windows 7から2000へのmsg.exe

    お世話になります。 別マシンにポップアップ・メッセージを送りたい際に,Windows 2000/XPまでであれば「net send」コマンド,Windows Vista/7 であれば「msg.exe」コマンドがあります。 今回 Windows 7(マシン名:\\win7) から Windows 2000(マシン名:\\win2k)へメッセージを送りたいのですが; win7 > msg.exe console /server:win2k "テストメッセージ" セッション名の取得エラー 1722 で送信することができません。 また win7 上で「net send ~」しようとしてもコマンドが実装されていません。 なお受信(win2k)側で,以下の設定は実施済みです。 HKLM\SYSTEM\CurrentControlSet\Control\Terminal Server\AllowRemoteRPC = 1(REG_DWORD) 何か良い術はありませんでしょうか。よろしくお願いします。

  • Windows Vistaでコンソールアプリを作れるか?

    現在、WindowsXP, Borland C++Builder6付属のBCC32.EXE で作ったコンソールアプリをフリーソフトとして公開しています(結構人気があります)。 Windows Vistaでも引き続きコンソールアプリを作れるでしょうか? 具体的には FreeConsole() AllocConsole() CONSOLE_SCREEN_BUFFER_INFO などが Win32 API でサポートされるか? ということです。 (Windows が新しくなるたびに、コンソールアプリが未サポートになるんじゃないかとヒヤヒヤします。)

  • Cドライブ直下にコピーってどうするの?

    付属CDROMの「APPLICATION」のフォルダからPHP-4.42-WIN32.ZIPを解凍してください。フォルダ名を「PHP」とリネームして、Cドライブ直下にコピーします。パスで示せば、C:\PHPとなるようにします。 ーーーーーーーーーーーーーーーーーーーーーーー WORLDPRESS標準ガイドブックの付属のCDをインストールしたいです。 。。。が意味分かりません。 これはPHP-4.42-WIN32.ZIPを解凍してからフォルダ名を「PHP」とリネームするのでしょうか? PHP-4.42-WIN32.ZIPをクリックしてもクリックしてもフォルダが展開されるだけですが、これは展開=解凍なのでしょうか? フォルダ名を「PHP」とリネームとありますが何のフォルダ名をリネームするのでしょうか?だいたいリネームとは何ですか?勝手に名前を変えるのですか? Cドライブ直下にコピーとはどうするのですか? パスでどうやったら示せるのですか? パスとは何ですか? どうやったらC:\PHPになるのですか? 全くチンプンカンプンです。 どうか助けてください。

  • EXEへの引数渡しについて

    VC++でプログラミングしています。 MFCを使ってダイアログベースのEXEを造っています。 このEXEは別のプロセスから CreateProcess関数で起動され、 引数も渡されます。 で、質問です。 ダイアログのEXEでは、渡された引数を解析するために、何処で、 どのようにしたらよいのでしょうか? C言語での (argc, argv) のような仕組みがあるのでしょうか? 識者の方、ご教授願います。

  • windowsにphp7.4をインストールする方法

    windowsにphp7.4をインストールする方法が分かりません。 URL記事  https://mebee.info/2020/04/17/post-9565/ を参考にして、この記事の少し下に 「php7.4インストール」 という項目があるのですが、実は自身のパソコンがwindoes8.1proというOSを使っているのですが、「ユーザー環境変数(U)の画面のPathの画面まで、出すことができたのですが、 その後の、「C:\php-7.4.5-Win32-vc15-x64」を追加して「OK」ボタンをクリックします。」と書いて部分が分からずに困っています。 Pathをダブルクリックすると、「付属画像のように、ユーザー変数の編集」という画面が出てきて、OKをクリックすると、画面が閉じるだけなのですが、 windows8.1では、「C:\php-7.4.5-Win32-vc15-x64」を追加して「OK」ボタンをクリックします。」はどのようにしたらよいのでしょうか? どうやって追加すれば良いのでしょうか? 先に進めずに困っています。 詳しい方回答よろしくお願いします。

  • msnetcfg.exeはバックドア?

    OSはWindows2000です。 ちょっと前から、マシンにかなりの負荷がかかるように なったので、タスクマネージャを監視していると、 いつの間にか「msnetcfg.exe」がCPUを食っているんです。 で、こやつを調べると「MoSucker」というトロイの木馬の バックドアらしいということは分かったのですが、 なにせ、英語のページばかりで正しい対応策がわかりません。 取り敢えず、起動しないように「msnetcfg.exe.sv」とリネームして いるのですが、そうすると、OSの起動時に毎回「msnetcfg.exe.sv」が アプリケーションに割り当てられていないために、起動できない というメッセージが出て、とてもウザイです。 とうやら、「C:\WINNT\OleFiles」フォルダ内にあるアプリを 起動時に実行するようにレジストリを書き換えている 感じなんですが・・・。(msnetcfg.exeはその中にあった) さて、この状態で私が対応すべきことはなんでしょうか。 どなたか正しい対処方法をお教えください。 今のところ、実害はないので、あまり焦ってないですが。

  • Windows での gccの使い方

    パソコンの初心者です。プログラムを作った経験はあるのですが、Windowsでgccを使おうとして、思わぬところではまっています。http://www2.ktokai-u.ac.jp/~kfuji/cygwin/cygwin.htm より、cygwin をゲットし、起動することに成功しました。プロンプト「$」が現れ、昔作ったCプログラムは無事コンパイルされました。ところが、プログラム中にprintf("Hello \n"); 等のprintf文を書いてコンパイルし、$./a.exe を実行しても、標準出力にHello の文字が出力されないのです。おそらく簡単なところでつまづいているのだと思います。何を誤っているのでしょうか?助けてください。よろしくお願いします。

  • Cygwinでsshdを立て、外部から接続したときにWindowsでPATHが通っているコマンドを使いたい

    家のパソコンにCygwinとVisual C++がインストールしてあります。 VC++のコマンドラインからのコンパイル(cl等)を使っているんですが、外から家のパソコンにsshで入ってclなんかを使えるようにしたいです。 Cygwinでsshデーモンを起動して、外からログインするところまではできたんですが、ssh上からclを実行することができません。 PATHが通っていないんだろうなとは思うんですが、どこでどのように設定したらいいのか分かりません。 回答お願いします。

  • EXEファイルに画像も含ませる(?)方法

     いつも勉強させていただいております。 質問させていただきます。どうぞよろしくお願いいたします。  VB2008のFormに下のようなコードでjpg画像を貼り付けております。    Form1.BackgroundImage = Image.FromFile(Path & "Form1.jpg")  ビルドしてできたEXEファイルを他のPCで実行しようとすると 指定したパスに画像が見つからない、といった内容のエラーが出ますが 絵のついたアプリを作成する際,画像群もEXEファイルと常に一緒に移動しないといけないのでしょうか??  画像をEXEファイルに含んでおいて、起動するとすでにFormに 画像が張り付いている...(普通そうだと思うんですが...) というやり方が分かりません.是非アドバイスいただけないでしょうか。  どうぞよろしくお願いいたします。

  • Windows依存ではなく、Cygwinのtelnetの利用方法

    XFree86/cygwinでtelnetを利用する際に、windows依存のtelnetではなく、cygwinのtelnetを利用しないとtelnetコマンドが利用できないので、cygwinのtelnetのダウンロード方法を教えて頂きたいと思います。 cygwin上で、which telnetとすると、 $which telnet /cygdrive/c/WINNT/system32/telnet となっており、windowsのtelnetを利用しています。 cygwinをインストールしたsetup.exeからダウンロードしようと思ったのですが、netカテゴリにも見あたらず、全てのカテゴリを見てみたのですがtelnetらしきものが見あたらなかったので、どこからダウンロードしたらよいでしょうか? どうかよろしくお願いします。