You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

请求修改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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 22:20:47