連載
» 2002年08月17日 05時00分 公開

Tech TIPS:Windowsで共有ファイルを現在使用しているユーザーを特定する方法

ネットワーク経由でサーバ上のファイルをアクセスしていると、複数のユーザーが同じファイルを開こうとして共有違反が発生することがある。これを解決するには最初にオープンしたユーザーがファイルをクローズすればよいが、実際にはすでに終了したはずのプロセスがファイルをロックしていることもある。このような場合は、だれがファイルをオープンしているかをファイル・サーバ上で調べ、必要ならば強制的にファイルをクローズすればよい。

[小川誉久,デジタルアドバンテージ]
「Tech TIPS」のインデックス

連載目次

対象OS:Windows 2000 Professional/Windows XP Professional/Windows XP Home Edition/Windows 2000 Server/Windows 2000 Advanced Server



解説

 企業内は言うに及ばず、いまや家庭内でも、イーサネットなどで複数のコンピュータをネットワークで接続し、これらのコンピュータ間でファイル(ディスク)やプリンタを共有するのはもはや常識になってきた。

 複数のメンバーで共同作業を行うときなどは、共有ディレクトリを作って、互いに共有したい文書類などをここに格納しておけば、作業が容易になるし、このネットワーク上のファイルを直接編集するようにすれば、常に最新版の文書が共有ディレクトリに保存されることになり、無用なバージョンの混乱(古いファイルで新しいファイルを上書きしてしまうなど)を避けることができる。

 更新履歴などは残らないので、本格的なバージョン管理とはほど遠いまでも、部課単位の少人数での利用なら、特別なバージョン管理ソフトウェアなどなくても、運用に注意すれば実質的には問題なく作業を進められるだろう。

●共有違反を知らせるメッセージ

 しかし、共有ディレクトリをこのように運用していて、次のようなメッセージが表示されたことはないだろうか。

ファイルが使用中であることを知らせる警告メッセージ ファイルが使用中であることを知らせる警告メッセージ
これは、ある共有ファイル(00-0006.xls)をExcelで開こうとしたときに表示されたもの。このファイルはすでにhiroy-uさんによって編集中であり、編集モードではファイルを開くことができないと警告している。共有ファイルを複数のメンバーで入れ替わり立ち替わり編集していると、このようなメッセージに遭遇することも少なくない。

 これは、共有ディレクトリ上にあるファイル(00-0006.xls)をExcelで開こうとしたときに表示された警告メッセージである。メッセージの内容から分かるとおり、このファイルは「hiroy-u」さんがすでに編集モードで開いており、hiroy-uさんが編集を終えてファイルを閉じるまでは開くことができない。

 Excelを始めとするOffice製品では、この場合でも「読み取り専用」で開くことや、ファイルの使用が完了したときに通知メッセージを受け取ることなどができるが、多くのアプリケーションでは、「ファイルを開くことができません」といった簡単なメッセージ・ボックスが表示されるだけだろう。

 このようなメッセージが表示される理由は、先にそのファイルを開いたアプリケーションが、共有モードを「排他モード」にしてファイルを開いているためだ。Win32環境では、ファイルを開くためのAPI(CreateFile)にこの共有モードを指定するパラメータがある。意図的に「共有」を指定しない限り、(不用意にファイルを上書きしないように)ファイルを開くときには「排他モード」になる。

 しかし「書き込み可」としてファイルを開くと、そのファイルを開いている最中でも、別のアプリケーションがファイルを開いて更新できるようになってしまう(ちなみに、「読み取り可」と「書き込み可」属性は独立して指定できる)。複数メンバーでファイルを共有し、更新するような環境では、むしろこのようなアプリケーションの方が要注意である。この場合、あるユーザーが行った更新が、知らぬ間に別のユーザーによって書き換えられてしまう危険性があるからだ。

●不可解な共有違反メッセージ

 いま述べた共有違反メッセージは、1つのファイルに対する更新の競合を回避してくれるものだった。警告メッセージが突然表示されたりすると面食らうものだが、警告メッセージが表示されたら、そのファイルを現在編集しているメンバーを見つけて、そのメンバーが編集作業を終えるのを待てばよい(スマートではないが、狭いオフィスなら声を掛け合うのが最も手っ取り早いだろう)。

 しかし場合によっては、ファイルを開いている人が見あたらないにもかかわらず、共有違反メッセージなどが表示される場合がある。

 例えば1つのケースは、ファイルを開いたまま席を離れているユーザーがいる場合。あたかもローカル・ファイルを操作しているように、透過的にネットワーク上のファイルを操作できるようになったのは便利なことだが、その一方では、このようにルーズな使い方が簡単にできてしまうという問題もある。

 特に、クライアントPCをシャットダウンせずに24時間稼働させるようになると、共有ファイルを開いたまま、帰宅してしまうようなユーザーが出てこないともかぎらない。クライアントをロックして帰宅していたりすると、最悪の場合、編集途中のデータを捨てて、強制的に問題を解決するしかなくなる可能性もある。「共有ファイルは、編集を終えたらすぐに閉じること」というルールを決めて運用する必要があるだろう。

 しかしときとして、誰も明示的に共有ファイルを開いていないのに、別のユーザーがファイルを開こうとすると、共有違反メッセージが表示される場合もある。

 これは、アプリケーションが異常終了するなどして、共有ファイルのクローズに失敗し、ファイルが開かれたままになっているようなケースである。すでにアプリケーションのウィンドウは閉じてなくなっているが、ファイルを開いたままのプロセスがバックグラウンドで走行している場合などは、そのクライアントPCのユーザーですら、まさか自分が共有ファイルを開いているとは思わない(従って、声をかけても犯人は分からない)。

 こんなときには、次のようにして共有ファイルの使用状況を確認しよう。

