# 画面設計書 76-リンクサーバーログイン

## 概要

本ドキュメントは、dbatools PowerShellモジュールにおける「リンクサーバーログイン」機能の設計書です。SQL Server のリンクサーバーに設定されたログインマッピングの取得・作成・削除を行うコマンド群について記述します。

### 本画面の処理概要

本機能は、リンクサーバーに構成されたログインマッピングを管理する機能を提供します。ログインマッピングは、ローカルSQL Serverログインがリモートサーバーに接続する際に使用する資格情報を定義します。

**業務上の目的・背景**：リンクサーバーのセキュリティ監査において、どのローカルログインがどのリモートユーザーとしてマッピングされているか、偽装が有効になっているかを把握することは極めて重要です。不適切なログインマッピングは、過度な権限付与やセキュリティ違反につながる可能性があります。本機能により、ログインマッピングの監査、認証問題のトラブルシューティング、セキュリティドキュメント作成が効率化されます。

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

**主要な操作・処理内容**：
1. `Get-DbaLinkedServerLogin`: リンクサーバーのログインマッピング情報を取得
2. `New-DbaLinkedServerLogin`: 新しいログインマッピングを作成
3. `Remove-DbaLinkedServerLogin`: ログインマッピングを削除

**画面遷移**：本機能はCLIコマンドのため画面遷移は存在しません。`Get-DbaLinkedServer` の出力をパイプラインで `Get-DbaLinkedServerLogin` に渡すことで、特定のリンクサーバーのログインマッピングを取得できます。

**権限による表示制御**：リンクサーバーログインマッピングの取得・変更には ALTER ANY LINKED SERVER または sysadmin 権限が必要です。

## 関連機能

| 機能No | 機能名 | 関連種別 | 関連する操作・処理 |
|--------|--------|----------|------------------|
| 559 | Get-DbaLinkedServerLogin | 主機能 | リンクサーバーログインの取得 |
| 569 | New-DbaLinkedServerLogin | 主機能 | リンクサーバーログインの作成 |
| 577 | Remove-DbaLinkedServerLogin | 主機能 | リンクサーバーログインの削除 |

## 画面種別

一覧 / 管理（リンクサーバーログインの一覧取得および管理操作）

## URL/ルーティング

PowerShellコマンド:
- `Get-DbaLinkedServerLogin`
- `New-DbaLinkedServerLogin`
- `Remove-DbaLinkedServerLogin`

## 入出力項目

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

| パラメータ名 | 型 | 必須 | 説明 |
|-------------|-----|------|------|
| SqlInstance | DbaInstanceParameter[] | No | 対象SQL Serverインスタンス |
| SqlCredential | PSCredential | No | 代替認証情報 |
| LinkedServer | string[] | Yes（SqlInstance使用時） | 対象のリンクサーバー名 |
| LocalLogin | string[] | No | 対象のローカルログイン名 |
| ExcludeLocalLogin | string[] | No | 除外するローカルログイン名 |
| InputObject | object[] | No | パイプライン入力（Server または LinkedServer） |
| EnableException | switch | No | 例外を有効化 |

## 表示項目

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

| プロパティ名 | 型 | 説明 |
|-------------|-----|------|
| ComputerName | string | SQL Serverインスタンスのコンピュータ名 |
| InstanceName | string | SQL Serverインスタンス名 |
| SqlInstance | string | 完全なSQL Serverインスタンス名 |
| Name | string | ローカルログイン名 |
| RemoteUser | string | リモートサーバー上のユーザー名 |
| Impersonate | bool | 偽装が有効かどうか |

## イベント仕様

### 1-Get-DbaLinkedServerLogin実行

1. SqlInstance パラメータが指定された場合:
   - LinkedServer パラメータが必須
   - Connect-DbaInstance で接続し、Get-DbaLinkedServer でリンクサーバーを取得
   - InputObject に追加

2. InputObject が Server オブジェクトの場合:
   - LinkedServer パラメータが必須
   - Get-DbaLinkedServer でリンクサーバーを取得

3. InputObject が LinkedServer オブジェクトの場合:
   - 直接 LinkedServerLogins を取得

4. LocalLogin パラメータでフィルタリング
5. ExcludeLocalLogin パラメータで除外
6. 各ログインマッピングに NoteProperty を追加して出力

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

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

| 操作（イベント） | 対象テーブル | 操作種別 | 概要 |
|----------------|-------------|---------|------|
| Get-DbaLinkedServerLogin実行 | sys.linked_logins | SELECT | ログインマッピングの取得 |
| New-DbaLinkedServerLogin実行 | sys.linked_logins | INSERT | ログインマッピングの作成 |
| Remove-DbaLinkedServerLogin実行 | sys.linked_logins | DELETE | ログインマッピングの削除 |

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

