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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 09:46:41