操作方法

●共有ファイルの使用状況を確認する方法(GUI編)

 これにはまず、コントロール・パネルの[管理ツール]−[コンピュータの管理]アプレット(デスクトップにある[マイ コンピュータ]アイコンを右クリックするとポップアップ表示されるメニューの[管理]からも起動可能)を実行する。

 この管理ツールは、共有ディレクトリを公開しているサーバのコンソールから起動してもよいし、別のクライアント・コンピュータからリモート管理することも可能である(ただしいずれの場合も、サーバに対する管理者権限が必要)。

 ここでは具体例として、リモート管理する場合について紹介しよう。

[コンピュータの管理]ダイアログ [コンピュータの管理]ダイアログ
共有ファイルの使用状況を確認するには、コントロール・パネルの[コンピュータの管理]アプレットを実行する。デフォルトでは自分自身(ローカル・コンピュータ)が管理対象となっているので、まずは管理対象を共有ディレクトリを公開しているコンピュータに変更する。
  (1)管理対象を変更するには、ツリーの最上位にある[コンピュータの管理(ローカル)]をマウスで右クリックし、表示されるポップアップ・メニューの[別のコンピュータへ接続]を実行する(または[操作]−[別のコンピュータへ接続]メニューを実行する)。
  (2)これを実行すると、コンピュータ一覧が表示され、選択可能になる。

 このように、[コンピュータの管理]が起動すると、最初は自分自身のローカル・コンピュータが管理対象になっているので、リモートからサーバの操作を行うためには、次のようにして共有ディレクトリを公開しているコンピュータに管理対象を変更する(接続する)。

 これには[コンピュータの管理(ローカル)]をマウスで右クリックし、表示されるポップアップ・メニューの[別のコンピュータへ接続]を実行して表示されるダイアログで、目的のコンピュータを選択する(または[操作]−[別のコンピュータへ接続]メニューを実行する)。そして接続したいコンピュータ名を直接入力するか、次のようにしてネットワーク内のコンピュータ一覧から選択する。

[コンピュータの選択]ダイアログ [コンピュータの選択]ダイアログ
管理対象とするコンピュータ(共有ディレクトリを公開しているコンピュータ)を一覧から選択する。
  (1)Active Directoryを利用しているときには、ここからコンテナを選択する。するとそのコンテナに含まれるオブジェクト(コンピュータなど)が下のリストボックスに一覧表示される。
  (2)共有ディレクトリを公開しているコンピュータを選択する。
  (3)コンピュータ名が分かっているときには、ここにその名前を直接指定することも可能。
  (4)コンピュータを選択したら、このボタンをクリックする。

 この[コンピュータの選択]ダイアログで目的のコンピュータを選択して[OK]ボタンをクリックすると、[コンピュータの管理]の管理対象がそのコンピュータに変更される。

共有ディレクトリを公開するサーバが管理対象となった[コンピュータの管理]ダイアログ 共有ディレクトリを公開するサーバが管理対象となった[コンピュータの管理]ダイアログ
このように[コンピュータの管理]アプレットでは、リモートから別のコンピュータを管理することができる。今回は、左側のツリーから、[コンピュータの管理]−[システム ツール]−[共有フォルダ]−[開いているファイル]を選択する。すると、現在開かれている共有ファイルの一覧が右側のペインに表示される。
  (1)共有ファイルの使用状況を確認するには、[コンピュータの管理]−[システム ツール]−[共有フォルダ]−[開いているファイル]を選択する。
  (2)現在開かれている共有ファイル一覧。共有ファイル以外にも、名前付きパイプや印刷スプーラのジョブなどもここに一覧表示される。
  (3)現在開かれている共有ファイルのパス名。共有ディレクトリにドライブ文字を割り当てている場合には、そのドライブ文字がそのまま表示されていることが分かる。
  (4)現在、共有ファイルを開いているユーザーのユーザー名。
  (5)ネットワーク接続の種類。通常は「Windows」だが、Macintoshファイル・サービスを利用している場合には「Macintosh」、NetWareファイル・サービスを利用している場合には「NetWare」と表示される。
  (6)ファイルのロック数(複数ユーザーからのファイル・アクセスを排他制御するために、ファイルには「ロック」がかけられている)。
  (7)ファイルのオープン・モード。「読み取り」、「書き込み」、「書き込みと読み取り」などが表示される。

 この表示を見れば、現在どの共有ファイルが開かれているか、それを開いているユーザーは誰か、どのようなモード(読み取りか、書き込みか)でファイルが開かれているかを確認することができる。

