# 画面設計書 247-MSDTC取得

## 概要

本ドキュメントは、dbatools PowerShellモジュールの `Get-DbaMsdtc` コマンドに関する画面設計書です。Microsoft Distributed Transaction Coordinator (MSDTC) のサービス状態と設定情報を取得する機能を提供します。

### 本画面の処理概要

`Get-DbaMsdtc` コマンドは、対象サーバーのMSDTCサービスの状態およびセキュリティ設定、コンポーネント識別子（CID）情報を取得する機能を提供します。

**業務上の目的・背景**：MSDTCは、SQL Serverの分散トランザクション、リンクサーバー操作、複数サーバー/インスタンスにまたがるトランザクション処理に不可欠なサービスです。分散トランザクションの失敗、リンクサーバー接続問題、クロスデータベーストランザクションの障害をトラブルシューティングする際に、MSDTCの構成確認は最初のステップとなります。本コマンドは、サービス状態、ネットワークDTCアクセス設定、XAトランザクション設定など、診断に必要な情報を一括で取得し、問題解決を支援します。

**画面へのアクセス方法**：PowerShellコンソールまたはPowerShell ISEから `Get-DbaMsdtc` コマンドを直接実行します。ComputerNameパラメータで対象サーバーを指定します。

**主要な操作・処理内容**：
1. 対象コンピュータへの接続（PSRemotingまたはDCom）
2. CIM経由でWin32_Serviceからサービス情報取得
3. レジストリからMSDTCセキュリティ設定取得（HKLM:\Software\Microsoft\MSDTC\Security）
4. レジストリからMSDTC CID情報取得（HKCR:\CID\*\Description）
5. 結果をPSCustomObjectとして出力

**画面遷移**：CLIコマンドのため画面遷移はありません。パイプラインからコンピュータ名を受け取ることが可能です。

**権限による表示制御**：対象サーバーへのWindows管理者権限が必要です。PSRemotingまたはDCom経由でのアクセス権限が必要です。

## 関連機能

| 機能No | 機能名 | 関連種別 | 関連する操作・処理 |
|--------|--------|----------|------------------|
| 133 | Get-DbaMsdtc | 主機能 | MSDTC情報の取得 |
| - | Test-PSRemoting | 補助機能 | PSRemoting可用性確認 |
| - | Invoke-Command2 | 補助機能 | リモートコマンド実行 |
| - | Get-CimInstance | 補助機能 | CIM経由でサービス情報取得 |

## 画面種別

CLI（コマンドラインインターフェース）/ 情報取得系

## URL/ルーティング

PowerShellコマンド: `Get-DbaMsdtc`

## 入出力項目

### 入力パラメータ

| パラメータ名 | 型 | 必須 | パイプライン | 説明 |
|-------------|----|----|-------------|------|
| ComputerName | DbaInstanceParameter[] | No | Yes | 対象コンピュータ名（デフォルト: $env:COMPUTERNAME） |
| Credential | PSCredential | No | No | 代替Windows資格情報 |
| EnableException | switch | No | No | 例外を詳細表示するフラグ |

## 表示項目

### 出力オブジェクト（PSCustomObject）

