如何合并Get-ADComputer与Get-ADUser获取计算机及最后登录用户
合并Get-ADComputer与Get-ADUser获取计算机及最后登录用户信息
方法一:利用AD计算机对象内置属性(非实时批量查询)
这种方法直接从AD数据库读取计算机记录的最后登录用户,无需目标计算机在线,查询速度快,但数据时效性受AD复制周期限制。
示例脚本:
Get-ADComputer -Filter 'Name -like "Nany-*"' -Properties CN, IPv4Address, LastLoggedOnUser | ForEach-Object { # 初始化用户信息默认值 $userName = "无记录" $samAccount = "无记录" # 若存在最后登录用户的LDAP识别名,查询用户详情 if ($null -ne $_.LastLoggedOnUser) { try { $adUser = Get-ADUser -Identity $_.LastLoggedOnUser -Properties Name, SamAccountName -ErrorAction Stop $userName = $adUser.Name $samAccount = $adUser.SamAccountName } catch { $userName = "用户查询失败:$($_.Exception.Message)" } } # 合并计算机与用户信息输出 [PSCustomObject]@{ 计算机名称 = $_.CN IPv4地址 = $_.IPv4Address 最后登录用户名 = $userName 用户Sam账号 = $samAccount } } | Export-CSV "C:\Computers&Users.csv" -NoTypeInformation -Encoding UTF8
关键说明:
- 在
Get-ADComputer中添加LastLoggedOnUser属性,该字段存储最后登录用户的LDAP识别名(DN)。 - 通过
Get-ADUser根据DN拉取用户姓名、Sam账号等信息,同时处理查询失败的异常场景。 - 加入
-Encoding UTF8确保CSV文件中文内容显示正常。
方法二:查询远程计算机事件日志(实时数据)
如果需要获取最新的最后登录用户,可以查询目标计算机的安全日志(事件ID 4624,交互式登录事件),但要求目标计算机在线且你拥有读取远程安全日志的权限。
示例脚本:
Get-ADComputer -Filter 'Name -like "Nany-*"' -Properties CN, IPv4Address | ForEach-Object { $computerName = $_.CN $ipv4 = $_.IPv4Address $lastLoggedUser = "无记录/无法查询" try { # 查询最近1条交互式登录事件(登录类型2代表本地/远程桌面交互式登录) $logonEvent = Get-WinEvent -ComputerName $computerName -FilterHashtable @{ LogName = 'Security' ID = 4624 Data = '2' } -MaxEvents 1 -ErrorAction Stop if ($logonEvent) { # 从事件属性中提取用户名(第6个属性值,索引从0开始) $lastLoggedUser = $logonEvent.Properties[5].Value } } catch { $lastLoggedUser = "查询失败:$($_.Exception.Message)" } [PSCustomObject]@{ 计算机名称 = $computerName IPv4地址 = $ipv4 最后登录用户 = $lastLoggedUser } } | Export-CSV "C:\Computers&Users.csv" -NoTypeInformation -Encoding UTF8
关键说明:
- 登录类型
2对应交互式登录,若需包含其他登录场景(如服务登录),可移除Data = '2'条件。 - 若目标计算机离线或权限不足,会捕获异常并记录具体错误信息。
内容的提问来源于stack exchange,提问作者Clay
相关产品推荐
相关产品推荐

