ネットワーク経由でサーバ上のファイルをアクセスしていると、複数のユーザーが同じファイルを開こうとして共有違反が発生することがある。これを解決するには最初にオープンしたユーザーがファイルをクローズすればよいが、実際にはすでに終了したはずのプロセスがファイルをロックしていることもある。このような場合は、だれがファイルをオープンしているかをファイル・サーバ上で調べ、必要ならば強制的にファイルをクローズすればよい。
対象OS:Windows 2000 Professional/Windows XP Professional/Windows XP Home Edition/Windows 2000 Server/Windows 2000 Advanced Server
企業内は言うに及ばず、いまや家庭内でも、イーサネットなどで複数のコンピュータをネットワークで接続し、これらのコンピュータ間でファイル(ディスク)やプリンタを共有するのはもはや常識になってきた。
複数のメンバーで共同作業を行うときなどは、共有ディレクトリを作って、互いに共有したい文書類などをここに格納しておけば、作業が容易になるし、このネットワーク上のファイルを直接編集するようにすれば、常に最新版の文書が共有ディレクトリに保存されることになり、無用なバージョンの混乱(古いファイルで新しいファイルを上書きしてしまうなど)を避けることができる。
更新履歴などは残らないので、本格的なバージョン管理とはほど遠いまでも、部課単位の少人数での利用なら、特別なバージョン管理ソフトウェアなどなくても、運用に注意すれば実質的には問題なく作業を進められるだろう。
しかし、共有ディレクトリをこのように運用していて、次のようなメッセージが表示されたことはないだろうか。
これは、共有ディレクトリ上にあるファイル(00-0006.xls)をExcelで開こうとしたときに表示された警告メッセージである。メッセージの内容から分かるとおり、このファイルは「hiroy-u」さんがすでに編集モードで開いており、hiroy-uさんが編集を終えてファイルを閉じるまでは開くことができない。
Excelを始めとするOffice製品では、この場合でも「読み取り専用」で開くことや、ファイルの使用が完了したときに通知メッセージを受け取ることなどができるが、多くのアプリケーションでは、「ファイルを開くことができません」といった簡単なメッセージ・ボックスが表示されるだけだろう。
このようなメッセージが表示される理由は、先にそのファイルを開いたアプリケーションが、共有モードを「排他モード」にしてファイルを開いているためだ。Win32環境では、ファイルを開くためのAPI(CreateFile)にこの共有モードを指定するパラメータがある。意図的に「共有」を指定しない限り、(不用意にファイルを上書きしないように)ファイルを開くときには「排他モード」になる。
しかし「書き込み可」としてファイルを開くと、そのファイルを開いている最中でも、別のアプリケーションがファイルを開いて更新できるようになってしまう(ちなみに、「読み取り可」と「書き込み可」属性は独立して指定できる)。複数メンバーでファイルを共有し、更新するような環境では、むしろこのようなアプリケーションの方が要注意である。この場合、あるユーザーが行った更新が、知らぬ間に別のユーザーによって書き換えられてしまう危険性があるからだ。
いま述べた共有違反メッセージは、1つのファイルに対する更新の競合を回避してくれるものだった。警告メッセージが突然表示されたりすると面食らうものだが、警告メッセージが表示されたら、そのファイルを現在編集しているメンバーを見つけて、そのメンバーが編集作業を終えるのを待てばよい(スマートではないが、狭いオフィスなら声を掛け合うのが最も手っ取り早いだろう)。
しかし場合によっては、ファイルを開いている人が見あたらないにもかかわらず、共有違反メッセージなどが表示される場合がある。
例えば1つのケースは、ファイルを開いたまま席を離れているユーザーがいる場合。あたかもローカル・ファイルを操作しているように、透過的にネットワーク上のファイルを操作できるようになったのは便利なことだが、その一方では、このようにルーズな使い方が簡単にできてしまうという問題もある。
特に、クライアントPCをシャットダウンせずに24時間稼働させるようになると、共有ファイルを開いたまま、帰宅してしまうようなユーザーが出てこないともかぎらない。クライアントをロックして帰宅していたりすると、最悪の場合、編集途中のデータを捨てて、強制的に問題を解決するしかなくなる可能性もある。「共有ファイルは、編集を終えたらすぐに閉じること」というルールを決めて運用する必要があるだろう。
しかしときとして、誰も明示的に共有ファイルを開いていないのに、別のユーザーがファイルを開こうとすると、共有違反メッセージが表示される場合もある。
これは、アプリケーションが異常終了するなどして、共有ファイルのクローズに失敗し、ファイルが開かれたままになっているようなケースである。すでにアプリケーションのウィンドウは閉じてなくなっているが、ファイルを開いたままのプロセスがバックグラウンドで走行している場合などは、そのクライアントPCのユーザーですら、まさか自分が共有ファイルを開いているとは思わない(従って、声をかけても犯人は分からない)。
こんなときには、次のようにして共有ファイルの使用状況を確認しよう。
これにはまず、コントロール・パネルの[管理ツール]−[コンピュータの管理]アプレット(デスクトップにある[マイ コンピュータ]アイコンを右クリックするとポップアップ表示されるメニューの[管理]からも起動可能)を実行する。
この管理ツールは、共有ディレクトリを公開しているサーバのコンソールから起動してもよいし、別のクライアント・コンピュータからリモート管理することも可能である(ただしいずれの場合も、サーバに対する管理者権限が必要)。
ここでは具体例として、リモート管理する場合について紹介しよう。
このように、[コンピュータの管理]が起動すると、最初は自分自身のローカル・コンピュータが管理対象になっているので、リモートからサーバの操作を行うためには、次のようにして共有ディレクトリを公開しているコンピュータに管理対象を変更する(接続する)。
これには[コンピュータの管理(ローカル)]をマウスで右クリックし、表示されるポップアップ・メニューの[別のコンピュータへ接続]を実行して表示されるダイアログで、目的のコンピュータを選択する(または[操作]−[別のコンピュータへ接続]メニューを実行する)。そして接続したいコンピュータ名を直接入力するか、次のようにしてネットワーク内のコンピュータ一覧から選択する。
この[コンピュータの選択]ダイアログで目的のコンピュータを選択して[OK]ボタンをクリックすると、[コンピュータの管理]の管理対象がそのコンピュータに変更される。
この表示を見れば、現在どの共有ファイルが開かれているか、それを開いているユーザーは誰か、どのようなモード(読み取りか、書き込みか)でファイルが開かれているかを確認することができる。
以上の管理ツールを使った方法は、初心者でも分かりやすいが、操作としてはかなり煩わしい。コマンド・プロンプト上で作業をすれば、もっと簡単に共有の一覧を調べることができる。
操作方法としては簡単だ。まずは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」というふうに実行すればよい。ファイルのオープン・モードなどが表示される。
開きっぱなしになっている共有ファイルが特定できたら、通常はそのファイルを開いているユーザーに問い合わせて、ファイルを閉じてもらうことになるだろう(ファイルを開いたまま生き残っているプロセスがいるなら、それを強制終了する)。
しかし必要なら、現在開かれている共有ファイルを強制的に閉じることも可能だ(繰り返すが、これには管理者権限が必要)。これには強制的に閉じたい共有ファイルを一覧から選択して、マウスの右クリックから表示されるポップアップ・メニューの[開いているファイルを閉じる]を実行すればよい。なお、現在開かれている共有ファイルをすべて閉じたければ、[操作]−[開いているファイルをすべて切断]メニューを実行する。
強制的にファイルを閉じると、編集中のデータが失われる可能性がある。従って操作には慎重を期す必要があるし、ほかに手段がない場合(それを開いているユーザーに閉じてもらうことができないなど)に限り、これを実行するようにすべきだろう。
コマンドラインを使って共有ファイルを強制クローズするには、「net file <ID> /close」というコマンドを使う。<ID>には先ほどのnet fileコマンドで表示されたIDを指定すればよい。
C:\>net file 1290978 /close ……強制クローズさせる
コマンドは正常に終了しました。
■更新履歴
【2002/08/17】Windows XPに関する情報を加筆・修正しました。
【2000/09/30】初版公開。
■この記事と関連性の高い別の記事
Copyright© Digital Advantage Corp. All Rights Reserved.