请求修改PowerShell脚本:添加用户LastLogonDate查询功能
修改后的PowerShell脚本(含LastLogonDate显示)
以下是添加了用户对应计算机最后登录时间功能的完整脚本,同时优化了原脚本的稳定性和错误处理:
#Set variables $progress = 0 #Get Admin Credentials Function Get-Login { Clear-Host Write-Host "请提供管理员凭据(例如 DOMAIN\admin.user 和密码)" $Global:Credential = Get-Credential } Get-Login #Get Username to search for Function Get-Username { Clear-Host $Global:Username = Read-Host "输入要查询的用户名" if ([string]::IsNullOrWhiteSpace($Username)){ Write-Host "用户名不能为空,请重新输入!" Get-Username } try { $UserCheck = Get-ADUser $Username -ErrorAction Stop } catch { Write-Host "无效用户名,请确认这是账户的登录ID!" Get-Username } } Get-Username #Get Computername Prefix for large environments Function Get-Prefix { Clear-Host $Global:Prefix = Read-Host "输入要查询的计算机名前缀(例如 CXX*,用*作为通配符,输入*查询所有计算机)" Clear-Host } Get-Prefix #Start search $computers = Get-ADComputer -Filter {Enabled -eq 'true' -and SamAccountName -like $Prefix} $CompCount = $Computers.Count Write-Host "正在查询 $Username 在 $Prefix 前缀的 $CompCount 台计算机上的登录信息`n" #Start main foreach loop, search processes on all computers foreach ($comp in $computers){ $Computer = $comp.Name $Reply = $null $Reply = Test-Connection $Computer -Count 1 -Quiet -ErrorAction SilentlyContinue if($Reply -eq $true){ try { # 使用现代CIM命令替代旧WMI命令 if($Computer -eq $env:COMPUTERNAME){ $proc = Get-CimInstance Win32_Process -ComputerName $Computer -Filter "Name = 'explorer.exe'" -ErrorAction Stop } else{ $proc = Get-CimInstance Win32_Process -ComputerName $Computer -Credential $Credential -Filter "Name = 'explorer.exe'" -ErrorAction Stop } } catch { Write-Host "无法检查 $Computer:$($_.Exception.Message)" continue } if(-not $proc){ Write-Host "未在 $Computer 上找到explorer.exe进程!" } else{ $progress++ foreach ($p in $proc) { $temp = ($p.GetOwner()).User Write-Progress -Activity "查询中..." -Status "已检查 $progress / $CompCount 台计算机" -PercentComplete (($progress/$Computers.Count)*100) if ($temp -eq $Username){ # 查询用户在该计算机的最后登录时间 try { if($Computer -eq $env:COMPUTERNAME){ $loginProfile = Get-CimInstance Win32_NetworkLoginProfile -ComputerName $Computer -Filter "UserName = '$Username'" -ErrorAction Stop } else{ $loginProfile = Get-CimInstance Win32_NetworkLoginProfile -ComputerName $Computer -Credential $Credential -Filter "UserName = '$Username'" -ErrorAction Stop } # 转换WMI时间格式为易读的DateTime $lastLogon = if($loginProfile.LastLogon) { [Management.ManagementDateTimeConverter]::ToDateTime($loginProfile.LastLogon) } else { "无记录" } Write-Host "$Username 已登录 $Computer,最后登录时间:$lastLogon" } catch { Write-Host "$Username 已登录 $Computer,但无法获取最后登录时间:$($_.Exception.Message)" } } } } } else { Write-Host "$Computer 无法连接!" } } Write-Host "查询完成!"
核心修改说明
- 新增LastLogonDate查询:通过
Win32_NetworkLoginProfile类远程获取用户在目标计算机的最后登录记录,并将WMI原生时间格式转换为常规DateTime格式。 - 替换旧命令:将
gwmi(已过时的WMI命令)替换为Get-CimInstance,提升兼容性和稳定性。 - 强化错误处理:添加
try/catch捕获查询异常,避免脚本中断,并给出明确的错误提示。 - 优化空值判断:使用
[string]::IsNullOrWhiteSpace覆盖空白字符的情况,避免误判。 - 完善状态提示:补充无法连接的计算机提示,让查询过程更透明。
内容的提问来源于stack exchange,提问作者Anxo Alonso
相关产品推荐
相关产品推荐

