# 機能設計書 255-Unregister-DbatoolsConfig

## 概要

本ドキュメントは、dbatools PowerShellモジュールにおける`Unregister-DbatoolsConfig`コマンドレットの機能設計書です。永続化されたdbatools構成設定をレジストリおよび構成ファイルから削除します。

### 本機能の処理概要

`Unregister-DbatoolsConfig`コマンドは、`Register-DbatoolsConfig`コマンドで永続化されたdbatools構成設定を、Windowsレジストリまたは構成JSONファイルから削除します。ユーザープロファイルまたはシステム全体の保存場所から設定をクリーンアップできます。

**業務上の目的・背景**：dbatoolsモジュールは多くの構成設定を持ち、これらはセッション間で永続化できます。しかし、不要になった設定や誤って保存された設定を削除する必要が生じることがあります。本機能は、永続化された設定をレジストリやファイルシステムから削除し、モジュールの構成状態をクリーンに保つために使用されます。

**機能の利用シーン**：
- モジュール設定のリセット
- 不要になった構成のクリーンアップ
- トラブルシューティング時の設定初期化
- 環境移行後の古い設定削除
- テスト環境のセットアップ

**主要な処理内容**：
1. 指定されたスコープ（ユーザー/システム/ファイル）から構成を検索
2. マッチする構成エントリをレジストリまたはJSONファイルから削除
3. JSONファイルの場合はファイル全体を再書き込み

**関連システム・外部連携**：
- Windowsレジストリ（HKCU/HKLM配下のdbatools設定パス）
- JSONファイル（ローカル/共有/システムパス）

**権限による制御**：SystemDefaultスコープの設定削除には管理者権限が必要です。非Windowsシステムではレジストリベースのスコープはサポートされません。

## 関連画面

| 画面No | 画面名 | 関連種別 | 関連する操作・処理 |
|--------|--------|----------|------------------|
| - | - | - | 本機能はPowerShellコマンドレットであり、関連するGUI画面はありません |

## 機能種別

構成管理 / 削除処理

## 入力仕様

### 入力パラメータ

| パラメータ名 | 型 | 必須 | 説明 | バリデーション |
|-------------|-----|-----|------|---------------|
| ConfigurationItem | Dataplat.Dbatools.Configuration.Config[] | No | 削除対象の構成オブジェクト（Get-DbatoolsConfigから取得） | パイプライン入力可能 |
| FullName | string[] | No | 削除対象の設定の完全名 | パイプライン入力可能 |
| Module | string | Conditional | 対象モジュール名 | ParameterSet 'Module'で必須 |
| Name | string | No | モジュール内の設定名パターン（ワイルドカード対応） | デフォルト '*' |
| Scope | ConfigScope | No | 削除対象のスコープ | デフォルト UserDefault |

### スコープ値

| スコープ | 説明 | ビットフラグ値 |
|---------|------|--------------|
| UserDefault | ユーザーレジストリ（デフォルト） | 1 |
| UserMandatory | ユーザー強制設定 | 2 |
| SystemDefault | システムレジストリ（要管理者権限） | 4 |
| SystemMandatory | システム強制設定 | 8 |
| FileUserLocal | ローカルユーザーJSONファイル | 16 |
| FileUserShared | 共有ユーザーJSONファイル | 32 |
| FileSystem | システムJSONファイル | 64 |

### 入力データソース

- パイプライン経由でGet-DbatoolsConfigの出力
- コマンドラインでの直接指定

## 出力仕様

### 出力データ

本コマンドは出力を生成しません（void）。

### 出力先

- なし（設定の削除のみ）

## 処理フロー

### 処理シーケンス

```
1. begin ブロック
   ├─ 非Windowsでレジストリスコープの場合はStop-Function
   ├─ スコープに応じてレジストリプロパティ収集
   │   ├─ UserDefault (1): path_RegistryUserDefault
   │   ├─ UserMandatory (2): path_RegistryUserEnforced
   │   ├─ SystemDefault (4): path_RegistryMachineDefault
   │   └─ SystemMandatory (8): path_RegistryMachineEnforced
   └─ スコープに応じてファイル設定収集
       ├─ FileUserLocal (16): path_FileUserLocal/psf_config.json
       ├─ FileUserShared (32): path_FileUserShared/psf_config.json
       └─ FileSystem (64): path_FileSystem/psf_config.json
2. process ブロック
   ├─ ConfigurationItem処理
   │   ├─ レジストリからRemove-ItemProperty
   │   └─ ファイル設定からフィルタリング
   ├─ FullName処理
   │   ├─ レジストリからRemove-ItemProperty
   │   └─ ファイル設定からフィルタリング
   └─ Module処理
       ├─ Module.Nameパターンでマッチング
       └─ レジストリとファイルから該当項目削除
3. end ブロック
   └─ 変更されたJSONファイルを保存
       ├─ 設定が残っている場合は再書き込み
       └─ 設定が空の場合はファイル削除
```

### フローチャート

```mermaid
flowchart TD
    A[開始] --> B{非Windows & レジストリスコープ?}
    B -->|Yes| C[Stop-Function/終了]
    B -->|No| D[レジストリプロパティ収集]
    D --> E[ファイル設定収集]
    E --> F{ConfigurationItem処理}
    F --> G[レジストリから削除]
    G --> H[ファイル設定をフィルタ]
    H --> I{FullName処理}
    I --> J[レジストリから削除]
    J --> K[ファイル設定をフィルタ]
    K --> L{Module処理}
    L --> M[パターンマッチで削除]
    M --> N{変更されたファイルあり?}
    N -->|Yes| O{設定が残っている?}
    O -->|Yes| P[JSONファイル再書き込み]
    O -->|No| Q[ファイル削除]
    P --> R[終了]
    Q --> R
    N -->|No| R
```