#### sys.linked_logins

| 操作 | 項目（カラム名） | 更新値・取得条件 | 備考 |
|-----|-----------------|-----------------|------|
| SELECT | server_id, local_principal_id, uses_self_credential, remote_name | すべてのマッピング | Get-DbaLinkedServerLogin |
| INSERT | server_id, local_principal_id, uses_self_credential, remote_name | New-DbaLinkedServerLogin | 新規マッピング作成 |
| DELETE | server_id, local_principal_id | Remove-DbaLinkedServerLogin | マッピング削除 |

## メッセージ仕様

| メッセージID | 種別 | メッセージ内容 | 表示条件 |
|-------------|------|---------------|---------|
| MSG-001 | エラー | LinkedServer is required | SqlInstance使用時にLinkedServerが未指定 |

## 例外処理

| 例外種別 | 発生条件 | 処理内容 |
|---------|---------|---------|
| MissingParameter | LinkedServerが未指定（SqlInstance使用時） | Stop-Function で処理を停止 |
| LinkedServerNotFound | 指定されたリンクサーバーが存在しない | 処理をスキップ |

## 備考

- Get-DbaLinkedServer からパイプラインで渡した場合、LinkedServer パラメータは不要
- Connect-DbaInstance からパイプラインで渡した場合、LinkedServer パラメータは必須
- Impersonate が True の場合、ローカルログインの資格情報をそのまま使用（uses_self_credential）
- RemoteUser が指定されている場合、その資格情報を使用してリモートサーバーに接続

---

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

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

### 推奨読解順序

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

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

**読解のコツ**: SMO LinkedServerLogin オブジェクトに NoteProperty を追加している点に注目。

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

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | Get-DbaLinkedServerLogin.ps1 | `public/Get-DbaLinkedServerLogin.ps1` | param ブロック（行100-109）とパイプライン処理（行111-152） |

**主要処理フロー**:
1. **行112-118**: SqlInstance パラメータ処理（LinkedServer パラメータ必須チェック）
2. **行121-133**: InputObject のタイプ判定（Server or LinkedServer）
3. **行135-143**: LocalLogin, ExcludeLocalLogin によるフィルタリング
4. **行146-148**: NoteProperty の追加
5. **行150**: Select-DefaultView で出力整形

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

```
Get-DbaLinkedServerLogin
    |
    +-- [SqlInstance パラメータ使用時]
    |       +-- LinkedServer パラメータ必須チェック
    |       +-- Connect-DbaInstance (SQL Server 接続)
    |       +-- Get-DbaLinkedServer (リンクサーバー取得)
    |
    +-- [InputObject が Server の場合]
    |       +-- LinkedServer パラメータ必須チェック
    |       +-- Get-DbaLinkedServer (リンクサーバー取得)
    |
    +-- [InputObject が LinkedServer の場合]
    |       +-- 直接処理
    |
    +-- $ls.LinkedServerLogins (ログインマッピング取得)
    |
    +-- Where-Object (フィルタリング)
    |       +-- LocalLogin パラメータ
    |       +-- ExcludeLocalLogin パラメータ
    |
    +-- Add-Member (NoteProperty 追加)
    |
    +-- Select-DefaultView (出力整形)
```

### データフロー図

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

SqlInstance ─────+
                 |
LinkedServer ────+──> Get-DbaLinkedServer ───> LinkedServer Object
                 |
  または
                 |
InputObject ─────+──> [タイプ判定] ───────────> LinkedServer Object
(Server/LinkedServer)

LinkedServer ────────> LinkedServerLogins ────> LinkedServerLogin[]

LocalLogin ──────────> フィルタリング ─────────> LinkedServerLogin[]

LinkedServerLogin[] ─> Add-Member ────────────> 拡張LinkedServerLogin

拡張LinkedServerLogin > Select-DefaultView ──> Pipeline Output
                        (Name, RemoteUser,
                         Impersonate)
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| Get-DbaLinkedServerLogin.ps1 | `public/Get-DbaLinkedServerLogin.ps1` | ソース | ログインマッピング取得 |
| New-DbaLinkedServerLogin.ps1 | `public/New-DbaLinkedServerLogin.ps1` | ソース | ログインマッピング作成 |
| Remove-DbaLinkedServerLogin.ps1 | `public/Remove-DbaLinkedServerLogin.ps1` | ソース | ログインマッピング削除 |
| Get-DbaLinkedServer.ps1 | `public/Get-DbaLinkedServer.ps1` | ソース | リンクサーバー取得 |
| Connect-DbaInstance.ps1 | `public/Connect-DbaInstance.ps1` | ソース | SQL Server接続処理 |