| 項目名 | 型 | 説明 |
|--------|----|----|
| ComputerName | string | 対象コンピュータ名 |
| DTCServiceName | string | MSDTCサービスの表示名 |
| DTCServiceState | string | サービスの状態（Running, Stopped, Paused等） |
| DTCServiceStatus | string | サービスのステータス（OK, Degraded等） |
| DTCServiceStartMode | string | サービスの起動モード（Auto, Manual, Disabled） |
| DTCServiceAccount | string | サービス実行アカウント |
| DTCCID_MSDTC | string | MSDTCコンポーネントのCID（nullの場合あり） |
| DTCCID_MSDTCUIS | string | MSDTC UIサービスコンポーネントのCID（nullの場合あり） |
| DTCCID_MSDTCTIPGW | string | MSDTC TIPゲートウェイコンポーネントのCID（nullの場合あり） |
| DTCCID_MSDTCXATM | string | MSDTC XAトランザクションマネージャーコンポーネントのCID（nullの場合あり） |
| networkDTCAccess | bool | ネットワークDTCアクセスが有効か |
| networkDTCAccessAdmin | bool | ネットワークDTC管理アクセスが有効か |
| networkDTCAccessClients | bool | クライアントからのネットワークDTCアクセスが有効か |
| networkDTCAccessInbound | bool | 受信ネットワークDTCトランザクションが有効か |
| networkDTCAccessOutBound | bool | 送信ネットワークDTCトランザクションが有効か |
| networkDTCAccessTip | bool | TIP（Transaction Internet Protocol）アクセスが有効か |
| networkDTCAccessTransactions | bool | ネットワークDTCトランザクションが有効か |
| XATransactions | bool | XA（eXtended Architecture）トランザクションが有効か |

## イベント仕様

### 1-コマンド実行

コマンド実行時の処理フロー:

1. **接続方法判定**: Test-PSRemotingでPSRemoting可用性確認
2. **サービス情報取得**: CIM経由でWin32_Service（Name='MSDTC'）を取得
3. **セキュリティ設定取得**: Invoke-Command2でレジストリからセキュリティ設定取得
4. **CID情報取得**: Invoke-Command2でレジストリからCID情報取得
5. **結果構築**: 取得した情報をPSCustomObjectとして構築・出力

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

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

| 操作（イベント） | 対象テーブル | 操作種別 | 概要 |
|----------------|-------------|---------|------|
| コマンド実行 | - | - | データベースアクセスなし（Windowsサービス/レジストリ読み取り） |

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

本コマンドはデータベースへのアクセスを行いません。Windowsサービス情報とレジストリを読み取り対象とします。

## メッセージ仕様

| メッセージID | レベル | メッセージ内容 | 発生条件 |
|-------------|--------|--------------|----------|
| - | Verbose | Getting DTC on {computer} via WSMan | WSMan経由でサービス情報取得時 |
| - | Verbose | Getting MSDTC Security Registry Values on {computer} | セキュリティレジストリ取得時 |
| - | Verbose | Getting MSDTC CID Registry Values on {computer} | CIDレジストリ取得時 |
| - | Verbose | PSRemoting is not enabled on {computer} | PSRemoting無効時 |
| - | Verbose | Failed To get DTC via WinRM. Getting DTC on {computer} via DCom | DCom使用時 |
| - | Warning | Can't connect to CIM on {computer} via WSMan | CIM接続失敗時 |
| - | Warning | Can't connect to MSDTC Security registry on {computer} | セキュリティレジストリ取得失敗時 |
| - | Warning | Can't connect to MSDTC CID registry on {computer} | CIDレジストリ取得失敗時 |
| - | Error | Can't connect to CIM on {computer} via DCom | DCom接続失敗時 |

## 例外処理

| 例外種別 | 発生条件 | 処理内容 |
|---------|---------|---------|
| CIM接続エラー | WSManとDCom両方失敗 | Stop-Functionでエラー記録、次のコンピュータへ続行 |
| レジストリアクセスエラー | リモートレジストリアクセス失敗 | Stop-Functionでエラー記録、続行 |

## 備考

- MSDTCはSQL Serverの分散トランザクションに必須
- networkDTCAccess系の設定がFalseの場合、分散トランザクションが失敗する可能性
- XATransactionsはJavaやDB2などとの連携時に必要
- リンクサーバー接続問題の診断に有用
- PSRemoting無効時はDComにフォールバック
- MSDTC CID情報はHKEY_CLASSES_ROOTから取得

---

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

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

### 推奨読解順序

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

出力オブジェクトの構造を理解することが重要です。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | Get-DbaMsdtc.ps1 | `public/Get-DbaMsdtc.ps1` | 37-60行目: .OUTPUTSセクションで出力プロパティ定義 |
| 1-2 | Get-DbaMsdtc.ps1 | `public/Get-DbaMsdtc.ps1` | 160-179行目: 出力PSCustomObjectの構造 |

