Windows 10でSMB1.0を有効化する方法（PowerShellで有効化/無効化する）

# Windows 10でSMB1.0を有効化する方法（PowerShellで有効化/無効化する）

## GUIで有効化,無効化する方法
【コントロールパネル】⇒【すべてのコントロールパネル項目】⇒【プログラムと起動】⇒【Windowsの機能の有効化または無効化】
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/403714/8235edd8-31b9-0ac3-8fb8-3719056dea05.png)
上図の「SMB 1.0/CIFS File Sharing Support」と「SMB 1.0/CFIS Client」にチェックを入れ、導入する。

## CLIで有効化,無効化する方法
PowerShellコマンドで以下のとおり。なお、管理者権限が必要なので、下図の「Windows PowerShell（管理者）」を実行すること。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/403714/4221cd8d-6ffa-8f63-2bac-044f7959041c.png)

### SMB 1.0/CIFS File Sharing Supportの有効化

```powershell
Enable-WindowsOptionalFeature -Online -FeatureName SMB1Protocol -NoRestart
```

### SMB 1.0/CIFS Clientの有効化

```powershell
Enable-WindowsOptionalFeature -Online -FeatureName SMB1Protocol-Client -NoRestart
```

### SMB 1.0/CIFS File Sharing SupportとSMB 1.0/CIFS Clientの無効化

```powershell
Disable-WindowsOptionalFeature -Online -FeatureName SMB1Protocol -NoRestart
Disable-WindowsOptionalFeature -Online -FeatureName SMB1Protocol-Client -NoRestart
```

`-NoRestart`を付与すると再起動をする旨のYes/Noが問われない。ActiveDirectoryグループポリシーのスタートアップスクリプトやシャットダウンスクリプトでは必須オプションと思う。
Yes/Noで停止してしまうとスクリプト同期の場合、ログイン後デスクトップが表示されないことやシャットダウンがいつまで経っても終わらないという悲劇に見舞われる。

### 有効なのか、無効なのかの確認方法

```powershell
Get-WindowsOptionalFeature -Online -FeatureName SMB1Protocol
Get-WindowsOptionalFeature -Online -FeatureName SMB1Protocol-Client
```

## おまけ１
ちょっと管理するクライアントで有効化したい場合に利用したスクリプトです。
古典的なフラグファイルを利用した方法なので、少し情けないけど、参考までに。

```powershell
#----------------------------------------------------------------#
# SMB Protocol Enable Script
#----------------------------------------------------------------#

# ExecutionPolicyを変更する際のError/Warningメッセージの抑止の為、記載するもの
$ErrorActionPreference = "silentlycontinue"

# デバッグ用
Get-ExecutionPolicy

# -Scope指定をした方がいい気がする
#  Scope = Process,CurrentUser,LocalMachine
#  Policy = Restricted,AllSigned,RemoteSigned,Unrestricted,Bypass,Undefined
Set-ExecutionPolicy -Scope Process Bypass

# 古典的なフラグファイル用、ActiveDirectoryのスタートアップスクリプトなので一度だけ実行する時、大概使われている奴
# StartとEndは処理終了具合を見てるだけのもの
[String]$_FLAG_FILE_PATH_="C:\SMBflag_20200130v1.flg";
[String]$_START_FILE_PATH_="C:\SMBflag_20200130v1.start";
[String]$_END_FILE_PATH_="C:\SMBflag_20200130v1.end";

# 処理開始
New-Item $_START_FILE_PATH_ -ItemType File -Force

# スクリプト実行前の状態を見るもの、AD展開時点では不要な処理
Get-WindowsOptionalFeature -Online -FeatureName SMB1Protocol
Get-WindowsOptionalFeature -Online -FeatureName SMB1Protocol-Client
[String]$_RET1_ = (Get-WindowsOptionalFeature -Online -FeatureName SMB1Protocol).State
Write-Host($_RET1_);
[String]$_RET2_ = (Get-WindowsOptionalFeature -Online -FeatureName SMB1Protocol-Client).State
Write-Host($_RET2_);

# フラグファイルがあれば、実行しないの
if (Test-Path $_FLAG_FILE_PATH_) {

    Write-Host("フラグファイルがあるので、処理しません。");

} else {

    #　フラグファイルを作る
    New-Item $_FLAG_FILE_PATH_ -ItemType File -Force

    # SMB1Protocolの処理
    if ((Get-WindowsOptionalFeature -Online -FeatureName SMB1Protocol).State -eq "Enabled") {
        Write-Host("既にSMB1Protocolは有効化済み。処理無し。");
    } else {
        Write-Host("SMB1Protocolは無効化になっている為、有効化する。");
        Enable-WindowsOptionalFeature -Online -FeatureName SMB1Protocol -NoRestart
    }

    # SMB1Protocol-Clientの処理
    if ((Get-WindowsOptionalFeature -Online -FeatureName SMB1Protocol-Client).State -eq "Enabled") {
        Write-Host("既にSMB1Protocol-Clientは有効化済み。処理無し。");
    } else {
        Write-Host("SMB1Protocol-Clientは無効化になっている為、有効化する。");
        Enable-WindowsOptionalFeature -Online -FeatureName SMB1Protocol-Client -NoRestart
    }

}

# 古い処理、覚書用
#if (Test-Path $_FLAG_FILE_PATH_) {
#   Write-Host("Flag File Found.");
#   exit 0;
#} else {
#    Write-Host("Flag File Not Found.");
#    Enable-WindowsOptionalFeature -Online -FeatureName SMB1Protocol -NoRestart
#    Enable-WindowsOptionalFeature -Online -FeatureName SMB1Protocol-Client -NoRestart
#    New-Item $_FLAG_FILE_PATH_ -ItemType File -Force
#}

# 処理終了
New-Item $_END_FILE_PATH_ -ItemType File -Force

exit 0;
```

## おまけ２
ActiveDirectoryのグループポリシーで、スタートアップスクリプト等で上記のPowerShellを実行したい場合は、一度WindowsBATから呼び出すとよい。
理由は、PowerShellの実行Policyの制限で、大半が権限無しやリモートコード扱いを受けてて、実行出来ないから。
なので、以下のWindowsBATをグループポリシーに登録して呼び出すとよい。

```bat
@echo off
@color 0a
@title Windows 10 SMB1.0 Enable Scripts
echo %~dp0
cd %~dp0
powershell -ExecutionPolicy Bypass -File  [.\Windows10_SMB1.0-Enable.ps1]※ここはPathを変えてね
exit 0
```

`-NoProfile`オプションを付けると実行しないので注意。
理由は確認中。