Windows PowerShellでログインユーザーを確認する方法|現在のユーザー名や履歴もチェック

Windows

「今このPCにログインしているユーザーは誰だろう?」
「どのアカウントでPowerShellが実行されているのか確認したい」
「過去にどのユーザーがいつログインしたかを調べたい」

Windowsでシステム管理やスクリプトを扱っていると、このような疑問を持つことがよくあります。

特に複数人で使用するPCやサーバー環境では、セキュリティ管理や障害調査において、ユーザー情報の確認は重要なチェックポイントです。

この記事では、Windows PowerShellを使って簡単に現在ログイン中のユーザーを確認する方法から、過去のログオン履歴を調べる高度な方法まで、初心者にも分かりやすく解説します。

スポンサーリンク

PowerShellとユーザー管理の基礎知識

PowerShellとは

PowerShellは、Windowsに標準で搭載されているコマンドライン シェルです。システム管理やタスクの自動化に使用され、豊富なコマンドレット(cmdlet)を提供しています。

ユーザー確認が必要な場面

以下のような場面で、ログインユーザーの確認が重要になります:

システム管理

  • サーバーへの不正ログインチェック
  • リモートワーク環境でのアクセス管理
  • 定期的なセキュリティ監査

トラブルシューティング

  • 権限エラーの原因調査
  • ファイルアクセス問題の解決
  • アプリケーション動作異常の調査

開発・テスト環境

  • 異なるユーザー権限でのテスト
  • 環境設定の確認
  • スクリプト実行ユーザーの特定

現在のログインユーザーを確認する基本方法

環境変数を使用した最もシンプルな方法

現在のユーザー名を取得

$env:USERNAME

実行結果例:

User01

この方法は最もシンプルで、現在PowerShellを実行しているユーザー名をすぐに確認できます。

ドメイン情報も含めて確認

# ドメイン名を取得
$env:USERDOMAIN

# ユーザー名とドメイン名を組み合わせて表示
"$env:USERDOMAIN\$env:USERNAME"

実行結果例:

COMPANY
COMPANY\User01

より詳細な環境変数情報

# ユーザー関連の環境変数をまとめて表示
Write-Host "ユーザー名: $env:USERNAME"
Write-Host "ドメイン: $env:USERDOMAIN"
Write-Host "ユーザープロファイル: $env:USERPROFILE"
Write-Host "コンピュータ名: $env:COMPUTERNAME"

実行結果例:

ユーザー名: User01
ドメイン: COMPANY
ユーザープロファイル: C:\Users\User01
コンピュータ名: PC-01

より高度な情報を取得する方法

現在のセッション情報を詳しく取得

# 現在のユーザーアカウント情報を取得
[System.Security.Principal.WindowsIdentity]::GetCurrent() | 
Select-Object Name, AuthenticationType, IsAuthenticated, IsGuest, IsSystem

ユーザーSIDの確認

# セキュリティ識別子(SID)を取得
$currentUser = [System.Security.Principal.WindowsIdentity]::GetCurrent()
Write-Host "ユーザー名: $($currentUser.Name)"
Write-Host "SID: $($currentUser.User.Value)"

WMI(Windows Management Instrumentation)を使用した詳細取得

Win32_ComputerSystemクラスの活用

基本的なユーザー情報取得

Get-WmiObject -Class Win32_ComputerSystem | 
Select-Object UserName, TotalPhysicalMemory, Manufacturer, Model

実行結果例:

UserName             TotalPhysicalMemory Manufacturer Model
--------             ------------------- ------------ -----
COMPANY\User01       8589934592          Dell Inc.    OptiPlex 7090

詳細なシステム情報と合わせて表示

$system = Get-WmiObject -Class Win32_ComputerSystem
$os = Get-WmiObject -Class Win32_OperatingSystem

Write-Host "現在のユーザー: $($system.UserName)"
Write-Host "コンピュータ名: $($system.Name)"
Write-Host "OS: $($os.Caption)"
Write-Host "最終起動時刻: $($os.ConvertToDateTime($os.LastBootUpTime))"

