如何在VB.NET中获取Windows 7当前登录用户列表?及应用卡顿排查
嘿,针对你提出的两个问题,我结合实际项目经验给你详细解答:
问题1:如何使用VB.NET获取Windows 7计算机上当前所有已登录用户的列表?
在Windows 7上,用VB.NET获取已登录用户有两种常用方案,分别适合不同场景:
方案1:获取所有类型的已登录用户(包括服务、交互式等)
这个方案通过WMI(Windows管理规范)查询系统的登录会话关联信息,能拿到所有在系统中登录的账户:
首先需要在项目中添加System.Management引用,然后用以下代码:
Imports System.Management Public Function GetAllLoggedInUsers() As List(Of String) Dim loggedInUsers As New List(Of String)() ' 查询Win32_LoggedOnUser,关联用户账户和登录会话 Dim query As New SelectQuery("SELECT * FROM Win32_LoggedOnUser") Using searcher As New ManagementObjectSearcher(query) For Each result As ManagementObject In searcher.Get() ' 提取用户账户对象 Dim userAccount As New ManagementObject(result("Antecedent").ToString()) ' 组合域名+用户名,避免重复添加 Dim fullUserName As String = $"{userAccount("Domain")}\{userAccount("Name")}" If Not loggedInUsers.Contains(fullUserName) Then loggedInUsers.Add(fullUserName) End If userAccount.Dispose() Next End Using Return loggedInUsers End Function
方案2:只获取交互式登录的用户(实际操作桌面的用户)
如果只需要拿到正在桌面操作的用户(排除服务、批量登录等系统账户),可以过滤LogonType=2(对应交互式登录):
Imports System.Management Public Function GetInteractiveLoggedInUsers() As List(Of String) Dim loggedInUsers As New List(Of String)() ' 仅查询交互式登录的用户 Dim query As New SelectQuery("SELECT * FROM Win32_LoggedOnUser WHERE LogonType = 2") Using searcher As New ManagementObjectSearcher(query) For Each result As ManagementObject In searcher.Get() Dim userAccount As New ManagementObject(result("Antecedent").ToString()) Dim fullUserName As String = $"{userAccount("Domain")}\{userAccount("Name")}" If Not loggedInUsers.Contains(fullUserName) Then loggedInUsers.Add(fullUserName) End If userAccount.Dispose() Next End Using Return loggedInUsers End Function
问题2:制造流程应用卡顿的排查与解决思路
我之前处理过类似的工业时间敏感应用,结合你的场景(Windows 7、用户登录引发卡顿、IT不能禁用账户),给你几个可落地的方向:
第一步:先定位卡顿的具体触发点
- 用**Windows性能监视器(PerfMon)**跟踪关键指标:添加
Process类的CPU使用率、内存占用,.NET CLR Memory类的GC次数/耗时,PhysicalDisk类的IO使用率。当卡顿发生时,看哪个指标出现异常峰值,就能快速锁定是GC、磁盘IO还是CPU抢占导致的。 - 用**Process Monitor(ProcMon)**记录应用的所有文件/注册表/网络操作,排查卡顿期间是否有大量IO操作(比如用户登录时系统加载用户配置、邮件客户端同步数据抢占磁盘资源)。
- 启用CLR GC日志:在应用的
app.config中添加配置,记录GC的详细信息,排查是否是Full GC导致的卡顿:<runtime> <gcConcurrent enabled="true"/> <!-- 启用并发GC,减少主线程阻塞 --> <gcServer enabled="false"/> <!-- 桌面应用用工作站GC即可 --> <gcLog enabled="true" path="gc.log"/> <!-- 生成GC日志文件 --> </runtime>
针对用户登录引发的卡顿,优化资源隔离
- 给应用设置高优先级:在代码启动初期设置进程优先级为高,让系统优先分配资源给应用。注意测试后再推广,避免影响其他系统进程:
Imports System.Diagnostics Public Sub SetAppHighPriority() Dim currentProcess As Process = Process.GetCurrentProcess() currentProcess.PriorityClass = ProcessPriorityClass.High End Sub - 和IT部门沟通,调整用户登录时的后台任务:比如组策略更新、Windows Defender扫描、邮件客户端自动同步,把这些任务的触发时间改到应用非运行时段,或者调低它们的资源占用优先级。
- 检测新用户登录事件:可以用WMI监听
Win32_SessionChangeEvent事件,当检测到新用户登录时,临时暂停应用的非核心功能(如果允许的话),等登录完成后恢复,减少资源竞争。
CLR层面的优化
- 检查内存分配:用Visual Studio的内存诊断工具找出大对象分配热点,优化对象复用(比如用对象池)、避免不必要的装箱操作,减少Full GC的频率。
- 避免UI线程阻塞:所有耗时的IO、计算任务都放到后台线程(用
Task或者BackgroundWorker),保证UI线程和时间敏感组件的响应流畅。 - 禁用不必要的CLR功能:比如在
app.config中添加<generatePublisherEvidence enabled="false"/>,减少应用启动和运行时的不必要开销。
系统层面的小调整
- 关闭Windows自动维护:在控制面板的“安全性与维护”中,把自动维护的时间调整到应用不运行的时段,避免维护时系统资源被占用。
- 禁用非必要服务:比如Superfetch、Windows Search(如果应用不需要搜索功能),这些后台服务会占用磁盘和内存资源,和IT确认后可以禁用。
- 迁移到SSD:如果应用当前安装在机械硬盘,换成SSD能大幅减少磁盘IO引发的卡顿,这是立竿见影的优化方式。
内容的提问来源于stack exchange,提问作者Peter
相关产品推荐
相关产品推荐

