どうもミツシマです。


今回はWindows10にて「ネットワーク探索」をコマンドにて有効化出来ないかを検証してみてました。


今回の検証環境は以下の通り
ActiveDirectory環境
DC:Windows Server2016
PC:Windows10 1809 (64bit)


検証結果としては何とか出来る方法はあるようです。
まず、「ネットワーク探索」を有効にするには3つのサービスを起動することと、該当するWindowsファイアウォールを有効化することが必要なようです。

<必要なサービス>
・Function Discovery Resource Publication
・SSDP Discovery
・UPnP Device Host


<必要なファイアウォール>
・ネットワーク探索 (SSDP 受信)             
・ネットワーク探索 (SSDP 送信)             
・ネットワーク探索 (UPnP 受信)             
・ネットワーク探索 (UPnP 送信)             
・ネットワーク探索 (UPnPHost 送信)         
・ネットワーク探索 (NB 名受信)             
・ネットワーク探索 (NB 名送信)             
・ネットワーク探索 (NB データグラム受信)   
・ネットワーク探索 (NB データグラム送信)   
・ネットワーク探索 (WSD 受信)              
・ネットワーク探索 (WSD 受信)              
・ネットワーク探索 (WSD 送信)              
・ネットワーク探索 (LLMNR UDP 受信)        
・ネットワーク探索 (LLMNR UDP 送信)        
・ネットワーク探索 (Pub WSD 受信)          
・ネットワーク探索 (Pub WSD 送信)          
・ネットワーク探索 (WSD EventsSecure 受信) 
・ネットワーク探索 (WSD EventsSecure 送信) 
・ネットワーク探索 (WSD イベント受信)      
・ネットワーク探索 (WSD イベント送信)  

(パブリックプロファイルのみ必要な追加ファイアウォール)
・Teredo のネットワーク探索 (UPnP 受信)
・Teredo のネットワーク探索 (UPnP 受信)


「セキュリティが強化されたWindowsファイアウォール」にてグループが「ネットワーク探索」となっているファイアウォールを有効にしてあげればいいみたいです。
設定値がわかったのでいつもどおりスクリプトを作成してみました。

EnableNetDiscoveryServices.ps1
#ネットワーク探索に必要な3つのサービスを取得
$NetDiscoveryServices = get-wmiobject win32_service | Where-Object { ($_.Name -eq "FDResPub") -or ($_.Name -eq "SSDPSRV") -or ($_.Name -eq "upnphost") }

#サービスのスタートアップ状態が「手動」もしくは「無効」の場合に「自動(遅延実行)に変更」
foreach($NetDiscoveryService in $NetDiscoveryServices){
    
    Write-Host 'サービス名:'$NetDiscoveryService.Name

If($NetDiscoveryService.Name -eq "FDResPub"){
 
        Write-Host 'サービスのスタートアップ状態:'$NetDiscoveryService.StartMode
    
        If($NetDiscoveryService.StartMode -ne "Auto"){
        
            Write-Host $NetDiscoveryService.Name'を「自動(遅延実行)」に変更し、サービスを開始します。'
            cmd /c "sc config FDResPub start= delayed-auto"
            cmd /c "net start FDResPub"
        }
}elseIf($NetDiscoveryService.Name -eq "SSDPSRV"){
     
        Write-Host 'サービスのスタートアップ状態:'$NetDiscoveryService.StartMode
    
        If($NetDiscoveryService.StartMode -ne "Auto"){
        
            Write-Host $NetDiscoveryService.Name'を「自動(遅延実行)」に変更し、サービスを開始します。。'
            cmd /c "sc config SSDPSRV start= delayed-auto"
            cmd /c "net start SSDPSRV"
        }
  }elseIf($NetDiscoveryService.Name -eq "upnphost"){
     
        Write-Host 'サービスのスタートアップ状態:'$NetDiscoveryService.StartMode
    
        If($NetDiscoveryService.StartMode -ne "Auto"){
        
            Write-Host $NetDiscoveryService.Name'を「自動(遅延実行)」に変更し、サービスを開始します。'
            cmd /c "sc config upnphost start= delayed-auto"
            cmd /c "net start upnphost"
        }
    }
}


Domain-EnableNetDiscoveryFireWall.ps1
#ファイアウォールポリシーで「ネットワーク探索」(ドメインプロファイル)のみを取得
$NetDiscoveryRule = Get-NetFirewallRule | Where-Object { ($_.DisplayGroup -eq "ネットワーク探索") -and ($_.Profile -like "*Domain*") }

#ルールを確認し、無効であれば有効化する
foreach($Rule in $NetDiscoveryRule){
$RuleStatus = $Rule.Enabled
If ($RuleStatus -eq "True"){
Write-Host $Rule.DisplayName'は有効です。'
        #Set-NetFirewallRule -InputObject $Rule -Enabled False
}else{
        Write-Host $Rule.DisplayName'は無効です。ファイアウォールを有効化します。'
        Set-NetFirewallRule -InputObject $Rule -Enabled True
    }
}


サービスの起動やスタートアップを変更するスクリプトは問題なかったのですが、ファイアウォールを有効化するスクリプトで若干躓きました。。。
今回は変更が必要なプロファイルのルールのみを有効化しようと思い、当初「($_.Profile -eq "Domain"」とやっていたのですが、上手くいきませんでした。。
原因はドメインプロファイルとパブリックプロファイルの2つにまたがったルールがいくつかあり、それが「-eq」だとマッチしないので「-like」に変更しました。
すべてのプロファイルで「ネットワーク探索」を有効化したければ、
「netsh advfirewall firewall set rule group="ネットワーク探索" new enable=Yes」
の方が処理が早いです。
※今回はセキュリティを意識して必要なプロファイルだけ有効化するようにしました。
 個人的にパブリックネットワークでネットワーク探索を有効にはしたくないので。


上の2つをスタートアップスクリプト等で呼び出してやれば、起動時にネットワーク探索が有効であるかを判断し、無効の場合には必要な処理をします。
ただし、ADのスタートアップスクリプトでどのくらい時間がかかるかを検証したところ、変更がある場合には4分前後、変更がない場合でも1分前後、処理に時間がかかっていました。。。
※自分の仮想環境がしょぼいせいもあるかもしれませんが、ログオン画面が表示されるまでかなり待つ印象でした。。。。orz
 実運用で使えるかはまた要検討かもしれません。。。


いつもどおり最後はファイルのリンクを貼っておきます。
EnableNetDiscoveryServices.ps1
Domain-EnableNetDiscoveryFireWall.ps1

スポンサードリンク