# 画面設計書：140-クライアントプロトコル

## 1. 基本情報

| 項目 | 内容 |
|------|------|
| 画面ID | 140 |
| 画面名 | クライアントプロトコル |
| カテゴリ | Network |
| 関連コマンド | Get-DbaClientProtocol |
| 対応バージョン | SQL Server 2005以降 |

## 2. 概要・目的

本画面は、SQL Serverクライアントのネットワークプロトコル設定を管理する機能を提供します。Named Pipes、TCP/IP、Shared Memory、VIAの各プロトコルの有効/無効状態、優先順位、関連DLLファイルを取得・変更できます。

主な用途:
- クライアント接続プロトコルの監査
- 複数サーバー間でのクライアント設定の標準化
- 接続トラブルシューティング
- プロトコルの有効化/無効化

## 3. 機能一覧

### 3.1 Get-DbaClientProtocol

SQL Serverクライアントのネットワークプロトコル設定を取得します。

| 項目 | 内容 |
|------|------|
| 機能ID | F-140-001 |
| 機能名 | クライアントプロトコル取得 |
| 処理概要 | CIM/WMIを使用してClientNetworkProtocolクラスからプロトコル設定を取得 |
| 前提条件 | 対象コンピュータのローカル管理者権限、SQL Server 2005以降 |
| 実行権限 | ローカル管理者 |

#### 入力パラメータ

| パラメータ名 | 型 | 必須 | デフォルト値 | 説明 |
|-------------|-----|------|-------------|------|
| ComputerName | DbaInstanceParameter[] | No | $env:COMPUTERNAME | 対象コンピュータ名（複数指定可能） |
| Credential | PSCredential | No | - | 認証情報 |
| EnableException | switch | No | $false | 例外を有効にするか |

#### 出力プロパティ

| プロパティ名 | 型 | 説明 |
|-------------|-----|------|
| ComputerName | string | コンピュータ名（PSComputerNameのエイリアス） |
| DisplayName | string | プロトコル表示名（ProtocolDisplayNameのエイリアス） |
| DLL | string | プロトコルDLLファイル（ProtocolDllのエイリアス） |
| Order | int | プロトコル優先順位（ProtocolOrderのエイリアス、0は無効） |
| IsEnabled | bool | プロトコルが有効かどうか |

#### 追加メソッド

| メソッド名 | 戻り値 | 説明 |
|-----------|--------|------|
| Enable() | int | プロトコルを有効化（成功時は0を返す） |
| Disable() | int | プロトコルを無効化（成功時は0を返す） |

## 4. プロトコル種別

| プロトコル名 | 表示名 | 説明 |
|-------------|--------|------|
| sm | Shared Memory | 同一マシン内のローカル接続用 |
| tcp | TCP/IP | 標準的なネットワーク接続用 |
| np | Named Pipes | Windowsネットワーク接続用 |
| via | VIA | Virtual Interface Adapter（廃止予定） |

## 5. 優先順位（ProtocolOrder）

- **0**: プロトコル無効
- **1以上**: 有効、数値が小さいほど優先度が高い
- クライアントは優先順位の順にプロトコルを試行

## 6. 処理フロー

### 6.1 プロトコル取得処理

```
1. Resolve-DbaNetworkNameでコンピュータ名を解決
2. ComputerManagement名前空間を検索
3. ClientNetworkProtocolクラスを取得
4. IsEnabled、Enable()、Disable()メソッドを追加
5. Select-DefaultViewで出力プロパティを整形
```

### 6.2 プロトコル有効化/無効化処理

```
1. Get-DbaClientProtocolでプロトコルオブジェクトを取得
2. Where-Objectで対象プロトコルをフィルタリング
3. Enable()またはDisable()メソッドを実行
4. 戻り値0で成功を確認
```

## 7. エラーハンドリング

| エラー条件 | 対処 |
|-----------|------|
| コンピュータに接続できない | 警告メッセージを出力して次のコンピュータへ |
| ComputerManagement名前空間がない | SQL Server 2005以降が必要との警告を出力 |
| ClientNetworkProtocolが取得できない | 警告メッセージを出力 |

## 8. 使用例

### 8.1 基本的な取得

```powershell
# ローカルコンピュータのクライアントプロトコルを取得
Get-DbaClientProtocol

# リモートサーバーのクライアントプロトコルを取得
Get-DbaClientProtocol -ComputerName sqlserver2014a
```

### 8.2 複数コンピュータの取得

```powershell
# パイプラインで複数コンピュータを指定
'sql1','sql2','sql3' | Get-DbaClientProtocol

# グリッドビューで表示
Get-DbaClientProtocol -ComputerName sql1,sql2 | Out-GridView
```

### 8.3 プロトコルの有効化/無効化

