# 機能設計書 615-Remove-DbaNetworkCertificate

## 概要

本ドキュメントは、SQL Serverのネットワーク暗号化設定からSSL証明書構成を削除するdbatools PowerShell関数 `Remove-DbaNetworkCertificate` の機能設計書である。

### 本機能の処理概要

**業務上の目的・背景**：SQL Serverは、クライアント接続のセキュリティを確保するためにSSL/TLS証明書を使用してネットワーク通信を暗号化できる。証明書の廃止、SSL接続問題のトラブルシューティング、または暗号化設定の再構成時に、現在の証明書構成を削除する必要がある。本機能は、SuperSocketNetLibレジストリキーから証明書のサムプリントをクリアし、インスタンスを非暗号化または任意暗号化モードに戻す。

**機能の利用シーン**：
- 期限切れ証明書の削除
- SSL接続問題のトラブルシューティング
- 証明書のローテーション作業
- 暗号化設定の再構成

**主要な処理内容**：
1. ターゲットコンピュータのネットワーク名を解決
2. WMIを使用してSQL Serverサービス情報を取得
3. レジストリからSuperSocketNetLib設定を特定
4. 証明書のサムプリントをクリア
5. 削除結果をPSCustomObjectとして出力

**関連システム・外部連携**：
- WMI（Windows Management Instrumentation）を使用してSQL Serverサービス情報を取得
- PowerShellリモーティングを使用してリモートコンピュータのレジストリを操作
- Windowsレジストリ（HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server）

**権限による制御**：ターゲットコンピュータのレジストリおよびWMIサービスへの管理者権限が必要。

## 関連画面

| 画面No | 画面名 | 関連種別 | 関連する操作・処理 |
|--------|--------|----------|------------------|
| 131 | ネットワーク証明書 | 主機能 | ネットワーク証明書の削除 |

## 機能種別

システム設定変更 - レジストリ操作

## 入力仕様

### 入力パラメータ

| パラメータ名 | 型 | 必須 | 説明 | バリデーション |
|-------------|-----|-----|------|---------------|
| SqlInstance | DbaInstanceParameter[] | No | 対象のSQL Serverインスタンス（デフォルト: localhost） | 有効なインスタンス名 |
| Credential | PSCredential | No | リモートコンピュータへのアクセス用資格情報 | 有効な資格情報オブジェクト |
| EnableException | switch | No | 例外処理の有効化 | - |
| WhatIf | switch | No | 実行せずに処理内容を表示 | - |
| Confirm | switch | No | 実行前に確認プロンプトを表示 | - |

### 入力データソース

- SqlInstanceパラメータ: コマンドライン引数（デフォルトは$env:COMPUTERNAME）
- Credential: Get-Credentialコマンドレットまたは事前定義の資格情報

## 出力仕様

### 出力データ

| 項目名 | 型 | 説明 |
|--------|-----|------|
| ComputerName | string | 証明書が削除されたコンピュータ名 |
| InstanceName | string | SQL Serverインスタンス名 |
| SqlInstance | string | 完全なSQL Serverインスタンス名（VSNAME） |
| ServiceAccount | string | SQL Serverサービスアカウント |
| RemovedThumbprint | string | 削除された証明書のサムプリント（または設定されていない場合はnull） |

### 出力先

PowerShellパイプライン - 呼び出し元のスクリプトまたはコンソールに出力

## 処理フロー

### 処理シーケンス

```
1. 管理者権限の確認
   └─ Test-ElevationRequirement
2. ネットワーク名の解決
   └─ Resolve-DbaNetworkNameでFQDNを取得
3. SQL Serverサービス情報の取得
   └─ Invoke-ManagedComputerCommandでWMI経由
4. レジストリパスの特定
   └─ REGROOT、VSNAME、ServiceAccountの取得
5. リモートレジストリ操作
   └─ Invoke-Command2でPowerShellリモーティング
6. 証明書サムプリントのクリア
   └─ Set-ItemProperty -Name Certificate -Value $null
7. 結果オブジェクトの出力
   └─ PSCustomObjectとして結果を出力
```

### フローチャート

```mermaid
flowchart TD
    A[開始] --> B[管理者権限確認]
    B --> C[ネットワーク名解決]
    C --> D{解決成功?}
    D -->|No| E[エラー: 解決失敗]
    D -->|Yes| F[WMI経由でサービス情報取得]
    E --> Z[終了]
    F --> G{取得成功?}
    G -->|No| H[エラー: アクセス失敗]
    G -->|Yes| I[REGROOTとVSNAME取得]
    H --> Z
    I --> J{値が有効?}
    J -->|No| K[エラー: インスタンス不明]
    J -->|Yes| L{ShouldProcess?}
    K --> Z
    L -->|No| M[次のインスタンスへ]
    L -->|Yes| N[リモートレジストリ操作]
    N --> O{成功?}
    O -->|Yes| P[結果オブジェクト出力]
    O -->|No| Q[Stop-Function呼び出し]
    P --> M
    Q --> M
    M --> R{インスタンス残り?}
    R -->|Yes| B
    R -->|No| Z
```

## ビジネスルール

### 業務ルール

| ルールNo | ルール名 | 内容 | 適用条件 |
|---------|---------|------|---------|
| BR-001 | デフォルトインスタンス | SqlInstanceが未指定の場合、localhostが使用される | SqlInstance未指定時 |
| BR-002 | 管理者権限 | 管理者権限でないと処理がスキップされる | 常時 |
| BR-003 | サービス再起動不要 | 設定変更後、SQL Serverサービスの再起動が必要 | 設定変更後 |

