WindowsでFTPサーバを立てる勘所

# 概要
基本的な所は以下等でお願いします。
**WindowsでFTPサーバー構築 - Qiita**
https://qiita.com/A-Kira/items/b9a629647ab0bdf9e4b1

前提として、FTPサーバ有効化して、IISマネージャ用意したところからです。
その先で詰まったあたりをまとめます。

やる事としては、いくつかのフォルダを用意したWindowsにFTPサーバを立てて、それぞれのフォルダを違う権限で（＝違うユーザアカウントとして）アクセスしたい。を実現する方法です。

# 勘所
**PCに登録されているユーザのうち、IISマネージャーで登録されたユーザ
＝
FTPサーバにログインするユーザ**
となります。
ログインしたユーザは、**アクセスするフォルダへのアクセス権が必要**になり、これは**「FTP サーバで設定されたアクセス権」と「ローカル上のアクセス権」の両方**になります（ファイル共有へのアクセス権は不要です）。
具体的には、IISマネージャーの**FTP 認証**の設定と、**ファイル・フォルダのプロパティの「セキュリティ」タブ**の権限です。

# 具体的な操作
### ユーザの用意
・**コンピューターの管理->ローカル ユーザーとグループ->ユーザー**から、ユーザを追加する
・**空パスワード**はFTPログイン時に失敗するので**不可**（空パスワードでも作成は出来てしまう）
・**～パスワードの変更が必要**のチェックは**外しておく**
・ローカルパスとかその他設定不要。**PC上に存在するようになればいい**
・権限の種類分けをしたい数だけユーザを作る
例：aaaa, bbbb の２つのユーザを作成

### FTPサイトの追加
・**コンピューターの管理->サービスとアプリケーション->インターネット インフォメーション サービス (IIS) マネージャー->サイト**から、FTPサイトを追加する
・「Webサイトの追加」ではない
・２個作ると、FTPサーバが２つ起動するような動きになるため、２個以上作らないこと。
・**FTP サイト名**：任意
・**コンテンツ ディレクトリ->物理パス**：FTPでアクセスされたときのルートとなるフォルダを指定する。
　例：サイト名：`hoge`、物理パス：`C:\hoge\`
・**バインドとSSL**：SSL **無し**にチェック
・**認証**：**基本**のみにチェック
・**承認**：**指定されたユーザー**にして、先ほど作ったユーザ名を書く。
あとで**「FTP 認証」**から追加できるので、ここで書かなくてもいい。
・**アクセス許可**：**ローカルのアクセス権限とは別**なので、まずはここで必要なものをチェックする。

### ファイアウォールの設定
必要に応じて設定。

Windows標準の`ftp`コマンドは、`アクティブモード`(ポート固定のモード。クライアント側も20番ポートの開放が必要)しかないので注意。
WinSCP等から`パッシブモード`(クライアント側はファイアウォールの中にいてもOK)で接続を受ける場合、IISマネージャーから「FTP ファイアウォールのサポート」にて、データ送受信に払い出すポートを設定しておく。範囲は、同時接続数の分以上必要になるはず（切断やエラーでもしばらく生き残ったりを考えると、同時接続数の数倍ある方がいいかも）。また、ウェルノウンポートを避ける事。登録済みポート番号も避けた方が良い。（とりあえず、50000～50100くらい指定しておけば問題ないと思う、他で使ってなければ。）
なお、Windowsからパッシブモードの接続をコマンドラインやバッチファイルで使いたい場合、WinSCPのCUIモード（インストールすると同時に生成される`WinSCP.com`）に`/PASSIVE`を指定して使う手がある。詳細はWinSCPのマニュアルを参照。
ウェルノウンポートや登録済みポートは以下等を参照

**TCPやUDPにおけるポート番号の一覧 - Wikipedia**
https://ja.wikipedia.org/wiki/TCP%E3%82%84UDP%E3%81%AB%E3%81%8A%E3%81%91%E3%82%8B%E3%83%9D%E3%83%BC%E3%83%88%E7%95%AA%E5%8F%B7%E3%81%AE%E4%B8%80%E8%A6%A7

### FTP ユーザの分離
ここが肝。
「ユーザーを分離しない。」にチェックが２つ、「**ユーザーを分離する**」の方にチェックが４つ（うち１つの「カスタム」はグレーアウト）
ユーザーを分離しない場合、先ほど設定したFTPサイトのサブフォルダー含め全てアクセス可能になってしまうので、今回は分離する。
ただし、分離すると途端にアクセス出来なくなることがあるので以下熟読のこと。
ここで選択するのは、**ユーザーを分離する**の方にある「`ユーザー名ディレクトリ（グローバルな仮想ディレクトリを無効にします。`」
このチェックを入れることで、FTPでログインして来たユーザのアクセスする物理パスは「`[FTPサイトの物理パス]\LocalUser\[ユーザー名]`」となる。
例：「`C:\hoge\LocalUser\aaaa\`」「`C:\hoge\LocalUser\bbbb\`」になるので、物理パス以下を用意する。

### アクセス権限の設定
今回の場合、IISマネージャーから設定する**FTP 認証**と、上記フォルダの**ローカルのアクセス権限**が必要。

IISマネージャーで**FTP 認証**に、**ユーザが登録されていて、アクセス権限が付与されている**か確認。
例：`aaaa` が登録されており、`読み取り` 権限が付いていることを確認。`bbbb` が登録されており、`読み取り`、`書き込み` 権限が付いていることを確認。

ローカルの方は、**ユーザがアクセスするフォルダのプロパティの「セキュリティ」タブ**で、ユーザーを追加し、**アクセス権限が付与されていること**を確認。
この時、「共有」タブの設定は不要。FTPアクセスするユーザが所有者である必要もない。
例：「`C:\hoge\LocalUser\aaaa\`」フォルダを作成し、その**プロパティ->「セキュリティ」タブ**を開き「**編集**」->開いたダイアログで「**追加**」->選択するオブジェクト名に、ユーザ名を打ち「名前の確認」を押して、「`[PC名]\aaaa`」となったらOK。詳細設定から検索して、選択してもよい。戻ったダイアログの下で、「`フォルダーの内容の一覧表示`」「`読み取り`」のチェックを入れる。同様に、「`C:\hoge\LocalUser\bbbb\`」フォルダを作成しプロパティから、`[PC名]\bbbb`を追加し、「`フォルダーの内容の一覧表示`」「`読み取り`」「`書き込み`」にチェック入れる。

# 動作確認
コマンドプロンプト等なら
`ftp [IPアドレス]` （ポート変えているなら`ftp [IPアドレス]:[ポート番号]`）
`[ユーザ名]`
`[パスワード]`(表示されない)
でログインできたら成功

530 Login failed.的な感じであっさり終わってるなら、ログインに失敗。
530 エラーにつづけて、フォルダにアクセスできません的なエラーなら、ログインはできたが、フォルダへのアクセス権限がなかったか、フォルダが存在しない。

# まとめ
「ユーザーを分離する」にしたとき、ログイン先が**　[FTPサイトの物理パス]\\LocalUser\\[ユーザ名]\\　**に変わるのに気づかずハマりました。