# 機能設計書 371-Remove-DbaFirewallRule

## 概要

本ドキュメントは、dbatools PowerShellモジュールのRemove-DbaFirewallRuleコマンドの機能設計を定義する。このコマンドはSQL Serverインスタンス関連のWindowsファイアウォールルールをリモートコンピュータから削除する機能を提供する。

### 本機能の処理概要

**業務上の目的・背景**：SQL Serverのセキュリティ管理において、不要になったネットワークアクセスルールの適切なクリーンアップは重要である。インスタンスの廃止、セキュリティポリシーの変更、または接続性問題のトラブルシューティング時に、以前作成されたファイアウォールルールを確実に削除する必要がある。手動でのファイアウォール管理は時間がかかり、エラーが発生しやすいため、自動化されたクリーンアップ機能が求められる。

**機能の利用シーン**：
- SQL Serverインスタンスの廃止時におけるネットワークアクセスルールのクリーンアップ
- セキュリティポリシー変更に伴うファイアウォールルールの整理
- New-DbaFirewallRuleで作成したルールの削除
- 複数サーバーにまたがる一括ファイアウォール管理

**主要な処理内容**：
1. 対象SQL Serverインスタンスに対応するファイアウォールルールの取得（Get-DbaFirewallRuleの呼び出し）
2. PowerShellリモート処理を使用したターゲットコンピュータへの接続
3. Remove-NetFirewallRuleコマンドレットの実行によるルール削除
4. 削除結果の詳細なステータスレポート出力

**関連システム・外部連携**：
- Windows Remote Management (WinRM)を介したリモートコンピュータへの接続
- Windowsファイアウォールサービスとの連携（Remove-NetFirewallRule）
- Get-DbaFirewallRuleコマンドとの連携によるルール取得

**権限による制御**：ターゲットコンピュータ上でファイアウォールルールを削除するための管理者権限が必要。Credentialパラメータを使用して代替資格情報を指定可能。

## 関連画面

| 画面No | 画面名 | 関連種別 | 関連する操作・処理 |
|--------|--------|----------|------------------|
| - | コマンドライン/PowerShell | 主画面 | コマンド実行とパラメータ指定 |

## 機能種別

データ連携 / CRUD操作（削除）

## 入力仕様

### 入力パラメータ

| パラメータ名 | 型 | 必須 | 説明 | バリデーション |
|-------------|-----|-----|------|---------------|
| SqlInstance | DbaInstanceParameter[] | Yes (NonPipeline) | 対象SQL Serverインスタンス | - |
| Credential | PSCredential | No | リモート接続用の代替資格情報 | - |
| Type | string[] | No | 削除するファイアウォールルールの種類（Engine, Browser, DAC, DatabaseMirroring, AllInstance） | ValidateSetによる検証、デフォルトは@('Engine', 'DAC') |
| InputObject | object[] | Yes (Pipeline) | Get-DbaFirewallRuleからのパイプライン入力 | - |
| EnableException | switch | No | 例外処理の有効化 | - |
| WhatIf | switch | No | 実行せずに動作確認 | - |
| Confirm | switch | No | 確認プロンプトの表示（ConfirmImpact=High） | - |

### 入力データソース

- SqlInstanceパラメータ: ユーザー指定または他のdbatools関数からのパイプライン入力
- InputObject: Get-DbaFirewallRuleからのパイプライン入力

## 出力仕様

### 出力データ

| 項目名 | 型 | 説明 |
|--------|-----|------|
| ComputerName | string | ファイアウォールルールが削除されたコンピュータ名 |
| InstanceName | string | SQL Serverインスタンス名 |
| SqlInstance | string | 完全なSQL Serverインスタンス識別子 |
| DisplayName | string | 削除されたファイアウォールルールの表示名 |
| Type | string | 削除されたルールの種類（Engine, Browser, DAC, DatabaseMirroring, AllInstance） |
| IsRemoved | bool | ルール削除の成功/失敗を示すブール値 |
| Status | string | 削除操作の詳細なステータスメッセージ |

### 出力先

PowerShellパイプライン（PSCustomObject）

## 処理フロー

### 処理シーケンス

```
1. Begin ブロック: リモート実行用スクリプトブロックの定義
   └─ Remove-NetFirewallRuleを実行するスクリプトブロックを作成
   └─ 成功/警告/エラーの状態を管理する構造を定義

2. Process ブロック: メインの処理ループ
   └─ SqlInstance指定の場合
      └─ Get-DbaFirewallRuleを呼び出してルール情報を取得
      └─ 失敗時はStop-Functionで処理継続
   └─ 各ルールに対する削除処理
      └─ ShouldProcessによる確認
      └─ Invoke-Command2でリモート実行
      └─ 結果オブジェクトの生成と出力
```

### フローチャート

```mermaid
flowchart TD
    A[開始] --> B{SqlInstance指定?}
    B -->|Yes| C[Get-DbaFirewallRuleでルール取得]
    B -->|No| D[InputObjectを使用]
    C --> E{取得成功?}
    E -->|No| F[Stop-Function]
    E -->|Yes| D
    D --> G[各ルールをループ処理]
    G --> H{ShouldProcess確認}
    H -->|No| G
    H -->|Yes| I[Invoke-Command2でRemove-NetFirewallRule実行]
    I --> J{実行成功?}
    J -->|Yes| K[ステータス: 成功]
    J -->|No| L[ステータス: 失敗 + エラー詳細]
    K --> M[結果オブジェクト出力]
    L --> M
    M --> N{次のルールあり?}
    N -->|Yes| G
    N -->|No| O[終了]
    F --> N
```