### 計算ロジック

特になし

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

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

本機能はデータベースに直接影響を与えない。レジストリ設定の変更のみを行う。

| 操作 | 対象 | 操作種別 | 概要 |
|-----|------|---------|------|
| 証明書設定削除 | Windowsレジストリ | UPDATE | SuperSocketNetLib\Certificateの値をクリア |

## エラー処理

### エラーケース一覧

| エラーコード | エラー種別 | 発生条件 | 対処方法 |
|------------|----------|---------|---------|
| - | 名前解決失敗 | コンピュータ名を解決できない | Stop-Functionでエラー出力、処理継続 |
| - | アクセス失敗 | WMIまたはレジストリにアクセスできない | Stop-Functionでエラー出力、処理継続 |
| - | インスタンス不明 | 指定されたインスタンスが見つからない | Stop-Functionでエラー出力、処理継続 |
| - | リモーティング失敗 | PowerShellリモーティングに失敗 | Stop-Functionでエラー出力、処理継続 |

### リトライ仕様

リトライ機能なし - エラー発生時は次のインスタンスの処理を継続

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

レジストリ操作にトランザクション機能はない。変更は即座に適用される。

## パフォーマンス要件

特に定義されていない。レジストリ操作は通常高速に完了する。

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

- ターゲットコンピュータへの管理者権限が必要
- PowerShellリモーティングが有効である必要がある
- Credentialパラメータで異なるドメインのサーバーにアクセス可能
- 証明書削除後はSSL暗号化が無効になる可能性がある

## 備考

- 証明書設定の変更はSQL Serverサービスの再起動後に有効になる
- クラスター環境では、InstanceClusterNameの指定が必要な場合がある
- WhatIfパラメータで事前に影響を確認可能

---

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

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

### 推奨読解順序

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

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | レジストリ構造 | `HKLM:\SOFTWARE\Microsoft\Microsoft SQL Server\[REGROOT]\MSSQLServer\SuperSocketNetLib` | SQL Serverネットワーク設定のレジストリ構造を理解する |

**読解のコツ**: REGROOTはSQL Serverインスタンス固有のレジストリパスで、WMIのAdvancedPropertiesから取得される。

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

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | Remove-DbaNetworkCertificate.ps1 | `public/Remove-DbaNetworkCertificate.ps1` | メイン関数の入口とパラメータ定義を確認 |

**主要処理フロー**:
1. **66-72行目**: パラメータブロック定義 - CmdletBinding属性でShouldProcess、ConfirmImpact=Lowを設定
2. **77-80行目**: 各インスタンスに対するループ開始、管理者権限確認
3. **82-88行目**: Resolve-DbaNetworkNameでネットワーク名を解決
4. **94-98行目**: Invoke-ManagedComputerCommandでWMI経由でサービス情報取得
5. **100-115行目**: REGROOTとVSNAMEの取得、検証
6. **124-141行目**: リモートスクリプトブロック定義 - レジストリ操作と結果出力
7. **143-149行目**: Invoke-Command2でリモート実行

#### Step 3: 依存関数を理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | Resolve-DbaNetworkName | `private/functions/Resolve-DbaNetworkName.ps1` | ネットワーク名解決の仕組みを理解 |
| 3-2 | Invoke-ManagedComputerCommand | `private/functions/Invoke-ManagedComputerCommand.ps1` | WMI操作の仕組みを理解 |
| 3-3 | Invoke-Command2 | `private/functions/Invoke-Command2.ps1` | PowerShellリモーティングの仕組みを理解 |

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

```
Remove-DbaNetworkCertificate
    │
    ├─ Test-ElevationRequirement
    │      └─ 管理者権限確認
    │
    ├─ Resolve-DbaNetworkName
    │      └─ FQDN解決
    │
    ├─ Invoke-ManagedComputerCommand
    │      └─ WMI.Services取得
    │
    ├─ ShouldProcess (確認処理)
    │
    └─ Invoke-Command2
           └─ リモートレジストリ操作
                  ├─ Get-ItemProperty (現在のサムプリント取得)
                  └─ Set-ItemProperty (サムプリントをクリア)
```

### データフロー図

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

SqlInstance     ───┬──▶ Resolve-DbaNetworkName ───▶ FQDN
Credential      ───┘                                    │
                                                        ▼
                                          Invoke-ManagedComputerCommand
                                                        │
                                                        ▼
                                              WMI AdvancedProperties
                                              ├─ REGROOT
                                              ├─ VSNAME
                                              └─ ServiceAccount
                                                        │
                                                        ▼
                                               Invoke-Command2
                                          (リモートレジストリ操作)
                                                        │
                                                        ▼
                                               [PSCustomObject] ───▶ パイプライン出力
                                               ComputerName
                                               InstanceName
                                               SqlInstance
                                               ServiceAccount
                                               RemovedThumbprint
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| Remove-DbaNetworkCertificate.ps1 | `public/Remove-DbaNetworkCertificate.ps1` | ソース | メイン関数 |
| Set-DbaNetworkCertificate.ps1 | `public/Set-DbaNetworkCertificate.ps1` | ソース | ネットワーク証明書設定関数 |
| Get-DbaNetworkCertificate.ps1 | `public/Get-DbaNetworkCertificate.ps1` | ソース | ネットワーク証明書取得関数 |
| Remove-DbaNetworkCertificate.Tests.ps1 | `tests/Remove-DbaNetworkCertificate.Tests.ps1` | テスト | 単体テスト |