より新しいCIMコマンドレットの使用

Get-CimInstanceの活用(推奨)

# WMIの新しい方法(Windows PowerShell 3.0以降)
Get-CimInstance -ClassName Win32_ComputerSystem | 
Select-Object UserName, Domain, Manufacturer, Model, TotalPhysicalMemory

セッション情報の詳細取得

# ログオンセッション情報を取得
Get-CimInstance -ClassName Win32_LogonSession | 
Where-Object {$_.LogonType -eq 2} | 
Select-Object LogonId, LogonType, StartTime, AuthenticationPackage

最後にログオンしたユーザーの確認

レジストリからの情報取得

最終ログオンユーザーの確認

Get-ItemProperty -Path "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Authentication\LogonUI" | 
Select-Object LastLoggedOnUser, LastLoggedOnDisplayName

実行結果例:

LastLoggedOnUser          LastLoggedOnDisplayName
----------------          -----------------------
COMPANY\User01           山田 太郎

より詳細なログオン情報

$logonInfo = Get-ItemProperty -Path "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Authentication\LogonUI"

Write-Host "最後のログオンユーザー: $($logonInfo.LastLoggedOnUser)"
Write-Host "表示名: $($logonInfo.LastLoggedOnDisplayName)"

# 最後のログオン時刻(レジストリにある場合)
if ($logonInfo.PSObject.Properties.Name -contains "LastLoggedOnTime") {
    Write-Host "最後のログオン時刻: $($logonInfo.LastLoggedOnTime)"
}

現在アクティブなセッションの確認

quser コマンドとの組み合わせ

# 現在ログオン中のすべてのユーザーを表示
try {
    $sessions = quser 2>$null
    if ($sessions) {
        Write-Host "現在ログオン中のユーザー:"
        $sessions | ForEach-Object { Write-Host $_ }
    } else {
        Write-Host "quser コマンドが利用できないか、セッション情報が取得できません"
    }
} catch {
    Write-Host "セッション情報の取得中にエラーが発生しました: $($_.Exception.Message)"
}

イベントログからログオン履歴を取得

セキュリティログからのログオンイベント抽出

基本的なログオン履歴の確認

# 直近10件のログオンイベント(イベントID 4624)を取得
Get-WinEvent -FilterHashtable @{
    LogName = 'Security'
    ID = 4624
} -MaxEvents 10 | 
Select-Object TimeCreated, 
    @{Name="ユーザー名";Expression={$_.Properties[5].Value}}, 
    @{Name="ログオンタイプ";Expression={$_.Properties[8].Value}}

ログオンタイプの説明

# ログオンタイプの詳細説明を含む関数
function Get-LogonTypeDescription {
    param([int]$LogonType)
    
    switch ($LogonType) {
        2 { return "対話型ログオン(ローカル)" }
        3 { return "ネットワークログオン" }
        4 { return "バッチログオン" }
        5 { return "サービスログオン" }
        7 { return "画面ロック解除" }
        8 { return "ネットワーククリアテキスト" }
        9 { return "新しい資格情報" }
        10 { return "リモートデスクトップ" }
        11 { return "キャッシュされた資格情報" }
        default { return "不明なログオンタイプ ($LogonType)" }
    }
}

# 使用例
Get-WinEvent -FilterHashtable @{LogName='Security'; ID=4624} -MaxEvents 20 | 
ForEach-Object {
    $userName = $_.Properties[5].Value
    $logonType = $_.Properties[8].Value
    $timeCreated = $_.TimeCreated
    
    [PSCustomObject]@{
        時刻 = $timeCreated
        ユーザー名 = $userName
        ログオンタイプ = Get-LogonTypeDescription -LogonType $logonType
    }
} | Format-Table -AutoSize

特定条件でのフィルタリング

特定ユーザーのログオン履歴

# 特定ユーザーのログオン履歴を確認
$targetUser = "User01"  # 確認したいユーザー名

