オープンしているファイルを調査する:Tech TIPS
ファイルを削除や移動しようとしても、使用中になっていて操作できないことがある。このような場合は、どのプロセスやユーザーがどのファイルをオープンしているかを調査できると便利である。openfilesというコマンドを使うと、使用中のファイルや共有リソースの一覧を調べることができる。
対象OS:Windows XP Professional/Windows Server 2003
解説
ファイルを削除したり、移動、更新しようとしても、何らかの理由でアクセスが拒否されることがある。原因のほとんどは、そのファイルを“誰か”がオープンしていたり、ロックしていて、移動や削除、変更などができないからである。だが、実際にだれがファイルを使用しているのかが分からないことも多い。特に、自分1人しか使っていないはずのマシンなのに、そして何もアプリケーションを起動していないはずなのに、どうしてもファイルを操作できない場合には、その原因を特定するのは困難である。たぶん、何らかのサービスかバックグラウンドで動作しているアプリケーションが、それらのファイルをオープンしているからだろうと推測はできるが、どのプログラムやサービスであるかを判断するのは非常に面倒である。いちいちサービスを停止したりしなければならないが、実際には停止できないようなサービスも多いからだ。
このような場合には、どのプロセスがどのファイルを使用しているかを知ることができるとありがたいだろう。プロセス名が分かればそのプログラムだけを停止させるなどの対処ができるし、削除してはいけないファイルであるかどうかなども分かるからだ。少なくとも、一時フォルダ中に作成されたファイルはむやみに何でも消してもよいというわけではなく、現在実行中のサービスやプロセスがオープンしているファイルはそのままにしておかなければならない。これらの判断を行うためにも、現在オープンされているファイルの一覧を知るのは、非常に重要であろう。
Windows XPやWindows Server 2003では、現在オープンされているファイルの一覧を知るためのコマンドとして、「openfiles.exe」というコマンドが用意されている。ただし残念ながらWindows 2000やNTなど、以前のOSではこのコマンドは利用できないので、代わりにSysinternalsのサイトで提供されている「Filemonツール」などを利用するとよいだろう。Sysinternalsは、主に開発者や管理者向けのツール開発などで著名なマーク・ルシノビッチ氏とブライス・コスウェル氏が公開しているWebサイトで、両氏が開発した数々のフリー・ソフトウェアが公開されている(別稿の「TIPS―レジストリへのアクセスをモニタする方法」では、Sysinternalsのregmonツールを紹介している)。
操作方法
それでは実際にopenfilesコマンドを使ってみよう。だが単にopenfilesというコマンドを実行するだけでは、次のようなメッセージが表示されるだけである。このメッセージ中にあるように、ローカル・マシン上のファイルの情報を取得するためには、システム・グローバル・フラグ(OSの動作状態を決めるためのパラメータの1つ)の「maintain objects list」をオンにし、ファイルの情報をトレースできるようにしておく必要がある。
C:\>openfiles
情報: ローカルで開いているファイルを表示するには、システム グローバル フラグ 'maintain objects list' を有効にしてください。詳細については Openfiles /? を参照してください。
ローカルの共有ポイントをとおしてリモートで開いているファイル:
---------------------------------------------
情報: 開いている共有ファイルが見つかりませんでした。
グローバル・フラグの「maintain objects list」をオンにするためには、コマンド・プロンプト上で「openfiles /local on」を実行する。
C:\>openfiles /local on
成功: システム グローバル フラグ 'maintain objects list' は有効になりました。
システムを再起動すると、変更が有効になります。
このとき表示されるメッセージに従ってシステムを再起動する。1度再起動すると、あとはどのユーザーでログオンしても、ファイルの情報を取得することができるようになる。ただしデフォルトでこのフラグがオフになっているのは、オンにすると(トレースのオーバーヘッドのために)システムのパフォーマンスが低下する可能性があるからだ。パフォーマンスを優先するなら、必要なときだけオンにするのがよいだろう。
●ローカル・マシンにおけるオープン状態の調査
以上のような準備を行った後で、単にopenfilesというコマンドを実行すると、現在ローカル・マシン上でオープンされているファイル(やフォルダ)の一覧と、リモートから共有(使用)されているファイル(やフォルダ)の一覧が表示される。
C:\>openfiles
ローカルで開いているファイル:
---------------------
ID プロセス名 開いているファイル (パス\実行可能ファイル)
===== ==================== ==================================================
12 explorer.exe C:\Documents and Settings\hiroy-u
52 explorer.exe C:\..rols_6595b64144ccf1df_6.0.10.0_x-ww_f7fb5805
64 explorer.exe C:\..rols_6595b64144ccf1df_6.0.10.0_x-ww_f7fb5805
68 explorer.exe C:\..rols_6595b64144ccf1df_6.0.10.0_x-ww_f7fb5805
76 explorer.exe C:\..rols_6595b64144ccf1df_6.0.10.0_x-ww_f7fb5805
(……中略……)
988 WINWORD.EXE C:\TMP\~DFC5F.tmp
ローカルの共有ポイントをとおしてリモートで開いているファイル:
---------------------------------------------
ID アクセス 種類 開いているファイル (パス\実行可能ファイル)
======== ==================== ========== ====================================
15 YOSHI-O Windows \PIPE\winreg
114 HIROMI-S Windows \PIPE\winreg
189 HIROY-U Windows C:\@WORK
C:\>
「ID」はファイルを識別するための内部番号であり、「プロセス名」はそのファイルをオープンしているプロセスの名称である。これにより、どのプロセスによってファイルがオープンされているのかを知ることができる。「開いているファイル」は、オープンされているファイルのパスを表しているが、表示を短くするために、一部が「..」で省略されている。「openfiles」というコマンドは、「openfiles /query」と同じ意味であり、これに「/v」というオプションを付けて「openfiles /query /v」とすると、ファイルのフルパス情報なども表示させることができる。
C:\>openfiles /query /v
ローカルで開いているファイル:
---------------------
ID アクセス プロセス名 開いているファイル (パス\実行可能ファイル)
===== =============== ==================== ================================================================
12 hiroy-u explorer.exe C:\Documents and Settings\hiroy-u
52 hiroy-u explorer.exe C:\WINDOWS\WinSxS\x86_Microsoft.Windows.Common-Controls_6595b64144ccf1df_6.0.10.0_x-ww_f7fb5805
(……以下省略……)
● 共有ファイルのオープン状態の調査
openfilesコマンドの出力では、後半に「ローカルの共有ポイントをとおしてリモートで開いているファイル:」という項目が表示されている。これは少々分かりにくいかもしれないが、ローカル・マシンが外部に向けて公開しているリソース(ファイル共有など)のうち、リモートからアクセスが行われているものの一覧ということである。使用中のリモート・サーバ上のリソースではなく、外部のマシンに向けて公開し、リモートから使用されているファイルの一覧が表示される。別稿の「TIPS―共有ファイルを現在使用しているユーザーを特定する方法」で紹介した、「net file」コマンドの出力と同等の情報が得られる。
ただし「net file」コマンドでは、これを実行しているローカル・マシンに関する情報しか得られないが、このopenfilesコマンドでは、自分以外のマシンの共有リソースの使用状況を調査することができる(「コンピュータの管理」ツールを使えばほかのマシンを調査することも可能。詳細は前述のTIPSを参照)。このためには、「openfiles /query」コマンドに、リモートのマシンを指定するための「/s マシン名」というオプションを付ける。また「/v」オプションを付けると、フルパス名やオープン・モード、ロック数など、より詳細な情報も表示される。
C:\>openfiles /query /s server01 ……リモートのSERVER01のオープン・ファイルを調査
ID アクセス 種類 開いているファイル (パス\実行可能ファイル)
======== ==================== ========== =====================================
4148759 SERVER02$ Windows \PIPE\lsarpc
4886732 SERVER03$ Windows \PIPE\samr
5047686 SERVER03$ Windows \PIPE\llsrpc
5396656 YOSHI-O Windows \PIPE\winreg
5440325 HIROMI-S Windows \PIPE\winreg
5440865 HIROY-U Windows \PIPE\spoolss
5441239 YOSHI-O Windows E:\..\ogawa\WinTIPS199\~WRL3790.tmp
5441240 YOSHI-O Windows E:\..\WindowsTIPS199-003.doc
5441863 HIROY-U Windows E:\..\■TIPS-オープンファイルの調査.doc
(……以下省略……)
※/v オプションを付けると、さらに詳細な情報が得られる
オープンされているこれらのファイルを強制的にクローズするには、「openfiles /disconnect /s server01 /id 5441239」などとすればい。このほかにも、ユーザー名やファイル名などを指定してクローズすることができるので、詳細はヘルプ(「openfiles /disconnect /?」を実行すると表示される)を参照していただきたい。
■この記事と関連性の高い別の記事
- リソースモニターでオープン中のファイルをモニターする(TIPS)
- Windowsで共有ファイルを現在使用しているユーザーを特定する方法(TIPS)
- これだけは覚えておきたいWindowsのコマンドプロンプトの使い方(TIPS)
- volrestコマンドでシャドウ・コピーから以前のバージョンのファイルを取り出す(TIPS)
- コマンド・プロンプトでファイル共有を管理する(TIPS)
Copyright© Digital Advantage Corp. All Rights Reserved.