# 画面設計書 246-ロケール設定

## 概要

本ドキュメントは、dbatools PowerShellモジュールの `Get-DbaLocaleSetting` コマンドに関する画面設計書です。SQL Serverホストコンピュータの Windows ロケール設定を取得する機能を提供します。

### 本画面の処理概要

`Get-DbaLocaleSetting` コマンドは、対象コンピュータのレジストリから `Control Panel\International` キーの設定値を取得し、Windowsのロケール（地域）設定情報を返却する機能を提供します。

**業務上の目的・背景**：SQL Serverの日付/時刻フォーマット、通貨表示、数値フォーマット、照合順序の動作は、Windowsのロケール設定に影響を受けます。異なるロケール設定を持つサーバー間でのデータ移行時、アプリケーションの地域固有の動作確認、SQL Serverインストール前の環境チェックなどにおいて、ロケール設定の確認は重要です。本コマンドは、複数サーバーのロケール設定を一括で取得し、環境の一貫性監査や問題診断を支援します。

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

**主要な操作・処理内容**：
1. 対象コンピュータへのCIMセッション確立
2. レジストリキー `HKEY_CURRENT_USER\Control Panel\International` の値を列挙
3. 各レジストリ値を取得してPSCustomObjectに格納
4. 結果の出力

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

**権限による表示制御**：対象コンピュータへのローカル管理者権限が必要です。CIMセッション（WSManまたはDCom）でのアクセス権限が必要です。

## 関連機能

| 機能No | 機能名 | 関連種別 | 関連する操作・処理 |
|--------|--------|----------|------------------|
| 129 | Get-DbaLocaleSetting | 主機能 | ロケール設定の取得 |
| - | Resolve-DbaNetworkName | 補助機能 | コンピュータ名の解決 |
| - | New-CimSession | 補助機能 | CIMセッションの確立 |

## 画面種別

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

## URL/ルーティング

PowerShellコマンド: `Get-DbaLocaleSetting`

## 入出力項目

### 入力パラメータ

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

## 表示項目

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

#### 標準プロパティ（常に含まれる）

| 項目名 | 型 | 説明 |
|--------|----|----|
| ComputerName | string | 対象コンピュータ名 |

#### 動的プロパティ（レジストリから取得）

以下はレジストリの `HKEY_CURRENT_USER\Control Panel\International` から動的に取得されるプロパティです：

| 項目名 | 説明 |
|--------|------|
| Locale | ロケールコード（例: "00000410"） |
| LocaleName | ロケール名（例: "it-IT"） |
| sLanguage | 言語略称（例: "ITA"） |
| sCurrency | 通貨記号（例: "€"） |
| sLongDate | 長い日付形式 |
| sShortDate | 短い日付形式 |
| sTimeFormat | 時刻形式 |
| sShortTime | 短い時刻形式 |
| sDecimal | 小数点記号 |
| sList | リスト区切り文字 |
| iDigits | 小数点以下桁数 |
| iCountry | 国/地域識別子 |
| iCurrDigits | 通貨小数桁数 |
| iCurrency | 通貨形式 |
| iDate | 日付形式 |
| iFirstDayOfWeek | 週の開始曜日 |
| iFirstWeekOfYear | 年の最初の週の定義 |
| iLZero | 先頭ゼロ表示 |
| iTime | 時刻形式（12/24時間） |
| iTLZero | 時刻先頭ゼロ |
| sAM | 午前記号 |
| sPM | 午後記号 |
| sThousand | 千単位区切り文字 |

## イベント仕様

### 1-コマンド実行

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

1. **コンピュータ名処理**: インスタンス名を分解してコンピュータ名を抽出、重複排除
2. **ネットワーク名解決**: `Resolve-DbaNetworkName` でFQDNを取得
3. **CIMセッション作成**: まずWSManで試行、失敗時はDComで再試行
4. **レジストリ値列挙**: CIM経由でStdRegProvを使用して値名を列挙
5. **レジストリ値取得**: 各値をGetSTRINGvalueで取得
6. **結果出力**: 取得した値をPSCustomObjectとして出力

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

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

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

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

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

## メッセージ仕様

| メッセージID | レベル | メッセージ内容 | 発生条件 |
|-------------|--------|--------------|----------|
| - | Verbose | Creating CIMSession on {computer} over WSMan | WSManセッション作成試行時 |
| - | Verbose | Creating CIMSession on {computer} over WSMan failed. Creating CIMSession on {computer} over DCom | WSMan失敗後DCom試行時 |
| - | Verbose | Getting properties from Registry Key | レジストリ値取得時 |
| - | Warning | Can't create CIMSession on {computer} | CIMセッション作成失敗時 |
| - | Warning | Can't connect to {computer} | ネットワーク名解決失敗時 |

