「今この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 実行
- ログ情報の適切な保管と管理
コメント