# 画面設計書 182-インストール済みパッチ

## 概要

本ドキュメントは、dbatools PowerShellモジュールにおけるSQL Serverインストール済みパッチ情報取得機能の設計を定義する。

### 本画面の処理概要

Windowsレジストリを照会して、対象コンピュータにインストールされたSQL Serverパッチの完全な履歴を取得する。累積更新プログラム（CU）、サービスパック、およびホットフィックスの情報を含む。

**業務上の目的・背景**：パッチコンプライアンス監査、アップグレード前計画、および環境トラブルシューティングにおいて、どのパッチがいつインストールされたかを確認する必要がある。この機能により、各サーバーを手動で確認することなく、SQL Server環境全体のパッチレベルを迅速に評価できる。

**画面へのアクセス方法**：PowerShellコンソールから以下のコマンドを実行する：
```powershell
Get-DbaInstalledPatch -ComputerName <対象コンピュータ>
```

**主要な操作・処理内容**：
1. 対象コンピュータへのリモート接続を確立
2. Windowsレジストリ（HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall）を照会
3. SQL Server関連のホットフィックス、サービスパック、GDR更新をフィルタリング
4. インストール日順にソートされた結果を返却

**画面遷移**：単独のCLIコマンドとして動作。パイプライン入力（テキストファイルからのコンピュータ名リスト等）をサポート。

**権限による表示制御**：対象コンピュータへのリモートアクセスにはCredentialパラメータで代替認証を使用可能。ローカル管理者権限が必要。

## 関連機能

| 機能No | 機能名 | 関連種別 | 関連する操作・処理 |
|--------|--------|----------|------------------|
| 381 | Get-DbaInstalledPatch | 主機能 | インストール済みパッチの取得 |

## 画面種別

コマンドラインインターフェース（CLI）

## URL/ルーティング

PowerShellコマンド:
- `Get-DbaInstalledPatch`

## 入出力項目

### Get-DbaInstalledPatch パラメータ

| パラメータ名 | 型 | 必須 | 説明 |
|-------------|-----|------|------|
| ComputerName | DbaInstanceParameter[] | No | 対象コンピュータ名（デフォルト: $env:COMPUTERNAME） |
| Credential | PSCredential | No | リモート接続用資格情報 |
| EnableException | switch | No | 例外を有効にするフラグ |

## 表示項目

### Get-DbaInstalledPatch 出力

| 項目名 | 型 | 説明 |
|--------|-----|------|
| ComputerName | string | パッチが検出されたコンピュータ名 |
| Name | string | パッチの表示名（例: "Hotfix for SQL Server 2019 (KB5012345)"） |
| Version | string | パッチのバージョン番号 |
| InstallDate | DbaDate | インストール日（.Dateプロパティで日付のみ取得可能） |

## イベント仕様

### 1-パッチ情報取得

1. 指定されたComputerNameに対してループ処理開始
2. Invoke-Command2でリモートスクリプトブロック実行
3. レジストリパス（HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall）の子項目を取得
4. DisplayNameが「Hotfix*SQL*」「Service Pack*SQL*」「GDR*SQL*」にマッチするエントリをフィルタリング
5. InstallDate順にソート
6. 各パッチについてPSCustomObjectを作成して出力

## データベース更新仕様

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

この機能はデータベースへの更新操作を行わない。Windowsレジストリの読み取り専用操作のみ。

| 操作（イベント） | 対象 | 操作種別 | 概要 |
|----------------|------|---------|------|
| パッチ情報取得 | Windowsレジストリ | SELECT（読み取り） | レジストリからパッチ情報を取得 |

## メッセージ仕様

| 種別 | メッセージ | 発生条件 |
|------|----------|---------|
| Error | Failed | リモートコンピュータへの接続失敗時 |

## 例外処理

| 例外条件 | 処理内容 |
|---------|---------|
| リモート接続エラー | Stop-Functionで処理を継続（-Continue）し、次のコンピュータを処理 |
| 日付パース失敗 | InstallDateフォーマット（yyyyMMdd）が不正な場合にエラー発生 |

## 備考

- レジストリのInstallDate形式は「yyyyMMdd」（例: 20240115）
- InstallDateはDbaDate型にキャストされ、カスタマイズ可能な日付表示をサポート
- ソート時は`InstallDate.Date`プロパティを使用する必要がある
- Test-DbaBuildと組み合わせてビルドの最新性を確認可能

---

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

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

### 推奨読解順序

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

レジストリから取得されるパッチ情報の構造を理解する。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | Get-DbaInstalledPatch.ps1 | `public/Get-DbaInstalledPatch.ps1` | 出力オブジェクトのプロパティ構造（行82-87） |

**読解のコツ**: レジストリのDisplayName、DisplayVersion、InstallDateがどのようにマッピングされるかに注目。

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

Get-DbaInstalledPatch関数全体の処理フローを把握する。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | Get-DbaInstalledPatch.ps1 | `public/Get-DbaInstalledPatch.ps1` | パラメータ定義、リモート実行、フィルタリング |

**主要処理フロー**:
1. **行64-70**: パラメータ定義（ComputerName、Credential、EnableException）
2. **行71-72**: processブロックでComputerNameループ開始
3. **行73-76**: Invoke-Command2でリモートスクリプトブロック実行
4. **行75**: レジストリフィルタリング条件（Hotfix*SQL*、Service Pack*SQL*、GDR*SQL*）
5. **行81-88**: 結果オブジェクトの生成とInstallDateの変換

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

```
Get-DbaInstalledPatch (public/Get-DbaInstalledPatch.ps1)
    │
    └─ Invoke-Command2 (リモートスクリプトブロック)
           │
           ├─ Get-ChildItem (HKLM:\SOFTWARE\...\Uninstall)
           │
           ├─ Get-ItemProperty
           │
           ├─ Where-Object (DisplayNameフィルタ)
           │
           └─ Sort-Object (InstallDate)
```

### データフロー図

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

ComputerName ────────────▶ Invoke-Command2 ──▶ リモートスクリプト実行
                                    │
Credential ──────────────▶         │
                                    ▼
                           レジストリ照会
                           (HKLM:\SOFTWARE\Microsoft\
                            Windows\CurrentVersion\Uninstall)
                                    │
                                    ▼
                           DisplayNameフィルタ
                           ├─ Hotfix*SQL*
                           ├─ Service Pack*SQL*
                           └─ GDR*SQL*
                                    │
                                    ▼
                           Sort-Object InstallDate
                                    │
                                    ▼
                           [PSCustomObject]
                           ├─ ComputerName
                           ├─ Name (DisplayName)
                           ├─ Version (DisplayVersion)
                           └─ InstallDate (DbaDate)
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| Get-DbaInstalledPatch.ps1 | `public/Get-DbaInstalledPatch.ps1` | ソース | インストール済みパッチ取得メイン関数 |
| Invoke-Command2.ps1 | `internal/functions/Invoke-Command2.ps1` | ソース | リモートコマンド実行ラッパー |
