如何修改PowerShell脚本,用计算机名替代IP显示锁定文件信息?
解决Get-SmbOpenFile输出IP转计算机名并整合到管道的方案
直接用以下PowerShell脚本即可实现IP到计算机名的解析,并整合到原有管道流程中,同时处理解析失败的情况:
Get-SmbOpenFile | ForEach-Object { # 尝试将客户端IP解析为计算机名 try { $resolvedName = [System.Net.Dns]::GetHostEntry($_.ClientComputerName).HostName # 若解析结果为FQDN,仅提取主机名部分 if ($resolvedName -match '^([^.]+)\.') { $resolvedName = $matches[1] } } catch { # 解析失败时保留原IP,并输出警告信息 $resolvedName = $_.ClientComputerName Write-Warning "无法解析IP $($_.ClientComputerName) 的计算机名:$_" } # 输出包含解析后计算机名的自定义对象 [PSCustomObject]@{ 锁定文件路径 = $_.Path 操作用户名 = $_.ClientUserName 客户端计算机 = $resolvedName 文件打开时间 = $_.OpenTime 会话ID = $_.SessionId } } | Export-Csv -Path "C:\FileLocks\LockedFiles_$(Get-Date -Format 'yyyyMMdd_HHmmss').csv" -NoTypeInformation -Encoding UTF8
关键逻辑说明
- 通过
ForEach-Object遍历每个SMB打开文件对象,对ClientComputerName字段(即客户端IP)执行DNS解析 - 用
try/catch块捕获解析失败的异常(比如客户端未注册DNS、网络不通),避免脚本中断,同时保留原IP作为 fallback - 对解析出的完全限定域名(FQDN)进行截取,只保留主机名,更符合员工查看习惯
- 自定义输出对象保留核心信息,最后导出为带时间戳的CSV文件,方便员工随时查看
定时执行设置
要实现每5分钟自动生成列表,可通过Windows任务计划程序配置:
- 创建新任务,触发器选择「按计划」,设置为每5分钟执行一次
- 操作选择「启动程序」,程序路径填
powershell.exe,参数填-ExecutionPolicy Bypass -File "你的脚本完整路径.ps1" - 任务运行账号需具备访问SMB文件锁定信息的权限(如域管理员或文件服务器本地管理员)
实时查看优化
如果需要员工实时查看锁定列表,可将脚本最后一行的导出CSV改为:
| Out-GridView -Title "当前文件锁定状态"
这样会弹出可视化窗口,直接展示所有锁定文件及对应的客户端信息
内容的提问来源于stack exchange,提问作者Alex
相关产品推荐
相关产品推荐

