# 画面設計書 175-機能取得

## 概要

本ドキュメントは、dbatools PowerShellモジュールの `Get-DbaFeature` コマンドの機能仕様を定義した画面設計書です。

### 本画面の処理概要

本コマンドは、SQL Serverの組み込み機能検出レポートを実行し、インストールされているSQL Serverコンポーネント、エディション、インスタンスを検出します。

**業務上の目的・背景**：大規模な環境では複数のサーバーにSQL Serverがインストールされており、ライセンス管理、コンプライアンス監査、環境ドキュメント作成のためにインストール状況を把握する必要があります。本コマンドは、手動でsetup.exe /Action=RunDiscoveryを実行してXMLレポートを解析する作業を自動化し、複数サーバーのSQL Server機能インベントリを効率的に取得できます。

**画面へのアクセス方法**：PowerShellコンソールまたはスクリプトから `Get-DbaFeature` コマンドを実行します。ComputerNameパラメータでWindowsコンピュータ名を指定します（デフォルトはローカルホスト）。

**主要な操作・処理内容**：
1. 対象コンピュータでSQL Server setup.exeを検索
2. setup.exe /Action=RunDiscovery /q を実行してDiscoveryレポートを生成
3. 生成されたSqlDiscoveryReport.xmlを解析
4. インストールされている各機能の情報を構造化データとして出力

**画面遷移**：本コマンドは単独実行可能です。出力結果は `Format-Table`、`Export-Csv` などの他のPowerShellコマンドにパイプで渡すことができます。

**権限による表示制御**：対象コンピュータへのPowerShellリモーティングアクセスが必要です。setup.exeの実行にはローカル管理者権限が必要です。

## 関連機能

| 機能No | 機能名 | 関連種別 | 関連する操作・処理 |
|--------|--------|----------|------------------|
| 125 | Get-DbaFeature | 主機能 | SQL Server機能の取得 |

## 画面種別

コマンドライン出力（一覧表示）

## URL/ルーティング

PowerShellコマンド: `Get-DbaFeature`

## 入出力項目

| パラメータ名 | 型 | 必須 | 説明 |
|-------------|---|------|------|
| ComputerName | DbaInstanceParameter[] | No | 対象Windowsコンピュータ名（デフォルト: $env:COMPUTERNAME） |
| Credential | PSCredential | No | 認証用資格情報 |
| EnableException | switch | No | 例外処理モードの有効化 |

## 表示項目

| 項目名 | 型 | 説明 |
|--------|---|------|
| ComputerName | string | SQL Serverがインストールされているコンピュータ名 |
| Product | string | SQL Server製品名（例：SQL Server 2019 Enterprise Edition） |
| Instance | string | インスタンス名（デフォルトインスタンスはMSSQLSERVER） |
| InstanceID | string | インスタンスID識別子 |
| Feature | string | インストールされている機能（Database Engine, Analysis Services等） |
| Language | string | インストール言語（例：English） |
| Edition | string | SQL Serverエディション（Enterprise, Standard, Express等） |
| Version | string | SQL Serverバージョン番号（例：15.0.2000.5） |
| Clustered | bool | フェイルオーバークラスターの一部かどうか |
| Configured | bool | 機能が完全に構成されているかどうか |

## イベント仕様

### 1-コマンド実行

1. 対象コンピュータでスクリプトブロックをリモート実行（Invoke-Command2）
2. Program Files\Microsoft SQL Serverディレクトリ内でsetup.exeを検索
3. setup.exe /Action=RunDiscovery /q を実行してDiscoveryレポートを生成
4. SqlDiscoveryReport.xmlファイルの内容を取得
5. XMLを解析し、各DiscoveryInformation要素からPSCustomObjectを生成
6. 結果をパイプラインに出力

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

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

| 操作（イベント） | 対象テーブル | 操作種別 | 概要 |
|----------------|-------------|---------|------|
| コマンド実行 | N/A | N/A | データベース操作なし（ファイルシステム操作のみ） |

### テーブル別更新項目詳細

本コマンドはデータベース操作を行いません。SQL Serverのsetup.exeを実行してDiscoveryレポートを生成し、XMLファイルを読み取ります。

## メッセージ仕様

| メッセージID | 種別 | 条件 | メッセージ内容 |
|-------------|------|------|--------------|
| M001 | Verbose | 機能が見つからない | "No features found on {computer}" |
| M002 | Error | 実行失敗 | "Failure" |

## 例外処理

| 例外条件 | 処理内容 |
|---------|---------|
| setup.exeが見つからない | 空の出力（Verboseメッセージを出力） |
| リモート実行失敗 | Stop-Functionでエラーを出力し、次のコンピュータに継続 |
| XML解析エラー | Stop-Functionでエラーを出力し、次のコンピュータに継続 |

## 備考

- 前提条件：
  1. Program Files\Microsoft SQL Serverサブフォルダが存在する必要あり（SQL 2008R2、2012で検証済み）
  2. Discoveryレポートは実行されたsetup.exeのバージョンおよびそれ以前のバージョンのコンポーネントを表示
- PowerShellリモーティングが有効である必要があります
- ローカル実行の場合もInvoke-Command2を使用します

---

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

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

### 推奨読解順序

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

出力オブジェクトのプロパティ構成を理解します。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | Get-DbaFeature.ps1 | `public/Get-DbaFeature.ps1` | 119-130行目：出力オブジェクトのプロパティ定義 |

**読解のコツ**: XMLから直接プロパティを取得しています。$result変数はXMLのDiscoveryInformation要素です。

#### Step 2: スクリプトブロックを理解する

リモートコンピュータで実行されるスクリプトブロックを確認します。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | Get-DbaFeature.ps1 | `public/Get-DbaFeature.ps1` | 92-105行目：$scriptBlock定義 |

**主要処理フロー**:
1. **93-95行目**: setup.exeを検索（Setup Bootstrap\SQLまたはBootstrap\Release\Setup.exe）
2. **96-97行目**: setup.exe /Action=RunDiscovery /q を実行
3. **98-99行目**: SqlDiscoveryReport.xmlを検索
4. **101-103行目**: XMLファイルの内容を返却

#### Step 3: メイン処理を理解する

processブロックの処理フローを確認します。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | Get-DbaFeature.ps1 | `public/Get-DbaFeature.ps1` | 108-136行目：processブロック |

**主要処理フロー**:
1. **110-111行目**: Invoke-Command2でスクリプトブロックをリモート実行
2. **113-115行目**: 結果がない場合のVerboseメッセージ
3. **117行目**: テキストをXMLとして解析
4. **118-131行目**: 各DiscoveryInformationをPSCustomObjectに変換

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

```
Get-DbaFeature
    |
    +-- begin ($scriptBlock定義)
    |
    +-- process (各コンピュータをループ)
           |
           +-- Invoke-Command2 (リモート実行)
           |      |
           |      +-- Get-ChildItem (setup.exe検索)
           |      +-- Start-Process (Discovery実行)
           |      +-- Get-ChildItem (XMLファイル検索)
           |      +-- Get-Content (XML読み取り)
           |
           +-- [xml]$text (XML解析)
           |
           +-- PSCustomObject (結果生成)
```

### データフロー図

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

ComputerName  ---> Invoke-Command2 -----> setup.exe実行
                        |                     |
                        |               SqlDiscoveryReport.xml
                        |                     |
                        v                     v
                   Get-Content          [xml]解析
                        |                     |
                        v                     v
                   foreach             PSCustomObject
                   (DiscoveryInformation)    (整形された結果)
```

### 関連ファイル一覧

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