Get-WinEvent -FilterHashtable @{LogName='Security'; ID=4624} -MaxEvents 100 | 
Where-Object {$_.Properties[5].Value -like "*$targetUser*"} | 
Select-Object TimeCreated, 
    @{Name="ユーザー名";Expression={$_.Properties[5].Value}}, 
    @{Name="ログオンタイプ";Expression={$_.Properties[8].Value}} | 
Format-Table -AutoSize

時間範囲を指定したログオン履歴

# 過去24時間のログオン履歴
$startTime = (Get-Date).AddDays(-1)

Get-WinEvent -FilterHashtable @{
    LogName = 'Security'
    ID = 4624
    StartTime = $startTime
} | 
Select-Object TimeCreated, 
    @{Name="ユーザー名";Expression={$_.Properties[5].Value}}, 
    @{Name="ログオンタイプ";Expression={$_.Properties[8].Value}} | 
Sort-Object TimeCreated -Descending | 
Format-Table -AutoSize

実用的なスクリプト例

包括的なログイン情報確認スクリプト

基本情報をまとめて表示

function Get-UserLoginInfo {
    Write-Host "=== ログインユーザー情報 ===" -ForegroundColor Green
    
    # 現在のユーザー情報
    Write-Host "`n1. 現在のユーザー情報:" -ForegroundColor Yellow
    Write-Host "   ユーザー名: $env:USERNAME"
    Write-Host "   ドメイン: $env:USERDOMAIN"
    Write-Host "   コンピュータ名: $env:COMPUTERNAME"
    
    # システム情報からのユーザー確認
    Write-Host "`n2. システムからのユーザー情報:" -ForegroundColor Yellow
    try {
        $system = Get-CimInstance -ClassName Win32_ComputerSystem
        Write-Host "   現在のユーザー: $($system.UserName)"
        Write-Host "   ドメイン: $($system.Domain)"
    } catch {
        Write-Host "   システム情報の取得に失敗しました: $($_.Exception.Message)"
    }
    
    # 最後のログオンユーザー
    Write-Host "`n3. 最後のログオンユーザー:" -ForegroundColor Yellow
    try {
        $lastLogon = Get-ItemProperty -Path "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Authentication\LogonUI" -ErrorAction SilentlyContinue
        if ($lastLogon) {
            Write-Host "   ユーザー: $($lastLogon.LastLoggedOnUser)"
            Write-Host "   表示名: $($lastLogon.LastLoggedOnDisplayName)"
        } else {
            Write-Host "   情報を取得できませんでした"
        }
    } catch {
        Write-Host "   レジストリの読み取りに失敗しました: $($_.Exception.Message)"
    }
    
    # 直近のログオン履歴
    Write-Host "`n4. 直近のログオン履歴(5件):" -ForegroundColor Yellow
    try {
        Get-WinEvent -FilterHashtable @{LogName='Security'; ID=4624} -MaxEvents 5 -ErrorAction SilentlyContinue | 
        ForEach-Object {
            $userName = $_.Properties[5].Value
            $timeCreated = $_.TimeCreated
            Write-Host "   $timeCreated - $userName"
        }
    } catch {
        Write-Host "   ログオン履歴の取得に失敗しました(管理者権限が必要な可能性があります)"
    }
}

# 関数を実行
Get-UserLoginInfo

セキュリティ監査用スクリプト

異常なログオンパターンの検出

