# 画面設計書 239-Uptime取得

## 概要

本ドキュメントは、dbatools PowerShell モジュールの `Get-DbaUptime` コマンドに関する設計書です。このコマンドは、SQL Server インスタンスとホストする Windows サーバーの稼働時間（Uptime）情報を取得し、システム安定性の監視やコンプライアンスレポートに必要なデータを提供します。

### 本画面の処理概要

**業務上の目的・背景**：システムの稼働時間を監視することは、安定性の評価、予期しない再起動の検出、コンプライアンス報告において重要です。本コマンドは、SQL Server の tempdb 作成日時から SQL Server の稼働時間を、CIM/WMI から Windows の稼働時間を取得し、両方の情報を一度に確認できるようにします。

**画面へのアクセス方法**：PowerShell コンソールまたはスクリプトから `Get-DbaUptime` コマンドを実行します。パイプライン入力として SQL Server インスタンスを受け取ることも可能です。

**主要な操作・処理内容**：
1. SQL Server インスタンスに接続
2. tempdb の CreateDate から SQL Server 起動時刻を取得
3. Resolve-DbaNetworkName でサーバー名を解決
4. Get-DbaOperatingSystem または CIM で Windows 起動時刻を取得
5. 現在時刻との差分から稼働時間を計算
6. 結果をパイプラインに出力

**画面遷移**：CLI コマンドのため画面遷移は存在しませんが、出力結果は他のコマンドにパイプライン接続可能です。

**権限による表示制御**：SQL Server への接続権限と、Windows サーバーへの WMI/CIM アクセス権限が必要です。

## 関連機能

| 機能No | 機能名 | 関連種別 | 関連する操作・処理 |
|--------|--------|----------|------------------|
| 152 | Get-DbaUptime | 主機能 | SQL Server 稼働時間の取得 |
| 90 | Connect-DbaInstance | 補助機能 | SQL Server インスタンスへの接続 |
| 123 | Get-DbaOperatingSystem | 補助機能 | OS 情報の取得 |
| 134 | Resolve-DbaNetworkName | 補助機能 | ネットワーク名の解決 |

## 画面種別

CLI コマンド（情報取得）

## URL/ルーティング

PowerShell コマンド: `Get-DbaUptime`

## 入出力項目

### 入力パラメータ

| パラメータ名 | 型 | 必須 | 説明 |
|-------------|-----|------|------|
| SqlInstance | DbaInstanceParameter[] | Yes | SQL Server インスタンス |
| SqlCredential | PSCredential | No | SQL Server 認証情報 |
| Credential | PSCredential | No | Windows 認証情報（CIM/WMI 用） |
| EnableException | switch | No | 例外を有効化 |

### 出力項目

| プロパティ名 | 型 | 説明 |
|-------------|-----|------|
| ComputerName | string | Windows サーバーコンピュータ名 |
| InstanceName | string | インスタンス名 |
| SqlServer | string | 完全な SQL Server インスタンス名 |
| SqlStartTime | DbaDateTime | SQL Server 起動時刻 |
| SqlUptime | TimeSpan | SQL Server 稼働時間 |
| SinceSqlStart | string | SQL Server 稼働時間（書式化文字列） |
| WindowsBootTime | DbaDateTime | Windows 起動時刻 |
| WindowsUptime | TimeSpan | Windows 稼働時間 |
| SinceWindowsBoot | string | Windows 稼働時間（書式化文字列） |

## 表示項目

### 稼働時間文字列の形式

`"X days Y hours Z minutes A seconds"`

例: `"5 days 12 hours 30 minutes 45 seconds"`

## イベント仕様

### 1-コマンド実行

1. SQL Server インスタンスへの接続
2. tempdb.CreateDate から SQL Server 起動時刻を取得
3. 現在時刻との差分から SQL Uptime を計算
4. Resolve-DbaNetworkName でフル修飾コンピュータ名を取得
5. Get-DbaOperatingSystem で Windows 起動時刻を取得
6. 取得失敗時は CIM DCOM 経由でリトライ
7. Windows Uptime を計算
8. 結果をパイプラインに出力

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

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

| 操作（イベント） | 対象テーブル | 操作種別 | 概要 |
|----------------|-------------|---------|------|
| 起動時刻取得 | tempdb.CreateDate | SMO プロパティ | tempdb 作成日時取得 |

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

このコマンドは読み取り専用であり、データベースの更新は行いません。

## メッセージ仕様