## 例外処理

| 例外種別 | 発生条件 | 処理内容 |
|---------|---------|---------|
| ネットワーク名解決エラー | Resolve-DbaNetworkName失敗 | 警告メッセージ出力、次のコンピュータへ続行 |
| CIMセッション作成エラー | WSManとDCom両方失敗 | 警告メッセージ出力、次のコンピュータへ続行 |

## 備考

- HKEY_CURRENT_USER（CIMHiveCU = 2147483649）を使用
- レジストリキーパス: `Control Panel\International`
- SQL Serverインスタンス名が渡された場合、コンピュータ名部分のみを使用
- 複数のコンピュータに対して一括実行可能
- CIMセッションはWSManを優先し、失敗時にDComにフォールバック
- ローカル管理者権限が必要

---

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

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

### 推奨読解順序

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

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

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | Get-DbaLocaleSetting.ps1 | `public/Get-DbaLocaleSetting.ps1` | 34-77行目: .OUTPUTSセクションで出力プロパティ定義 |

**読解のコツ**: 出力プロパティはレジストリから動的に取得されるため、すべてのシステムで同じプロパティが存在するとは限らない点に注目。

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

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

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | Get-DbaLocaleSetting.ps1 | `public/Get-DbaLocaleSetting.ps1` | 97-104行目: パラメータ定義 |
| 2-2 | Get-DbaLocaleSetting.ps1 | `public/Get-DbaLocaleSetting.ps1` | 105-112行目: beginブロックの初期化 |
| 2-3 | Get-DbaLocaleSetting.ps1 | `public/Get-DbaLocaleSetting.ps1` | 113-141行目: processブロックのメインロジック |

**主要処理フロー**:
1. **106行目**: コンピュータ名からインスタンス部分を除去
2. **107行目**: New-CimSessionOption -Protocol DCom でDComオプション準備
3. **108-109行目**: レジストリキー名とWMI名前空間定義
4. **111行目**: CIMHiveCU (2147483649) = HKEY_CURRENT_USER
5. **116行目**: Resolve-DbaNetworkNameでFQDN取得
6. **120-123行目**: CIMセッション作成（WSMan→DCom）
7. **127行目**: Invoke-CimMethodでレジストリ値名列挙
8. **129-131行目**: 各値をGetSTRINGvalueで取得

#### Step 3: CIMメソッド呼び出しを理解する

レジストリアクセスに使用するCIMメソッドを確認します。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | Get-DbaLocaleSetting.ps1 | `public/Get-DbaLocaleSetting.ps1` | 127行目: enumvaluesメソッド |
| 3-2 | Get-DbaLocaleSetting.ps1 | `public/Get-DbaLocaleSetting.ps1` | 130行目: GetSTRINGvalueメソッド |

**主要処理フロー**:
- **127行目**: `Invoke-CimMethod -MethodName enumvalues` でレジストリキー内の値名を列挙
- **130行目**: `Invoke-CimMethod -MethodName GetSTRINGvalue` で各値を文字列として取得
- **131行目**: `$props.add($Name, $sValue)` でハッシュテーブルに追加

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

```
Get-DbaLocaleSetting
    │
    ├─ Resolve-DbaNetworkName
    │      └─ コンピュータ名からFQDNを解決
    │
    ├─ New-CimSession (WSMan)
    │      └─ 失敗時: New-CimSession (DCom)
    │
    └─ Invoke-CimMethod (StdRegProv)
           │
           ├─ enumvalues (値名列挙)
           │
           └─ GetSTRINGvalue (各値取得)
                  │
                  └─ [PSCustomObject] 出力
```

### データフロー図

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

ComputerName ───▶ Resolve-DbaNetworkName ───▶ FQDN
                            │
                            ▼
                    New-CimSession
                    (WSMan or DCom)
                            │
                            ▼
                 Invoke-CimMethod: enumvalues
                 (HKCU\Control Panel\International)
                            │
                            ▼
               foreach ($Name in $PropNames)
                            │
                            ▼
                 Invoke-CimMethod: GetSTRINGvalue
                            │
                            ▼
                    $props.add($Name, $sValue)
                            │
                            ▼
                      [PSCustomObject]$props
                      (ComputerName + レジストリ値)
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| Get-DbaLocaleSetting.ps1 | `public/Get-DbaLocaleSetting.ps1` | ソース | メインコマンド実装 |
| Resolve-DbaNetworkName.ps1 | `public/Resolve-DbaNetworkName.ps1` | ソース | ネットワーク名解決 |