**読解のコツ**: DTCCID_*プロパティはレジストリから取得したCID情報のハッシュテーブルから展開される点に注目。

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

処理の起点となる関数の構造を確認します。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | Get-DbaMsdtc.ps1 | `public/Get-DbaMsdtc.ps1` | 83-90行目: パラメータ定義 |
| 2-2 | Get-DbaMsdtc.ps1 | `public/Get-DbaMsdtc.ps1` | 92-106行目: beginブロックのスクリプトブロック定義 |
| 2-3 | Get-DbaMsdtc.ps1 | `public/Get-DbaMsdtc.ps1` | 107-182行目: processブロックのメインロジック |

**主要処理フロー**:
1. **93行目**: WMIクエリ定義（Win32_Service WHERE Name = 'MSDTC'）
2. **94-99行目**: $dtcSecurityスクリプトブロック（レジストリセキュリティ設定取得）
3. **100-105行目**: $dtcCidsスクリプトブロック（CID情報取得）
4. **111-115行目**: Test-PSRemotingで接続方法判定
5. **119行目**: Get-CimInstanceでサービス情報取得
6. **126行目**: Invoke-Command2でセキュリティレジストリ取得
7. **135行目**: Invoke-Command2でCIDレジストリ取得

#### Step 3: レジストリアクセスロジックを理解する

MSDTCのセキュリティ設定とCID情報取得を確認します。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | Get-DbaMsdtc.ps1 | `public/Get-DbaMsdtc.ps1` | 94-99行目: $dtcSecurityスクリプトブロック |
| 3-2 | Get-DbaMsdtc.ps1 | `public/Get-DbaMsdtc.ps1` | 100-105行目: $dtcCidsスクリプトブロック |

**主要処理フロー**:
- **95-98行目**: `HKLM:\Software\Microsoft\MSDTC\Security` からセキュリティ設定取得
- **101-104行目**: HKCR:\CID\*\Description からCID情報取得（HKCR PSDriveを作成して使用）

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

```
Get-DbaMsdtc
    │
    ├─ Test-PSRemoting
    │      └─ PSRemoting可用性確認
    │
    ├─ [PSRemoting有効時]
    │      ├─ Get-CimInstance -Query "Win32_Service WHERE Name = 'MSDTC'"
    │      │
    │      ├─ Invoke-Command2 -ScriptBlock $dtcSecurity
    │      │      └─ Get-ItemProperty HKLM:\Software\Microsoft\MSDTC\Security
    │      │
    │      └─ Invoke-Command2 -ScriptBlock $dtcCids
    │             └─ Get-ItemProperty HKCR:\CID\*\Description
    │
    └─ [PSRemoting無効時]
           └─ New-CimSession -Protocol Dcom
                  └─ Get-CimInstance (サービス情報のみ)
```

### データフロー図

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

ComputerName ───▶ Test-PSRemoting
                       │
          ┌────────────┴────────────┐
          │                         │
    [PSRemoting有効]          [PSRemoting無効]
          │                         │
          ▼                         ▼
    Get-CimInstance           New-CimSession (DCom)
    (Win32_Service)                 │
          │                         └─ Get-CimInstance
          │                               │
    Invoke-Command2                       │
    ($dtcSecurity)                        │
          │                               │
    Invoke-Command2                       │
    ($dtcCids)                            │
          │                               │
          └─────────────┬─────────────────┘
                        ▼
                  PSCustomObject
          (DTCServiceName, DTCServiceState,
           networkDTCAccess, XATransactions, ...)
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| Get-DbaMsdtc.ps1 | `public/Get-DbaMsdtc.ps1` | ソース | メインコマンド実装 |
| Test-PSRemoting.ps1 | `internal/functions/Test-PSRemoting.ps1` | ソース | PSRemoting可用性確認 |
| Invoke-Command2.ps1 | `internal/functions/Invoke-Command2.ps1` | ソース | リモートコマンド実行ラッパー |