| 種別 | メッセージ | 条件 |
|------|----------|------|
| Verbose | "Getting start times for $servername" | 処理開始時 |
| Verbose | "Getting WinBootTime via CimInstance for $servername" | CIM 取得時 |
| Verbose | "Getting WinBootTime via CimInstance DCOM" | DCOM フォールバック時 |
| Error | "Failure" | SQL Server 接続エラー |
| Error | "Failure getting WinBootTime" | Windows 起動時刻取得エラー |

## 例外処理

| 例外条件 | 処理内容 |
|---------|---------|
| SQL Server 接続失敗 | Stop-Function で警告、次のインスタンスへ続行 |
| CIM 取得失敗 | DCOM 経由でリトライ |
| DCOM 取得失敗 | Stop-Function で警告、次のインスタンスへ続行 |

## 備考

- SQL Server の起動時刻は tempdb の CreateDate から取得（SQL Server 起動時に毎回再作成されるため）
- Windows の起動時刻は WMI/CIM の Win32_OperatingSystem.LastBootUpTime から取得
- TimeSpan オブジェクト（SqlUptime、WindowsUptime）はそのまま計算に使用可能
- 書式化文字列（SinceSqlStart、SinceWindowsBoot）はレポート用
- UTC 変換を使用して時刻計算を行う
- Credential パラメータは Windows サーバーへの CIM/WMI アクセスに使用
- Get-DbaOperatingSystem 失敗時は New-CimSession で DCOM プロトコルを使用

---

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

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

### 推奨読解順序

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

出力される PSCustomObject の構造を理解することが重要です。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | Get-DbaUptime.ps1 | `public/Get-DbaUptime.ps1` | 行127-137: 出力オブジェクト構造 |

**読解のコツ**: TimeSpan と書式化文字列の両方が出力される構造を確認する。

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

処理の起点となるファイル・関数を特定します。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | Get-DbaUptime.ps1 | `public/Get-DbaUptime.ps1` | 関数全体の構造と処理フロー |

**主要処理フロー**:
1. **行80-81**: begin ブロック - 現在時刻（UTC）を取得
2. **行96-100**: SQL Server 接続
3. **行102-105**: tempdb から起動時刻取得、Uptime 計算
4. **行107**: Resolve-DbaNetworkName でサーバー名解決
5. **行109-125**: Windows 起動時刻取得（CIM + DCOM フォールバック）
6. **行127-137**: 出力オブジェクト生成

#### Step 3: Windows 起動時刻取得ロジックを理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | Get-DbaUptime.ps1 | `public/Get-DbaUptime.ps1` | 行109-125: CIM/DCOM フォールバック処理 |

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

```
Get-DbaUptime
    │
    ├─ Connect-DbaInstance (行97)
    │      └─ SQL Server SMO 接続
    │
    ├─ $server.Databases["tempdb"].CreateDate (行103)
    │      └─ SQL Server 起動時刻取得
    │
    ├─ Resolve-DbaNetworkName (行107)
    │      └─ フル修飾コンピュータ名取得
    │
    ├─ Get-DbaOperatingSystem (行111)
    │      └─ Windows 起動時刻取得（プライマリ）
    │
    └─ New-CimSession (DCOM) (行117-119)
           └─ Windows 起動時刻取得（フォールバック）
```

### データフロー図

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

SqlInstance ───────────▶ Connect-DbaInstance ───────────▶ Server Object
                               │
                         tempdb.CreateDate ─────────────────▶ SqlStartTime
                               │
                         TimeSpan 計算 ─────────────────────▶ SqlUptime
                               │
                         書式化 ───────────────────────────▶ SinceSqlStart
                               │
Credential ────────────▶ Get-DbaOperatingSystem ────────────▶ WindowsBootTime
                         or CIM DCOM
                               │
                         TimeSpan 計算 ─────────────────────▶ WindowsUptime
                               │
                         書式化 ───────────────────────────▶ SinceWindowsBoot
                               │
                         PSCustomObject 生成 ───────────────▶ Pipeline Output
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| Get-DbaUptime.ps1 | `public/Get-DbaUptime.ps1` | ソース | メインコマンド実装 |
| Connect-DbaInstance.ps1 | `public/Connect-DbaInstance.ps1` | ソース | SQL Server 接続処理 |
| Get-DbaOperatingSystem.ps1 | `public/Get-DbaOperatingSystem.ps1` | ソース | OS 情報取得 |
| Resolve-DbaNetworkName.ps1 | `public/Resolve-DbaNetworkName.ps1` | ソース | ネットワーク名解決 |