●共有ファイルの使用状況を確認する方法(コマンドライン編)

 以上の管理ツールを使った方法は、初心者でも分かりやすいが、操作としてはかなり煩わしい。コマンド・プロンプト上で作業をすれば、もっと簡単に共有の一覧を調べることができる。

 操作方法としては簡単だ。まずはTelnetで目的のファイル・サーバにログオンし(もしくはリモート・デスクトップでログオンし)、コマンド・プロンプト上で「net file」というコマンドを実行するだけでよい(「net」と「file」の間には空白が必要)。

C:\>telnet server01
……(目的のシステムへ接続される)……
C:\>net file ……共有一覧を表示させる

ID         パス                                    ユーザー名           ロック数

-------------------------------------------------------------------------------
1259162    E:\prj                                  HIROMI-S              0
1285086    E:\prj\BOOKS                            YOSHI-O               0
1285568    E:\prj                                  TAKA-E                0
1286191    E:\usr                                  TAKA-E                0
1286211    E:\prj\...\@work\books_status.xls       YOSHI-O               3
1287153    E:\prj\...\SystemInsider\企画\schdule   AKI-K                 0
1288767    \PIPE\spoolss                           JUN-Z                 0
1288820    E:\usr                                  HIROY-U               0
1288822    E:\prj                                  HIROY-U               0
1288905    \PIPE\spoolss                           HIROMI-S              0
1290436    E:\usr\yusuke-i\Develop                 YUSUKE-I              0
1290729    E:\prj\...\table\007table.xls           HIROMI-S              0
1290978    E:\prj\...\@work\原稿.doc               JUN-Z                 3
コマンドは正常に終了しました。

C:\>net file 1290978 ……ファイルの状態を詳細表示させる
ファイル ID      1290978
ユーザー名       JUN-Z
ロック数         3
パス             E:\prj\fsys\007procs_hist01\@work\原稿.doc
アクセス許可     RWA
コマンドは正常に終了しました。



 「ID」はオープンしているファイルに付けられている一意の番号、「パス」はオープンしているフォルダやファイル、「ユーザー名」はファイルをオープンしているユーザーの名前である。より詳しく情報を見たければ、IDを指定して「net file 1290978」というふうに実行すればよい。ファイルのオープン・モードなどが表示される。

●共有ファイルを強制的に閉じる方法(GUI編)

 開きっぱなしになっている共有ファイルが特定できたら、通常はそのファイルを開いているユーザーに問い合わせて、ファイルを閉じてもらうことになるだろう(ファイルを開いたまま生き残っているプロセスがいるなら、それを強制終了する)。

 しかし必要なら、現在開かれている共有ファイルを強制的に閉じることも可能だ(繰り返すが、これには管理者権限が必要)。これには強制的に閉じたい共有ファイルを一覧から選択して、マウスの右クリックから表示されるポップアップ・メニューの[開いているファイルを閉じる]を実行すればよい。なお、現在開かれている共有ファイルをすべて閉じたければ、[操作]−[開いているファイルをすべて切断]メニューを実行する。

開いているファイルを強制的に閉じる 開いているファイルを強制的に閉じる
開いているファイルを強制的に閉じるには、一覧から目的のファイルを選択し、マウスの右クリックから表示されるポップアップ・メニューの[開いているファイルを閉じる]を実行する。
  (1)これを実行すれば、強制的にファイルを閉じることができる。ただし編集中のデータが失われる可能性があるので、操作は慎重に行うこと。

 強制的にファイルを閉じると、編集中のデータが失われる可能性がある。従って操作には慎重を期す必要があるし、ほかに手段がない場合(それを開いているユーザーに閉じてもらうことができないなど)に限り、これを実行するようにすべきだろう。

●共有ファイルを強制的に閉じる方法(コマンドライン編)

 コマンドラインを使って共有ファイルを強制クローズするには、「net file <ID> /close」というコマンドを使う。<ID>には先ほどのnet fileコマンドで表示されたIDを指定すればよい。

C:\>net file 1290978 /close ……強制クローズさせる
コマンドは正常に終了しました。



■更新履歴

【2002/08/17】Windows XPに関する情報を加筆・修正しました。

【2000/09/30】初版公開。


「Tech TIPS」のインデックス

Tech TIPS

Copyright© 1999-2017 Digital Advantage Corp. All Rights Reserved.

@IT Special

- PR -

TechTargetジャパン

この記事に関連するホワイトペーパー

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。