# 画面設計書 74-資格情報管理

## 概要

本ドキュメントは、dbatools PowerShellモジュールにおける「資格情報管理」機能の設計書です。SQL Server の資格情報（Credential）の作成・取得・削除・コピー・エクスポートを行うコマンド群について記述します。

### 本画面の処理概要

本機能は、SQL Server に保存される資格情報を包括的に管理する機能を提供します。資格情報は、SQL Server サービスが外部リソース（ファイル共有、Webサービス、他のSQL Serverインスタンス等）に認証する際に使用されます。

**業務上の目的・背景**：SQL Server 環境において、ネットワークバックアップ、外部データソースへのアクセス、SQL Agent ジョブによる外部システム連携など、多くの操作で資格情報が必要となります。本機能により、これらの資格情報の構成状況の監査、セキュリティレビュー、環境間での資格情報の移行が効率化されます。特に、どのサービスアカウントがどの資格情報を使用しているかを把握することは、セキュリティコンプライアンスの観点から重要です。

**画面へのアクセス方法**：PowerShellコンソールから `Get-DbaCredential`、`New-DbaCredential`、`Remove-DbaCredential`、`Copy-DbaCredential`、`Export-DbaCredential` コマンドを直接実行します。

**主要な操作・処理内容**：
1. `Get-DbaCredential`: 資格情報の一覧取得、ID・名前・アイデンティティ・プロバイダー情報の取得
2. `New-DbaCredential`: 資格情報の新規作成
3. `Remove-DbaCredential`: 資格情報の削除
4. `Copy-DbaCredential`: インスタンス間での資格情報のコピー
5. `Export-DbaCredential`: 資格情報定義のエクスポート

**画面遷移**：本機能はCLIコマンドのため画面遷移は存在しません。資格情報は `Get-DbaAgentProxy` で取得したプロキシアカウントや、SQL Agent ジョブとの関連で確認されることが多いです。

**権限による表示制御**：資格情報の取得には ALTER ANY CREDENTIAL または sysadmin 権限が必要です。資格情報の作成・削除にも同様の権限が必要です。

## 関連機能

| 機能No | 機能名 | 関連種別 | 関連する操作・処理 |
|--------|--------|----------|------------------|
| 551 | Get-DbaCredential | 主機能 | 資格情報の取得 |
| 566 | New-DbaCredential | 主機能 | 資格情報の作成 |
| 572 | Remove-DbaCredential | 主機能 | 資格情報の削除 |
| 539 | Copy-DbaCredential | 補助機能 | 資格情報のコピー |
| 543 | Export-DbaCredential | 補助機能 | 資格情報のエクスポート |

## 画面種別

一覧 / 管理（資格情報の一覧取得および管理操作）

## URL/ルーティング

PowerShellコマンド:
- `Get-DbaCredential`
- `New-DbaCredential`
- `Remove-DbaCredential`
- `Copy-DbaCredential`
- `Export-DbaCredential`

## 入出力項目

### Get-DbaCredential 入力パラメータ

| パラメータ名 | 型 | 必須 | 説明 |
|-------------|-----|------|------|
| SqlInstance | DbaInstanceParameter[] | Yes | 対象SQL Serverインスタンス |
| SqlCredential | PSCredential | No | 代替認証情報 |
| Credential (Name) | string[] | No | 取得対象の資格情報名 |
| ExcludeCredential (ExcludeName) | string[] | No | 除外する資格情報名 |
| Identity (CredentialIdentity) | string[] | No | アイデンティティでフィルタリング |
| ExcludeIdentity (ExcludeCredentialIdentity) | string[] | No | 除外するアイデンティティ |
| EnableException | switch | No | 例外を有効化 |

## 表示項目

### Get-DbaCredential 出力プロパティ

| プロパティ名 | 型 | 説明 |
|-------------|-----|------|
| ComputerName | string | SQL Serverインスタンスのコンピュータ名 |
| InstanceName | string | SQL Serverインスタンス名 |
| SqlInstance | string | 完全なSQL Serverインスタンス名 |
| ID | int | 資格情報のユニークID |
| Name | string | 資格情報の名前 |
| Identity | string | Windowsアイデンティティまたは外部アイデンティティ |
| MappedClassType | string | 資格情報クラスタイプ（None または CryptographicProvider） |
| ProviderName | string | 暗号化プロバイダー名（EKM使用時） |

## イベント仕様

### 1-Get-DbaCredential実行

1. Connect-DbaInstance を使用してSQL Serverに接続
2. $server.Credentials から資格情報コレクションを取得
3. Credential パラメータで名前フィルタリング
4. ExcludeCredential パラメータで除外
5. Identity パラメータでアイデンティティフィルタリング
6. ExcludeIdentity パラメータで除外
7. 各資格情報に NoteProperty を追加して出力