```powershell
# Named Pipesプロトコルを無効化
(Get-DbaClientProtocol -ComputerName sql2 | Where-Object { $_.DisplayName -eq 'Named Pipes' }).Disable()

# TCP/IPプロトコルを有効化
(Get-DbaClientProtocol -ComputerName sql2 | Where-Object { $_.DisplayName -eq 'TCP/IP' }).Enable()
```

## 9. 関連コマンド

| コマンド名 | 関係 |
|-----------|------|
| Resolve-DbaNetworkName | コンピュータ名の解決に使用 |
| Get-DbaCmObject | CIM/WMIオブジェクトの取得に使用 |
| Get-DbaClientAlias | クライアントエイリアス管理 |

## 10. 技術仕様

### 10.1 WMI/CIM名前空間

- **名前空間パターン**: `root\Microsoft\SQLServer\ComputerManagement*`
- **クラス名**: `ClientNetworkProtocol`
- 最新バージョンの名前空間を自動選択（Sort-Object Name -Descending | Select-Object -First 1）

### 10.2 メソッド実装

```powershell
# IsEnabledプロパティ（ScriptProperty）
switch ( $this.ProtocolOrder ) { 0 { $false } default { $true } }

# Enable()メソッド（ScriptMethod）
Invoke-CimMethod -MethodName SetEnable -InputObject $this

# Disable()メソッド（ScriptMethod）
Invoke-CimMethod -MethodName SetDisable -InputObject $this
```

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

### 11.1 関連ファイル一覧

| ファイルパス | 役割 |
|-------------|------|
| public/Get-DbaClientProtocol.ps1 | クライアントプロトコル取得コマンド |
| internal/functions/Resolve-DbaNetworkName.ps1 | ネットワーク名解決 |
| internal/functions/Get-DbaCmObject.ps1 | CIM/WMIオブジェクト取得 |

### 11.2 コードの読み進め方

#### ステップ1: エントリーポイント（Get-DbaClientProtocol.ps1）

```
行1-92: 関数定義、ヘルプドキュメント、パラメータ定義
行93-122: メイン処理（processブロック）
```

#### ステップ2: 名前解決処理

```
行95-97: Resolve-DbaNetworkNameでコンピュータ名を解決
  - FullComputerNameが取得できた場合のみ処理を続行
```

#### ステップ3: 名前空間の検索

```
行98-99: WQL クエリで ComputerManagement 名前空間を検索
  - Sort-Object Name -Descending で最新バージョンを選択
```

#### ステップ4: プロトコルオブジェクトの取得

```
行101-104: Get-DbaCmObject で ClientNetworkProtocol クラスを取得
行106: IsEnabled プロパティを Add-Member で追加
行107: Enable() メソッドを Add-Member で追加
行108: Disable() メソッドを Add-Member で追加
```

#### ステップ5: 出力の整形

```
行110-112: Select-DefaultView でデフォルト表示プロパティを設定
  - ComputerName, DisplayName, DLL, Order, IsEnabled
```

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

```
Get-DbaClientProtocol
  |
  +-- Resolve-DbaNetworkName
  |     +-- [DNS解決処理]
  |
  +-- Get-DbaCmObject (名前空間検索)
  |     +-- WQL: SELECT * FROM __NAMESPACE WHERE Name LIKE 'ComputerManagement%'
  |
  +-- Get-DbaCmObject (プロトコル取得)
  |     +-- CIM Class: ClientNetworkProtocol
  |
  +-- Add-Member (メソッド追加)
  |     +-- IsEnabled (ScriptProperty)
  |     +-- Enable() (ScriptMethod)
  |     +-- Disable() (ScriptMethod)
  |
  +-- Select-DefaultView
        +-- [出力プロパティの選択]
```

### 11.4 データフロー図

```
[ComputerName入力]
       |
       v
[Resolve-DbaNetworkName] --> [FullComputerName]
       |
       v
[Get-DbaCmObject: 名前空間検索]
       |
       v
[ComputerManagement名前空間]
       |
       v
[Get-DbaCmObject: ClientNetworkProtocol]
       |
       v
[CIMオブジェクト配列]
       |
       v
[Add-Member: メソッド追加]
       |
       v
[Select-DefaultView: 出力整形]
       |
       v
[ClientNetworkProtocolオブジェクト出力]
  - ComputerName
  - DisplayName
  - DLL
  - Order
  - IsEnabled
  - Enable()
  - Disable()
```

## 12. 注意事項

1. **権限要件**: 対象コンピュータのローカル管理者権限が必要
2. **バージョン要件**: SQL Server 2005以降でのみ動作
3. **WSMan要件**: Enable()/Disable()メソッドはWSMan経由で取得した場合のみ動作
4. **VIAプロトコル**: SQL Server 2012以降で廃止予定
5. **即時反映**: プロトコルの変更は即座に反映される

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

- 資格情報（Credential）はPSCredentialオブジェクトとして安全に渡される
- WMI/CIMアクセスはローカル管理者権限で認証される
- プロトコル変更はシステム設定の変更であり、監査ログに記録される