function Get-SecurityAudit {
    param(
        [int]$Days = 7,
        [switch]$OnlyFailures
    )
    
    $startTime = (Get-Date).AddDays(-$Days)
    
    if ($OnlyFailures) {
        # ログオン失敗イベント(4625)を確認
        $events = Get-WinEvent -FilterHashtable @{
            LogName = 'Security'
            ID = 4625
            StartTime = $startTime
        } -ErrorAction SilentlyContinue
        
        Write-Host "過去 $Days 日間のログオン失敗:" -ForegroundColor Red
    } else {
        # ログオン成功イベント(4624)を確認
        $events = Get-WinEvent -FilterHashtable @{
            LogName = 'Security'
            ID = 4624
            StartTime = $startTime
        } -ErrorAction SilentlyContinue
        
        Write-Host "過去 $Days 日間のログオン成功:" -ForegroundColor Green
    }
    
    if ($events) {
        $events | ForEach-Object {
            $userName = if ($OnlyFailures) { $_.Properties[5].Value } else { $_.Properties[5].Value }
            $logonType = if ($OnlyFailures) { $_.Properties[10].Value } else { $_.Properties[8].Value }
            
            [PSCustomObject]@{
                時刻 = $_.TimeCreated
                ユーザー名 = $userName
                ログオンタイプ = $logonType
                IPアドレス = if ($_.Properties.Count -gt 18) { $_.Properties[18].Value } else { "N/A" }
            }
        } | Group-Object ユーザー名 | ForEach-Object {
            Write-Host "  $($_.Name): $($_.Count) 回" -ForegroundColor Cyan
        }
    } else {
        Write-Host "該当するイベントが見つかりませんでした" -ForegroundColor Gray
    }
}

# 使用例
Get-SecurityAudit -Days 3
Get-SecurityAudit -Days 1 -OnlyFailures

トラブルシューティング

よくある問題と解決方法

権限不足エラー

症状: 「アクセスが拒否されました」エラーが発生

解決方法:

# PowerShellを管理者として起動し直す
Start-Process PowerShell -Verb RunAs

イベントログへのアクセス問題

症状: セキュリティログが読み取れない

確認ポイント:

# 現在のユーザーの権限を確認
whoami /priv | findstr SeSecurityPrivilege

解決方法:

  • PowerShellを管理者権限で実行
  • または、イベントログの読み取り権限を付与

古いバージョンでのコマンド非対応

症状: Get-CimInstance や Get-WinEvent が認識されない

代替方法:

# 古いPowerShellバージョンでの代替コマンド
Get-WmiObject -Class Win32_ComputerSystem
Get-EventLog -LogName Security -InstanceId 4624 -Newest 10

デバッグとログ出力

詳細なエラー情報の取得

# エラーの詳細を確認
try {
    Get-WinEvent -FilterHashtable @{LogName='Security'; ID=4624} -MaxEvents 1
} catch {
    Write-Host "エラーの詳細:" -ForegroundColor Red
    Write-Host $_.Exception.Message
    Write-Host "エラーカテゴリ: $($_.CategoryInfo.Category)"
}

セキュリティ考慮事項

監査ログの保護

ログの改ざん防止

# イベントログのプロパティを確認
Get-WinEvent -ListLog Security | 
Select-Object LogName, RecordCount, MaximumSizeInBytes, LogMode

プライバシーとデータ保護

必要最小限の情報収集

# 個人情報を含まないシステム情報の取得例
$systemInfo = @{
    ComputerName = $env:COMPUTERNAME
    CurrentUser = $env:USERNAME
    Domain = $env:USERDOMAIN
    PowerShellVersion = $PSVersionTable.PSVersion
    OS = (Get-CimInstance Win32_OperatingSystem).Caption
}

$systemInfo | ConvertTo-Json

まとめ

Windows PowerShellを使用したログインユーザーの確認は、システム管理やセキュリティ監査において非常に重要なスキルです。

主要な確認方法

目的コマンド取得情報
現在のユーザー$env:USERNAME簡潔なユーザー名
詳細なシステム情報Get-CimInstance Win32_ComputerSystemユーザー名、ドメイン、システム情報
最後のログオンユーザーレジストリ参照最終ログオンユーザーと表示名
ログオン履歴Get-WinEvent でセキュリティログ詳細なログオン履歴

活用シーン

  • 日常的なシステム管理: 現在のユーザー確認
  • セキュリティ監査: ログオン履歴の調査
  • トラブルシューティング: 権限問題の原因特定
  • コンプライアンス対応: アクセスログの収集

ベストプラクティス

  • 定期的なログオン履歴の確認
  • 異常なアクセスパターンの監視
  • 適切な権限での PowerShell 実行
  • ログ情報の適切な保管と管理

コメント

タイトルとURLをコピーしました