## ビジネスルール

### 業務ルール

| ルールNo | ルール名 | 内容 | 適用条件 |
|---------|---------|------|---------|
| BR-001 | 非Windows制限 | 非WindowsでレジストリベースのスコープはStop-Function | PowerShell 6+かつ非Windows |
| BR-002 | ビットフラグ処理 | スコープはビットフラグとして処理される | 常に適用 |
| BR-003 | 空ファイル削除 | 設定が全て削除された場合はJSONファイル自体を削除 | ファイルベーススコープ |

### 計算ロジック

- スコープのビットフラグ: `$Scope -band 1`, `$Scope -band 2`, etc.
- モジュール名パターン: `"{0}.{1}" -f $Module, $Name`

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

本機能はデータベース操作を行いません。レジストリとファイルシステムに対して操作を行います。

### 操作別影響一覧

| 操作 | 対象 | 操作種別 | 概要 |
|-----|-----|---------|------|
| レジストリ削除 | HKCU/HKLM | DELETE | Remove-ItemProperty |
| ファイル更新 | psf_config.json | UPDATE/DELETE | ConvertTo-Json & Set-Content |

## エラー処理

### エラーケース一覧

| エラーコード | エラー種別 | 発生条件 | 対処方法 |
|------------|----------|---------|---------|
| NotSupported | サポートされない操作 | 非Windowsでレジストリスコープ | Stop-Functionで終了 |

### リトライ仕様

本機能にはリトライ機能はありません。

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

本機能はトランザクション管理を行いません。レジストリ操作とファイル操作は個別に実行されます。

## パフォーマンス要件

- レジストリ操作は通常ミリ秒単位で完了
- ファイル操作は設定数に依存（通常は即座に完了）

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

- SystemDefaultスコープの操作には管理者権限が必要
- レジストリへのアクセス権限が必要
- ファイルシステムへの書き込み権限が必要

## 備考

- PowerShellメモリ内の設定には影響しない（永続化された設定のみ削除）
- Register-DbatoolsConfigで保存した設定を元に戻す用途

---

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

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

### 推奨読解順序

#### Step 1: パラメータとパラメータセットを理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | Unregister-DbatoolsConfig.ps1 | `public/Unregister-DbatoolsConfig.ps1` | 66-86行目：パラメータ定義とパラメータセット |

**主要処理フロー**:
1. **66行目**: DefaultParameterSetName = 'Pipeline'
2. **68-74行目**: ConfigurationItemとFullNameはPipelineセット
3. **76-82行目**: ModuleとNameはModuleセット
4. **84-85行目**: Scopeパラメータ（デフォルトUserDefault）

#### Step 2: beginブロックでの初期化を理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | Unregister-DbatoolsConfig.ps1 | `public/Unregister-DbatoolsConfig.ps1` | 88-145行目：スコープに応じた収集処理 |

**主要処理フロー**:
- **89-92行目**: 非Windows環境でのレジストリスコープ制限
- **95-107行目**: レジストリプロパティ収集（ビットフラグ判定）
- **108-141行目**: JSONファイル設定収集

#### Step 3: processブロックでの削除処理を理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | Unregister-DbatoolsConfig.ps1 | `public/Unregister-DbatoolsConfig.ps1` | 146-197行目：削除処理 |

**主要処理フロー**:
- **151-161行目**: ConfigurationItemの処理
- **163-176行目**: FullNameの処理
- **178-196行目**: Moduleパターンの処理

#### Step 4: endブロックでのファイル保存を理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 4-1 | Unregister-DbatoolsConfig.ps1 | `public/Unregister-DbatoolsConfig.ps1` | 198-210行目：変更されたファイルの保存 |

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

```
Unregister-DbatoolsConfig
    │
    ├─ Get-ItemProperty (レジストリ読み取り)
    │
    ├─ Remove-ItemProperty (レジストリ削除)
    │
    ├─ Get-Content / ConvertFrom-Json (JSON読み取り)
    │
    ├─ ConvertTo-Json / Set-Content (JSON書き込み)
    │
    └─ Remove-Item (空ファイル削除)
```

### データフロー図

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

ConfigurationItem  ───┐
                      ├──▶ レジストリプロパティ検索  ───▶ Remove-ItemProperty
FullName          ───┤
                      │
Module/Name       ───┘
                      │
                      ├──▶ JSONファイル設定検索    ───▶ Set-Content/Remove-Item
                      │
Scope             ───▶ 対象スコープ決定
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| Unregister-DbatoolsConfig.ps1 | `public/Unregister-DbatoolsConfig.ps1` | ソース | メイン関数定義 |
| Register-DbatoolsConfig.ps1 | `public/Register-DbatoolsConfig.ps1` | ソース | 設定登録関数（対になる機能） |
| Get-DbatoolsConfig.ps1 | `public/Get-DbatoolsConfig.ps1` | ソース | 設定取得関数（入力ソース） |
| Stop-Function.ps1 | `internal/functions/flowcontrol/Stop-Function.ps1` | ソース | エラーハンドリング関数 |