### 2-New-DbaCredential実行

1. 資格情報名とアイデンティティの指定
2. SMO Credential オブジェクトの作成
3. Create() メソッドを実行
4. 作成された資格情報オブジェクトを返却

### 3-Remove-DbaCredential実行

1. 対象資格情報の存在確認
2. SMO Credential オブジェクトの Drop() メソッドを実行
3. 削除結果を返却

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

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

| 操作（イベント） | 対象テーブル | 操作種別 | 概要 |
|----------------|-------------|---------|------|
| Get-DbaCredential実行 | sys.credentials | SELECT | 資格情報の取得 |
| New-DbaCredential実行 | sys.credentials | INSERT | 資格情報の作成 |
| Remove-DbaCredential実行 | sys.credentials | DELETE | 資格情報の削除 |

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

#### sys.credentials

| 操作 | 項目（カラム名） | 更新値・取得条件 | 備考 |
|-----|-----------------|-----------------|------|
| SELECT | credential_id, name, credential_identity, mapped_class_type, target_type | すべての資格情報 | Get-DbaCredential |
| INSERT | name, credential_identity | New-DbaCredential | 暗号化されたパスワードは内部保存 |
| DELETE | credential_id | Remove-DbaCredential | 資格情報の削除 |

## メッセージ仕様

| メッセージID | 種別 | メッセージ内容 | 表示条件 |
|-------------|------|---------------|---------|
| MSG-001 | エラー | Failure | SQL Server接続失敗時 |

## 例外処理

| 例外種別 | 発生条件 | 処理内容 |
|---------|---------|---------|
| ConnectionError | SQL Serverへの接続失敗 | Stop-Function で処理を停止 |
| CredentialInUse | 使用中の資格情報の削除試行 | エラーメッセージを表示 |

## 備考

- 資格情報のパスワードは暗号化されて保存されるため、Get-DbaCredential では取得できない
- MappedClassType が CryptographicProvider の場合、EKM（拡張キー管理）で使用される資格情報
- 資格情報は SQL Agent プロキシアカウント、リンクサーバー、バックアップ先など多くの用途で使用される
- Azure Key Vault との統合でも資格情報が使用される

---

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

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

### 推奨読解順序

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

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | Get-DbaCredential.ps1 | `public/Get-DbaCredential.ps1` | 出力プロパティの定義（行55-77） |

**読解のコツ**: SMO Credential オブジェクトをそのまま返却し、NoteProperty を追加してカスタマイズしている点に注目。

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

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | Get-DbaCredential.ps1 | `public/Get-DbaCredential.ps1` | param ブロック（行97-110）とフィルタリング処理（行122-136） |

**主要処理フロー**:
1. **行115**: Connect-DbaInstance による接続
2. **行120**: $server.Credentials で資格情報コレクション取得
3. **行122-136**: 各種パラメータによるフィルタリング
4. **行139-141**: NoteProperty の追加
5. **行143**: Select-DefaultView で出力整形

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

```
Get-DbaCredential
    |
    +-- Connect-DbaInstance (SQL Server 接続)
    |
    +-- $server.Credentials (SMO Credential コレクション)
    |
    +-- Where-Object (フィルタリング)
    |       +-- Credential (Name) パラメータ
    |       +-- ExcludeCredential パラメータ
    |       +-- Identity パラメータ
    |       +-- ExcludeIdentity パラメータ
    |
    +-- Add-Member (NoteProperty 追加)
    |       +-- ComputerName
    |       +-- InstanceName
    |       +-- SqlInstance
    |
    +-- Select-DefaultView (出力整形)
```

### データフロー図

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

SqlInstance  ───+
                |
SqlCredential ──+──> Connect-DbaInstance ───> Server Object
                |
Credential ─────+──> フィルタリング ──────────> Credential[]
Identity ───────+
                |
                +──> Add-Member ────────────> 拡張Credential

拡張Credential ────> Select-DefaultView ───> Pipeline Output
                     (ID, Name, Identity,
                      MappedClassType,
                      ProviderName)
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| Get-DbaCredential.ps1 | `public/Get-DbaCredential.ps1` | ソース | 資格情報取得 |
| New-DbaCredential.ps1 | `public/New-DbaCredential.ps1` | ソース | 資格情報作成 |
| Remove-DbaCredential.ps1 | `public/Remove-DbaCredential.ps1` | ソース | 資格情報削除 |
| Copy-DbaCredential.ps1 | `public/Copy-DbaCredential.ps1` | ソース | 資格情報コピー |
| Export-DbaCredential.ps1 | `public/Export-DbaCredential.ps1` | ソース | 資格情報エクスポート |
| Connect-DbaInstance.ps1 | `public/Connect-DbaInstance.ps1` | ソース | SQL Server接続処理 |
