Windows Server Core で IIS の FTP サイトを運用していると、GUI から停止/開始できず困りがちです。本記事では appcmd.exe を使って FTP サイト(IIS 上の「サイト」)を Stop/Start する手順、確認コマンド、つまずきポイント、運用自動化のコツまでまとめます。
結論:FTP サイトは appcmd.exe の「site」停止/開始で操作できる
IIS の FTP サイトは、IIS 管理上は Web サイトと同じく 「サイト(site)」 として扱われます。そのため、Server Core のように GUI がない環境でも AppCmd(appcmd.exe)で site を Stop/Start すれば、FTP サイトの停止・開始ができます。元スレッドでは IIS フォーラムへの誘導のみで具体コマンドが提示されていませんが、実運用ではこの方法が最短です。
| やりたいこと | コマンド(例) | ポイント |
|---|---|---|
| サイト一覧(FTP サイト名を確認) | %SystemRoot%\System32\inetsrv\appcmd.exe list site | 表示される "site name" を控える |
| FTP サイトを停止 | %SystemRoot%\System32\inetsrv\appcmd.exe stop site /site.name:"Default FTP Site" | サイト名に空白があるなら引用符で囲む |
| FTP サイトを開始 | %SystemRoot%\System32\inetsrv\appcmd.exe start site /site.name:"Default FTP Site" | Stop/Start は管理者権限が必須 |
| FTP サービス自体を停止 | net stop ftpsvc | 全 FTP サイトが止まる(目的に合う場合のみ) |
なぜ「FTP サイト」なのに site stop/start なのか(IIS の考え方)
Windows Server の IIS では、HTTP の Web サイトも FTP のサイトも、どちらも IIS の「site」 として登録されます。プロトコルが違うだけで、構成情報は同じ applicationHost.config(IIS の設定ファイル)配下に保存され、状態(Started/Stopped)も “サイト” の状態として管理されます。
つまり「FTP サイトを止めたい」=「該当サイトを Stop したい」なので、AppCmd の stop site / start site がそのまま使えます。
appcmd.exe とは(Server Core での立ち位置)
appcmd.exe は IIS の構成・運用をコマンドラインで操作するためのツールです。Server Core は GUI 管理ツールが省かれているため、IIS の現場運用では appcmd.exe や PowerShell が主役になります。特に「今すぐ止めたい/今すぐ上げたい」というオペレーションでは、appcmd.exe のほうが手早いケースが多いです。
| 手段 | できること | 向いている場面 | 注意点 |
|---|---|---|---|
| appcmd.exe | サイトの Start/Stop、構成の表示・変更 | Server Core 上での即時オペレーション | PATH に入っていないことが多い |
| PowerShell(WebAdministration など) | Start-WebSite / Stop-WebSite など | 自動化・定期実行・状態監視 | モジュールの有無/権限に注意 |
| サービス操作(net / sc / Get-Service) | FTP サービス全体の起動停止 | 「FTP 機能を丸ごと止めたい」時 | 個別サイト単位では制御できない |
| リモート IIS Manager | GUI での管理(別 PC から) | 運用を GUI に寄せたい場合 | 事前設定が必要、緊急時は間に合わないことも |
手順:Server Core でも確実に FTP サイトを停止/開始する
appcmd.exe の場所を確認して実行する
AppCmd は通常、次のパスにあります。Server Core では PATH に入っていないことが多いので、まずはフルパスで実行するか、ディレクトリを移動してから実行するのが確実です。
%SystemRoot%\System32\inetsrv\appcmd.exe
毎回フルパスが面倒なら、次のようにディレクトリ移動してから実行すると入力が短くなります。
cd /d %SystemRoot%\System32\inetsrv
appcmd
FTP サイト名(site name)を確認する
停止/開始は 「サイト名」 を指定して行います。まずは一覧を出して対象の FTP サイト名を確認します。
%SystemRoot%\System32\inetsrv\appcmd.exe list site
表示例(環境により異なります):
SITE "Default Web Site" (id:1,bindings:http/*:80:,state:Started)
SITE "Default FTP Site" (id:2,bindings:ftp/*:21:,state:Started)
この例だと、FTP サイト名は Default FTP Site です。空白を含むサイト名は引用符で囲むのが基本です。
FTP サイトを停止する(Stop)
停止は stop site で実行できます。代表的な書き方は次の 2 パターンです。
%SystemRoot%\System32\inetsrv\appcmd.exe stop site /site.name:"Default FTP Site"
%SystemRoot%\System32\inetsrv\appcmd.exe stop site "Default FTP Site"
どちらでも動くことが多いですが、運用チームで手順書に落とすなら /site.name: まで明示したほうが「何を指定しているか」が読みやすく、事故が減ります。
FTP サイトを開始する(Start)
開始は start site です。停止と対になるだけなので、手順は同じです。
%SystemRoot%\System32\inetsrv\appcmd.exe start site /site.name:"Default FTP Site"
%SystemRoot%\System32\inetsrv\appcmd.exe start site "Default FTP Site"
停止/開始できたかを確認する(state を見る)
「実行したつもり」が一番危険です。オペレーション後は必ず状態を確認します。最も簡単なのは対象サイトだけを list して、出力の state: を確認する方法です。
%SystemRoot%\System32\inetsrv\appcmd.exe list site "Default FTP Site"
Stopped になっていれば停止成功、Started になっていれば開始成功です。大量のサイトがある場合は、まず対象サイト名で絞り込むと見やすくなります。
%SystemRoot%\System32\inetsrv\appcmd.exe list site | findstr /i /c:"Default FTP Site"
実務で効く:Stop/Start と「FTP サービス停止」は別物
現場でよくある混乱が「FTP サイトを止めたいのか、FTP サービス自体を止めたいのか」です。どちらが正解かは目的次第なので、違いを整理しておくと事故が減ります。
| 操作 | 止まる範囲 | コマンド例 | よくある目的 |
|---|---|---|---|
| サイト停止(推奨:個別停止) | 指定した FTP サイトのみ | appcmd stop site /site.name:"Default FTP Site" | メンテで特定サイトだけ止めたい |
| FTP サービス停止(全停止) | サーバー上の FTP 全体 | net stop ftpsvc | FTP 機能を一時的に全面停止したい |
| OS/VM 停止 | サーバー全部 | 再起動/シャットダウン | パッチ適用、ホスト作業 |
「FTP サイトだけ止めたい」のに net stop ftpsvc を使うと、関係ない FTP サイトまで止まります。逆に「FTP を全面停止したい」なら、サイトを 1 つずつ止めるより ftpsvc を止めたほうが確実です。
つまずきポイントと対処法(Server Core あるある)
appcmd.exe が見つからない/実行できない
- フルパスで実行:
%SystemRoot%\System32\inetsrv\appcmd.exe - IIS が入っているか確認:IIS の役割(Web Server)や FTP 機能が未導入だと、当然 appcmd も存在しません
- 実行環境を統一:遠隔実行やジョブから叩くなら、手順書に「どのシェルで」「どのユーザーで」を明記してブレを消します
「サイト名」が違って止まらない
サイト名は “表示名” なので、手順書の想定と実機の名前がズレていることがあります。まず list site で現物確認し、コピー&ペーストで指定するとミスが減ります。
%SystemRoot%\System32\inetsrv\appcmd.exe list site
また、同じような名前のサイトが並ぶ環境では、ID も控えておくと安全です(出力の id: 部分)。「該当サイトが 1 つしかない」状態にしてから stop/start するのが事故防止の基本です。
Access is denied(権限不足)
サイトの停止/開始は管理者権限が必要です。Server Core では GUI の「管理者として実行」がない分、うっかり非管理者でログオンして作業してしまうことがあります。
- ローカル管理者でログオンする
- PowerShell なら「管理者として起動」したセッションで実行する
- リモート実行なら、実行アカウントにローカル管理者権限があるか(UAC の影響も含め)確認する
start は成功したのに接続できない(運用トラブルの典型)
site が Started でも、クライアントから FTP 接続できないケースは珍しくありません。原因の切り分けは「サービス」「ポート」「ファイアウォール」「バインド」の順に見ると早いです。
| 確認ポイント | コマンド例 | 見たいこと |
|---|---|---|
| FTP サービスが起動しているか | sc query ftpsvc | STATE が RUNNING か |
| ポート 21 を誰かが使用していないか | netstat -ano | find ":21" | LISTENING の PID が想定通りか |
| サイトのバインド設定 | appcmd list site "Default FTP Site" | bindings:ftp/*:21: などが期待通りか |
| Windows Defender Firewall | netsh advfirewall firewall show rule name=all | findstr /i "FTP" | 許可ルールがあるか(環境次第) |
特に FTP は 制御ポート(21)だけでなくデータ接続 が絡むため、パッシブポート範囲や NAT の影響で「Started なのに繋がらない」になりやすいです。まずは同一セグメントからの接続、次に FW/NAT 経由、と段階を踏んで確認すると迷子になりません。
運用に組み込む:Stop/Start を安全に自動化する例
手で打つ作業は、夜間対応や引き継ぎで必ず崩れます。Server Core 環境ほど「同じ操作を同じ形で」実行できる仕組みが重要です。ここでは appcmd.exe を前提に、バッチと PowerShell の例を載せます。
バッチ例:引数で start/stop を切り替える
@echo off
setlocal
set "APPCMD=%SystemRoot%\System32\inetsrv\appcmd.exe"
set "SITE_NAME=Default FTP Site"
if /i "%~1"=="stop" (
"%APPCMD%" stop site /site.name:"%SITE_NAME%"
) else if /i "%~1"=="start" (
"%APPCMD%" start site /site.name:"%SITE_NAME%"
) else (
echo Usage: %~nx0 start ^| stop
exit /b 1
)
if errorlevel 1 (
echo Failed. errorlevel=%errorlevel%
exit /b %errorlevel%
)
"%APPCMD%" list site "%SITE_NAME%"
endlocal
ポイントは次の通りです。
- APPCMD のフルパスを固定:PATH 依存を排除
- サイト名を変数化:コピペミスを防止
- errorlevel を見て異常終了:監視やジョブに組み込みやすい
PowerShell 例:状態を見て必要な時だけ Start する
$AppCmd = Join-Path $env:SystemRoot "System32\inetsrv\appcmd.exe"
$SiteName = "Default FTP Site"
# 現在の状態を取得(出力文字列から state を読む簡易版)
$out = & $AppCmd list site $SiteName
if ($out -notmatch "state:Started") {
& $AppCmd start site $SiteName
if ($LASTEXITCODE -ne 0) { throw "Failed to start site. exit=$LASTEXITCODE" }
}
& $AppCmd list site $SiteName
「毎回 start する」より「止まっていたら start する」ほうが、運用上のノイズが減ります。監視復旧(セルフヒーリング)を組む場合にも使いやすい形です。
AppCmd のヘルプで “その場で” 正式書式を確認する
環境や IIS のバージョンによって、表示されるパラメータや説明が微妙に異なることがあります。手順書を作る前に、対象サーバーでヘルプを確認すると安心です。
%SystemRoot%\System32\inetsrv\appcmd.exe /?
%SystemRoot%\System32\inetsrv\appcmd.exe stop site /?
%SystemRoot%\System32\inetsrv\appcmd.exe start site /?
特に「サイト名をどう指定できるか」「どのプロパティが参照できるか」はヘルプに出ることが多いので、コマンドが通らない時は最初に確認しましょう。
現場向けのチェックリスト(停止/開始の前後で見る)
| タイミング | チェック項目 | 例 |
|---|---|---|
| 停止前 | 対象サイト名を再確認 | appcmd list site で対象を特定 |
| 停止前 | 影響範囲(接続先・利用者) | 運用連絡、メンテ告知、監視抑止 |
| 停止後 | state が Stopped になったか | appcmd list site "Default FTP Site" |
| 開始後 | state が Started になったか | 同上 |
| 開始後 | 接続テスト(内部→外部の順) | まず同一セグメント、次に FW/NAT 経由 |
参考資料(公式ドキュメント)
Server Core でも、IIS の考え方(FTP も site として管理される)を押さえれば、停止/開始はシンプルに運用できます。まずは list site で名前を確認し、stop site / start site を “必ず管理者権限で” 実行するところから始めてください。

コメント