# 機能設計書 147-Get-DbaStartupParameter

## 概要

本ドキュメントは、dbatools PowerShellモジュールにおける`Get-DbaStartupParameter`コマンドレットの機能設計を定義する。本機能は、WindowsサービスからSQL Serverの起動パラメータを取得・解析し、構成情報を提供する。

### 本機能の処理概要

`Get-DbaStartupParameter`は、WMI経由でWindowsサービス構成からSQL Serverの起動パラメータを抽出・解析するコマンドレットである。masterデータベース、トランザクションログ、エラーログのファイルパス、トレースフラグ、デバッグフラグ、シングルユーザーモードなどの特殊起動モードの設定状態を詳細に返す。

**業務上の目的・背景**：SQL Serverの起動パラメータは、SQL Server自体に接続できない状況でもWindowsサービスから確認できる重要な構成情報である。起動障害のトラブルシューティング、サーバー構成のドキュメント化、トレースフラグ設定の確認など、様々な運用・保守シーンで活用される。本機能はSQL Server Configuration Managerと同等の情報をPowerShellから取得可能にする。

**機能の利用シーン**：
- SQL Server起動障害のトラブルシューティング
- トレースフラグ設定の確認と監査
- サーバー構成のドキュメント化
- シングルユーザーモード設定の確認
- 環境間での起動パラメータ比較
- masterデータベースのファイル位置確認

**主要な処理内容**：
1. Resolve-DbaNetworkNameでコンピュータ名を解決
2. Invoke-ManagedComputerCommandでWMI経由でサービス情報を取得
3. StartupParametersプロパティをセミコロンで分割
4. 各パラメータを接頭辞（-d, -l, -e, -T, -t等）で分類
5. -Simple指定時は基本情報のみ、それ以外は全詳細情報を返す

**関連システム・外部連携**：
- SQL Server WMI（サービス構成情報）
- Invoke-ManagedComputerCommand（内部関数）
- Resolve-DbaNetworkName（名前解決）

**権限による制御**：対象コンピュータへのWMIアクセス権限が必要。リモートサーバーの場合はWindowsクレデンシャルが必要。

## 関連画面

| 画面No | 画面名 | 関連種別 | 関連する操作・処理 |
|--------|--------|----------|------------------|
| - | CLIコマンド | 主機能 | 起動パラメータ取得 |

## 機能種別

情報取得処理

## 入力仕様

### 入力パラメータ

| パラメータ名 | 型 | 必須 | 説明 | バリデーション |
|-------------|-----|-----|------|---------------|
| SqlInstance | DbaInstanceParameter[] | Yes | 対象SQL Serverインスタンス | パイプライン入力対応 |
| Credential | PSCredential | No | 代替Windowsクレデンシャル（別名: SqlCredential） | - |
| Simple | switch | No | 簡易出力モード（基本情報のみ） | - |
| EnableException | switch | No | 例外を有効化 | - |

### 入力データソース

- SQL Server WMI（ManagedComputer.Services）
- サービスのStartupParametersプロパティ

## 出力仕様

### 出力データ（標準モード）

| 項目名 | 型 | 説明 |
|--------|-----|------|
| ComputerName | string | コンピュータ名 |
| InstanceName | string | インスタンス名 |
| SqlInstance | string | 完全なSQL Serverインスタンス名 |
| MasterData | string | masterデータベースファイルパス |
| MasterLog | string | masterトランザクションログパス |
| ErrorLog | string | エラーログファイルパス |
| TraceFlags | int[] or "None" | 有効なトレースフラグ配列 |
| DebugFlags | int[] or "None" | 有効なデバッグフラグ配列 |
| CommandPromptStart | bool | -cパラメータ有無（GUIなし起動） |
| MinimalStart | bool | -fパラメータ有無（最小構成起動） |
| MemoryToReserve | int | -gパラメータ値（予約メモリMB、0=未設定） |
| SingleUser | bool | -mパラメータ有無（シングルユーザーモード） |
| SingleUserName | string | シングルユーザーモードのアプリケーション名 |
| NoLoggingToWinEvents | bool | -nパラメータ有無（Windowsイベントログ無効） |
| StartAsNamedInstance | bool | -sパラメータ有無 |
| DisableMonitoring | bool | -xパラメータ有無（モニタリング無効） |
| IncreasedExtents | bool | -Eパラメータ有無（拡張エクステント） |
| ParameterString | string | 元の起動パラメータ文字列 |

### 出力データ（-Simple指定時）

