Windows10ではエクスプローラの[ネットワーク]にPCが表示されないことがある。これは、Windows 10でファイル共有を行うSMBv1モジュールが削除されたことに起因する。そこで、この不具合を解消し、エクスプローラの[ネットワーク]に他のPCを表示させる方法を紹介する。
対象:Windows 10
Windows 10 Fall Creators Update(Ver.1709/RS3)以降で、エクスプローラの[ネットワーク]に他のPCが表示されないことがある。
これは、Windows 10 April 2018 Updateから、サーバメッセージブロックプロトコルの最初のバージョンである「SMBv1」モジュールが削除されたことに起因する。なお、現時点では、影響はエクスプローラの[ネットワーク]でのPCの表示のみで、プリンタやDLNAデバイスなど、SMBv1を利用していないネットワークデバイスは依然として表示できる。
また、[ネットワーク]内の他のPCもエクスプローラで表示できないだけで、アドレス欄に直接UNCを入力することでアクセスは可能だ。このため、他のPCへのショートカットなどをクイックアクセスに登録していると、この現象に気が付きにくい。本稿では、SMBv1モジュールが削除された影響や対処方法などを解説する。
SMBモジュールとは、Windowsネットワークにおいてファイル共有やプリンタ共有などに利用されるプロトコルである(Windowsネットワークの基礎「第7回 ファイル共有プロトコルSMBの概要」) 。
Windows 10では、SMBバージョン1(SMBv1)、SMBバージョン2(SMBv2)、SMBバージョン3(SMBv3)がサポートされている。しかしSMBv1には数々の脆弱(ぜいじゃく)性が見つかっているものの、その仕様上、脆弱性の解消が難しいことから、現在、SMBv1モジュールは利用停止が推奨されている。実際、Windows 10 Fall Creators Updateへアップグレードした場合、一定期間SMBv1プロトコルの利用がない場合に自動削除されるようになっている。
具体的には、PCの稼働時間でのべ15日以上(電源オフの時間を除く)、SMBv1を利用しなかった場合、Windows 10 Fall Creators Updateは、SMBv1モジュールを自動で削除する。また、SMBv1が残っていた場合でもWindows 10 April 2018 Updateにアップグレードした段階で、削除が行われる。
これにより、幾つか影響がある。1つは、SMBv1しか対応していないNASやネットワークプリンタ、ネットワークプリンタサーバアダプターなどとの接続が不可能になる。これは個別の機器の問題で、例えば設定でSMBv2以上を利用するように切り替えることで、利用可能になるものもある。また、これらの機器の中には、利用に際してSMBv1を有効化するように求めるものもあるが、前述の通り、脆弱性があるので運用で回避する必要がある。
最も大きな影響は、エクスプローラの[ネットワーク]にPCが表示されなくなることだ。
エクスプローラの[ネットワーク]にPCを表示する機能は、標準ではコンピュータブラウザサービスに依存しているが、このコンピュータブラウザサービスは、SMBv1を利用していた。このためSMBv1モジュールが削除されると動作することができなくなる。このため、エクスプローラの[ネットワーク]にはPCが表示されなくなってしまう。
しかし、エクスプローラの[ネットワーク]には、プリンタやルーターなど「その他のデバイス」や「メディア機器」などが表示されている。これらはコンピュータブラウザサービスではなく、他のプロトコルにより列挙されているからだ。
エクスプローラの[ネットワーク]で「探索方法」のカラムを表示させる(表示形式を「詳細」にしてから、項目の行を右クリックしてプルダウンリストから[探索方法]を選択)と、該当のデバイスを見つけたプロトコルを表示させることができる。コンピュータブラウザサービスを使って見つけたPCの場合には、「NetBIOS」の表示が出る。
つまり、他のプロトコルで探索できるのであれば、エクスプローラの[ネットワーク]にPCを表示させることができるわけだ。
なお、SMBv1モジュールは、有効な機能から削除されたとはいえ、機能モジュールファイルが削除されているわけではない。[コントロールパネル]−[プログラムと機能]−[Windowsの機能の有効化または無効化]−[SMB 1.0/CIFSファイル共有のサポート]を使って復活させることも可能だ。
ただし、SMBv1を有効にすることで、セキュリティ上のリスクが生じることは念頭に置いておいた方がよい。そもそも、SMBv1しか対応していない専用機器を使い続けること自体がリスクであり、PC側でSMBv1を有効にすることでさらにリスクを高めた状態になることは理解しておこう。
エクスプローラの[ネットワーク]にPCを表示させる別のプロトコルとして「Web Service Discovery」(WS-DiscoveryあるいはWS-D)がある。これは、マルチキャストとSOAPを使い、ローカルネットワーク内の機器を探索する機能だ。エクスプローラは、このWS-DによるPCやデバイス(プリンタなど)の列挙機能を持つ。
WS-DでPCの存在を検出できるようにするには、対象となるPCで、「Function Discovery Resource Publication(FDResPub)」サービスを起動しておく。このサービスは、WS-Dによるデバイス発見に応答する機能があり、エクスプローラが起動する「Function Discovery Provider Host(FDPHost)」サービスでPCを検出することが可能になる。
簡単に言うと、ローカルネットワーク内の各PCでFDResPubサービスを起動すれば、他のPCの[ネットワーク]に該当のPCが表示されるようになるわけだ。
一般にサービスを起動状態にする方法としては、以下の方法がある。
ここでは、sc.exeコマンドを使う方法を解説する(sc.exeについては、TIPS「scコマンドでWindows OSのサービスを確認/一覧/開始/停止する」参照のこと) 。sc.exeは、サービスの状態表示や設定変更などを行うためのコマンドだ。サブコマンドで動作を指定し、オプションで細かい指定を行う。
前述のFunction Discovery Resource Publication(FDResPub)」を起動し、システム起動時に「自動(遅延開始)」で動作させ、直ちにサービスを起動するには、以下のようにする。
sc config FDResPub -start=delayed-auto
sc start FDResPub
なお、sc.exeコマンドのヘルプを見るには、引数を付けずに「sc」のみ実行する。
sc.exeコマンドは最初の引数でUNCによるコンピュータ名を受け付け、リモートで設定が可能だが、Windows 10では、セキュリティのため、IPC$への接続が標準でオフになっている。このため、コマンドを実行する前に以下のコマンドを実行してIPC$へ接続しておく(Tech TIPS「Windowsでアカウントを指定してIPC$共有リソースへ接続する」)。コンピュータ名の前には必ず「\\」を付け、ドメインユーザーの場合はユーザー名を「<ユーザー名>@<ドメイン名>」とすること(相手がドメインじゃない場合はローカルアカウントもしくは「@<マシン名>」とする)。
net use \\コンピュータ名\IPC$ /USER:ユーザー名 *
必要なコマンドの実行が終わったら「/DELETE」でIPC$を閉じておく。
net use \\コンピュータ名\IPC$ /DELETE
以上の一連の手順をバッチファイルにしたのが、以下のリストだ。これを使えば、エクスプローラの[ネットワーク]に表示したい全てのPCをネットワーク経由で設定できる。
@echo off
IF NOT %1%/==/ GOTO SKIP1
ECHO Usage: %0% [\\コンピュータ名 リモートユーザー名]
ECHO 引数がないのでローカルマシンで実行します。
GOTO SKIP2
:SKIP1
set MACHINE=%1%
set USER=%2%
echo ** Net Use IPC$
net use %MACHINE%\ipc$ /USER:%USER% *
:SKIP2
echo ** Start Service. Please Wait.
sc.exe %MACHINE% start FDResPub
echo ** Change Config. Please Wait.
sc.exe %MACHINE% config FDResPub start=delayed-auto
IF %1%/==/ GOTO SKIP3
echo ** Net Use Delete IPC$
net use %MACHINE%\ipc$ /DELETE
:SKIP3
なお、WS-Dによるデバイスの発見は、「Function Discovery Provider Host(FDPHost)」サービスが行うが、こちらのサービスは必要なときに自動で起動されるため、「スタートアップの種類」は、「手動」のままで構わないが、常に起動した状態にしておいても問題は出ないだろう。
Copyright© Digital Advantage Corp. All Rights Reserved.