## ビジネスルール

### 業務ルール

| ルールNo | ルール名 | 内容 | 適用条件 |
|---------|---------|------|---------|
| BR-001 | dbatools作成ルール限定 | dbatoolsのNew-DbaFirewallRuleで作成されたルールのみ削除可能 | 常に適用 |
| BR-002 | デフォルト削除タイプ | Type未指定時はEngine, DACのみ削除（Browserは共有可能性があるため除外） | Type未指定時 |
| BR-003 | 確認プロンプト | High ConfirmImpactにより、デフォルトで確認を要求 | Confirm:$false未指定時 |

### 計算ロジック

特になし

## データベース操作仕様

### 操作別データベース影響一覧

本コマンドはSQL Serverデータベースへの直接アクセスは行わない。Windowsファイアウォールサービスに対する操作のみ。

## エラー処理

### エラーケース一覧

| エラーコード | エラー種別 | 発生条件 | 対処方法 |
|------------|----------|---------|---------|
| - | ConnectionError | Get-DbaFirewallRuleでルール取得に失敗 | Stop-Functionで継続、対象インスタンスをスキップ |
| - | RemoteExecutionError | Invoke-Command2の実行失敗 | Stop-Functionで継続、エラーメッセージを出力 |
| - | FirewallRuleError | Remove-NetFirewallRuleの警告/エラー | ステータスに詳細を含めて出力 |

### リトライ仕様

リトライ機構は実装されていない。失敗時は次のルールの処理に継続。

## トランザクション仕様

トランザクション管理は行わない（各ルール削除は独立した操作）。

## パフォーマンス要件

- リモート接続タイムアウト: Invoke-Command2のデフォルト設定に依存
- 複数ルール処理: 順次処理（並列処理なし）

## セキュリティ考慮事項

- ターゲットコンピュータへの管理者権限が必要
- Credentialパラメータによる代替資格情報のサポート
- ShouldProcess/Confirmによる誤操作防止
- PowerShell Remotingによる安全な通信チャネル

## 備考

- 本コマンドの機能は将来変更される可能性があるため、dbatoolsアップデート後にスクリプトの確認が推奨される
- Get-DbaFirewallRuleで取得したルールのみがサポート対象

---

## コードリーディングガイド

本機能を理解するために参照すべきファイルと、推奨する読み解き順序を以下に示す。

### 推奨読解順序

#### Step 1: 出力データ構造を理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | Remove-DbaFirewallRule.ps1 | `public/Remove-DbaFirewallRule.ps1` | **178-186行目**: 出力PSCustomObjectの構造定義 |

**読解のコツ**: 出力オブジェクトはSelect-DefaultViewで表示プロパティが制御される。

#### Step 2: エントリーポイントを理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | Remove-DbaFirewallRule.ps1 | `public/Remove-DbaFirewallRule.ps1` | **87-100行目**: パラメータ定義とParameterSet |

**主要処理フロー**:
1. **87行目**: CmdletBinding属性でShouldProcess、ConfirmImpact=Highを設定
2. **89-90行目**: SqlInstanceパラメータ（NonPipelineセット、必須）
3. **96-97行目**: InputObjectパラメータ（Pipelineセット、必須）

#### Step 3: Beginブロック - スクリプトブロック定義

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | Remove-DbaFirewallRule.ps1 | `public/Remove-DbaFirewallRule.ps1` | **102-138行目**: リモート実行用スクリプトブロック |

**主要処理フロー**:
- **103-137行目**: $cmdScriptBlockの定義
- **106行目**: 引数からファイアウォールルール名を取得
- **110行目**: Remove-NetFirewallRuleの実行
- **111-128行目**: 警告、エラー、例外の処理とオブジェクト返却

#### Step 4: Processブロック - メイン処理

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 4-1 | Remove-DbaFirewallRule.ps1 | `public/Remove-DbaFirewallRule.ps1` | **140-189行目**: メイン処理ロジック |

**主要処理フロー**:
- **141-148行目**: SqlInstance指定時のGet-DbaFirewallRule呼び出し
- **150-188行目**: 各ルールに対する削除処理ループ
- **151行目**: ShouldProcessによる確認
- **154行目**: Invoke-Command2でリモート実行
- **159-175行目**: 結果ステータスの構築

### プログラム呼び出し階層図

```
Remove-DbaFirewallRule
    │
    ├─ Get-DbaFirewallRule (SqlInstance指定時)
    │      └─ ファイアウォールルール情報の取得
    │
    ├─ Invoke-Command2
    │      └─ リモートコンピュータでの実行
    │             └─ Remove-NetFirewallRule
    │
    └─ Select-DefaultView
           └─ 出力プロパティの制御
```

### データフロー図

```
[入力]                     [処理]                          [出力]

SqlInstance/InputObject ──▶ Get-DbaFirewallRule ──▶ ルール情報取得
                                    │
                                    ▼
                           Invoke-Command2 ──▶ リモート削除実行
                                    │
                                    ▼
                           ステータス構築 ──▶ PSCustomObject出力
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| Remove-DbaFirewallRule.ps1 | `public/Remove-DbaFirewallRule.ps1` | ソース | メイン機能実装 |
| Get-DbaFirewallRule.ps1 | `public/Get-DbaFirewallRule.ps1` | ソース | ルール情報取得の依存関数 |
| Remove-DbaFirewallRule.Tests.ps1 | `tests/Remove-DbaFirewallRule.Tests.ps1` | テスト | ユニットテスト |