| 項目名 | 型 | 説明 |
|--------|-----|------|
| ComputerName | string | コンピュータ名 |
| InstanceName | string | インスタンス名 |
| SqlInstance | string | 完全なSQL Serverインスタンス名 |
| MasterData | string | masterデータベースファイルパス |
| MasterLog | string | masterトランザクションログパス |
| ErrorLog | string | エラーログファイルパス |
| TraceFlags | int[] or "None" | 有効なトレースフラグ配列 |
| DebugFlags | int[] or "None" | 有効なデバッグフラグ配列 |
| ParameterString | string | 元の起動パラメータ文字列 |

### 出力先

パイプライン（PSCustomObject）

## 処理フロー

### 処理シーケンス

```
1. インスタンスループ開始
   └─ 各SqlInstanceに対して処理
2. コンピュータ名・インスタンス名解析
   └─ InstanceNameが空の場合は"MSSQLSERVER"
3. ネットワーク名解決
   └─ Resolve-DbaNetworkNameでFQDN取得
4. WMI経由でサービス情報取得
   └─ Invoke-ManagedComputerCommandでScriptBlock実行
5. StartupParameters解析
   ├─ セミコロンで分割
   ├─ -d: masterデータベースパス
   ├─ -l: masterログパス
   ├─ -e: エラーログパス
   ├─ -T: トレースフラグ（大文字）
   └─ -t: デバッグフラグ（小文字）
6. 追加パラメータ解析（-Simple未指定時）
   ├─ -c: CommandPromptStart
   ├─ -f: MinimalStart
   ├─ -g: MemoryToReserve
   ├─ -m: SingleUser
   ├─ -n: NoLoggingToWinEvents
   ├─ -s: StartAsNamedInstance
   ├─ -x: DisableMonitoring
   └─ -E: IncreasedExtents
7. PSCustomObject出力
```

### フローチャート

```mermaid
flowchart TD
    A[開始] --> B[SqlInstanceループ]
    B --> C[ComputerName/InstanceName抽出]
    C --> D[Resolve-DbaNetworkName]
    D --> E{InstanceName空?}
    E -->|Yes| F[InstanceName = MSSQLSERVER]
    E -->|No| G[そのまま使用]
    F --> H[DisplayName構築<br/>"SQL Server (instance)"]
    G --> H
    H --> I[Invoke-ManagedComputerCommand<br/>ScriptBlock実行]
    I --> J[StartupParameters取得]
    J --> K[セミコロンで分割]
    K --> L[-d, -l, -e, -T, -t<br/>パラメータ抽出]
    L --> M{TraceFlags空?}
    M -->|Yes| N[TraceFlags = "None"]
    M -->|No| O[整数配列に変換]
    N --> P{-Simple指定?}
    O --> P
    P -->|Yes| Q[簡易PSCustomObject<br/>出力]
    P -->|No| R[追加パラメータ解析<br/>-c, -f, -g, -m, -n, -s, -x, -E]
    R --> S[詳細PSCustomObject<br/>出力]
    Q --> T{次のInstance<br/>あり?}
    S --> T
    T -->|Yes| B
    T -->|No| U[終了]
```

## ビジネスルール

### 業務ルール

| ルールNo | ルール名 | 内容 | 適用条件 |
|---------|---------|------|---------|
| BR-001 | デフォルトインスタンス名 | InstanceNameが空の場合は"MSSQLSERVER" | インスタンス名解析時 |
| BR-002 | トレースフラグ形式 | -T（大文字）で始まるパラメータがトレースフラグ | パラメータ解析時 |
| BR-003 | デバッグフラグ形式 | -t（小文字）で始まるパラメータがデバッグフラグ | パラメータ解析時 |
| BR-004 | トレースフラグなし | トレースフラグ/デバッグフラグがない場合は"None"を返す | 配列空の場合 |
| BR-005 | ケース区別 | -Eパラメータは大文字小文字を区別（-ceq） | IncreasedExtents判定 |
| BR-006 | MemoryToReserveデフォルト | -g未指定時は0を返す | パラメータ未検出時 |

### 計算ロジック

- トレースフラグ/デバッグフラグ: 接頭辞(-T, -t)を除去し、整数配列に変換
- MasterData/MasterLog/ErrorLog: 接頭辞(-d, -l, -e)を除去

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

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

本機能はSQL Serverデータベースへのアクセスを行わない。

| 操作 | 対象テーブル | 操作種別 | 概要 |
|-----|-------------|---------|------|
| - | - | - | WMIアクセスのみ |

## エラー処理

### エラーケース一覧

| エラーコード | エラー種別 | 発生条件 | 対処方法 |
|------------|----------|---------|---------|
| - | WMIアクセスエラー | 対象サーバーへのWMI接続失敗 | ネットワーク接続・権限確認 |
| - | サービス未発見 | SQL Serverサービスが見つからない | インスタンス名確認 |
| - | 認証エラー | クレデンシャル不正 | 適切なクレデンシャル指定 |

### リトライ仕様

リトライは実装されていない。エラー時はStop-Function -Continueで次のインスタンスへ。

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

データベーストランザクションは使用しない。

## パフォーマンス要件

- WMI呼び出しのためネットワーク遅延に依存
- 各インスタンスに対して個別にWMI呼び出しを行う

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

- WMIアクセスには適切なWindows権限が必要
- ファイルパス情報を返すが、ファイルへのアクセスは行わない
- Credentialパラメータで安全に認証情報を渡せる

## 備考

- 参照: https://msdn.microsoft.com/en-us/library/ms190737.aspx
- 起動パラメータの変更はSet-DbaStartupParameterを使用

---

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

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

### 推奨読解順序

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

出力オブジェクトの構造を理解する。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | Get-DbaStartupParameter.ps1 | `public/Get-DbaStartupParameter.ps1` | 2種類の出力形式（Simple/詳細） |

**読解のコツ**:
- 131-142行目: -Simple指定時の出力（9プロパティ）
- 186-205行目: 詳細出力（18プロパティ）

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

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | Get-DbaStartupParameter.ps1 | `public/Get-DbaStartupParameter.ps1` | 全体処理フロー |

**主要処理フロー**:
1. **90-100行目**: processブロック、変数初期化とネットワーク名解決
2. **104-207行目**: ScriptBlock定義（WMI側で実行される）
3. **109-110行目**: wmisvc取得とStartupParameters分割
4. **113-117行目**: -d, -l, -e, -T, -tパラメータ抽出
5. **119-129行目**: トレースフラグ/デバッグフラグの配列変換
6. **131-142行目**: -Simple時の出力オブジェクト
7. **146-178行目**: 追加パラメータの判定ロジック
8. **179行目**: -mパラメータ（シングルユーザー）の特別処理
9. **211-214行目**: Invoke-ManagedComputerCommand実行

#### Step 3: パラメータ解析ロジックを理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | Get-DbaStartupParameter.ps1 | `public/Get-DbaStartupParameter.ps1` | 起動パラメータの解析方法 |

**主要処理フロー**:
- **146行目**: -cパラメータ判定
- **147行目**: -fパラメータ判定
- **148行目**: -gパラメータ（StartsWith）
- **149行目**: -nパラメータ判定
- **150行目**: -sパラメータ判定
- **151行目**: -xパラメータ判定
- **152行目**: -Eパラメータ判定（-ceqで大文字小文字区別）
- **179行目**: -mパラメータ（StartsWith、詳細名取得）

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

```
Get-DbaStartupParameter
    │
    ├─ Resolve-DbaNetworkName
    │      └─ FQDN解決
    │
    └─ Invoke-ManagedComputerCommand
           │
           └─ ScriptBlock（リモート実行）
                  │
                  ├─ wmi.Services取得
                  │      └─ DisplayNameでフィルタ
                  │
                  └─ StartupParameters解析
                         ├─ -d: MasterData
                         ├─ -l: MasterLog
                         ├─ -e: ErrorLog
                         ├─ -T: TraceFlags
                         ├─ -t: DebugFlags
                         └─ その他起動オプション
```

### データフロー図

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

SqlInstance ────▶ ComputerName/InstanceName抽出
                        │
                        ▼
                  Resolve-DbaNetworkName
                        │
                        ▼
                  Invoke-ManagedComputerCommand
                        │
                        ▼
                  WMI Services取得
                        │
                        ▼
                  StartupParameters
                  "パラメータ文字列"
                        │
                        ▼
                  セミコロンで分割
                        │
           ┌────────────┼────────────┐
           ▼            ▼            ▼
        -d,-l,-e     -T,-t        その他
        ファイルパス  トレースフラグ  起動オプション
           │            │            │
           └────────────┼────────────┘
                        ▼
                  [PSCustomObject]
                  18プロパティ or 9プロパティ
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| Get-DbaStartupParameter.ps1 | `public/Get-DbaStartupParameter.ps1` | ソース | メイン機能 |
| Set-DbaStartupParameter.ps1 | `public/Set-DbaStartupParameter.ps1` | ソース | 起動パラメータ設定 |
| Invoke-ManagedComputerCommand.ps1 | `private/` | ソース | WMI呼び出し内部関数 |
| Resolve-DbaNetworkName.ps1 | `public/` | ソース | ネットワーク名解決 |
