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

SCOM 1801获取设备最新登录用户的可行方案咨询

可行解决方案:SCOM 1801 获取设备最新登录用户(及通用场景适配)

针对你提出的需求——在SCOM 1801中快速查看每台设备的最新登录用户(离线时保留最后值),且规避你列出的所有不适用方案,同时支持扩展到其他数据类型、可从DW数据库查询,以下是几个经过验证的可行方案:

方案1:自定义性能计数器 + 规则收集(推荐用于通用数据收集场景)

这个方案核心是用性能计数器存储最新值,通过SCOM规则仅收集最新样本,完全符合你的“无历史、不触发配置重载、离线可见”要求:

步骤:

  1. 在目标设备上创建自定义字符串性能计数器
    Windows性能计数器支持字符串类型,我们可以创建一个专门用来存储最新登录用户的计数器。用PowerShell脚本批量部署到所有目标设备:
    $counterCategory = "Custom Device Metrics"
    $counterName = "Last Logged On User"
    # 检查计数器类别是否存在,不存在则创建
    if (-not (Get-Counter -Counter "\$counterCategory\$counterName" -ErrorAction SilentlyContinue)) {
        New-CounterCategory -Name $counterCategory -CategoryType SingleInstance `
            -CounterNames $counterName -CounterTypes ([System.Diagnostics.PerformanceCounterType]::String) `
            -ErrorAction Stop
    }
    
  2. 定期更新计数器值
    创建一个本地任务计划(或SCOM代理任务),定期运行脚本获取最新交互式登录用户并更新计数器:
    $counterCategory = "Custom Device Metrics"
    $counterName = "Last Logged On User"
    # 获取最新交互式登录用户(过滤掉系统账户、服务账户)
    $lastUser = Get-WmiObject Win32_LoggedOnUser | ForEach-Object {
        $userObj = [WMI]$_.Antecedent
        # 仅保留交互式登录的用户(排除服务、系统账户)
        if ($userObj.Domain -ne "NT AUTHORITY" -and $userObj.Name -notin @("SYSTEM", "LOCAL SERVICE", "NETWORK SERVICE")) {
            "$($userObj.Domain)\$($userObj.Name)"
        }
    } | Sort-Object -Unique | Select-Object -Last 1
    # 更新计数器
    if ($lastUser) {
        $counter = New-Object System.Diagnostics.PerformanceCounter($counterCategory, $counterName, $false)
        # 将字符串转换为计数器支持的Int64值
        $bytes = [System.Text.Encoding]::Unicode.GetBytes($lastUser.PadRight(16)) # 字符串最大长度可调整
        $counter.RawValue = [System.BitConverter]::ToInt64($bytes, 0)
    }
    
  3. 在SCOM中创建收集规则
    • 新建规则,选择“Windows性能计数器”作为数据源,指定我们创建的自定义计数器路径;
    • 在“收集”选项卡中,设置仅保留最新样本(避免浪费数据库空间);
    • 在“数据仓库”选项卡中,确保勾选“将数据发送到数据仓库”。

优势:

  • 完全不触发配置重载:规则属于数据收集配置,一次性创建后无需变更;
  • 离线时保留最后值:DW中存储的是最后一次成功收集的样本;
  • 易于查询:可直接查询DW的PerformanceDataAllView视图,过滤计数器名称即可获取所有设备的最新登录用户;
  • 通用适配:这个模式可以复制到任何需要收集最新状态文本/数值的场景(比如最新的磁盘剩余百分比、服务当前状态等)。

方案2:自定义实例属性 + SDK脚本更新(推荐用于属性关联场景)

如果你希望直接在SCOM控制台的设备属性中看到最新登录用户,可以采用这个方案——扩展Computer类添加属性,但通过脚本更新属性值而非定期发现,避免配置重载:

步骤:

  1. 扩展Computer类添加自定义属性
    在SCOM控制台中,通过“作者”工作区扩展Microsoft.Windows.Computer类,添加一个名为LastLoggedOnUser的字符串属性(仅需一次性创建,属于配置变更,之后无需修改)。
  2. 创建SCOM规则运行更新脚本
    新建一个规则,定期运行PowerShell脚本,通过SCOM SDK更新当前设备的LastLoggedOnUser属性值:
    param($ManagementServer)
    # 获取最新登录用户
    $lastUser = Get-WmiObject Win32_LoggedOnUser | ForEach-Object {
        $userObj = [WMI]$_.Antecedent
        if ($userObj.Domain -ne "NT AUTHORITY" -and $userObj.Name -notin @("SYSTEM", "LOCAL SERVICE", "NETWORK SERVICE")) {
            "$($userObj.Domain)\$($userObj.Name)"
        }
    } | Sort-Object -Unique | Select-Object -Last 1
    # 连接SCOM管理组并更新属性
    if ($lastUser -and $ManagementServer) {
        $mgmtGroup = New-Object Microsoft.EnterpriseManagement.ManagementGroup($ManagementServer)
        $computerClass = $mgmtGroup.EntityTypes.GetClasses() | Where-Object { $_.Name -eq "Microsoft.Windows.Computer" }
        $computerInstance = $mgmtGroup.EntityObjects.GetObjectReader($computerClass) | Where-Object { $_.DisplayName -eq $env:COMPUTERNAME }
        if ($computerInstance) {
            $computerInstance["LastLoggedOnUser"].Value = $lastUser
            $computerInstance.Update()
        }
    }
    
    • 规则的运行账户需要有SCOM实例属性更新权限(建议用SCOM管理员账户或自定义角色);
    • 设置规则的运行频率(比如5分钟一次,按需调整)。

优势:

  • 属性直接关联设备:在控制台查看设备属性时就能看到最新登录用户;
  • 无配置重载:仅初始扩展类是配置变更,后续属性更新属于实例数据变更,不会触发管理组配置重载;
  • DW可查询:属性值会同步到DW的ManagedEntityPropertyView视图,方便导出到自定义应用;
  • 通用适配:同样可以用于更新其他设备属性(比如设备的最新补丁状态、硬件型号等)。

方案3:自定义脚本监视器(推荐用于状态视图展示场景)

如果你希望在SCOM的监视器视图中直接看到每台设备的登录用户(无需进入属性页),可以用脚本监视器将登录用户作为状态显示文本:

步骤:

  1. 创建脚本监视器
    新建一个监视器,选择“脚本基于的监视器”,设置为“单状态”(始终为健康状态,因为我们不需要告警,只需要显示信息);
  2. 编写探测脚本
    脚本返回最新登录用户的属性包:
    $api = New-Object -ComObject MOM.ScriptAPI
    $bag = $api.CreatePropertyBag()
    # 获取最新登录用户
    $lastUser = Get-WmiObject Win32_LoggedOnUser | ForEach-Object {
        $userObj = [WMI]$_.Antecedent
        if ($userObj.Domain -ne "NT AUTHORITY" -and $userObj.Name -notin @("SYSTEM", "LOCAL SERVICE", "NETWORK SERVICE")) {
            "$($userObj.Domain)\$($userObj.Name)"
        }
    } | Sort-Object -Unique | Select-Object -Last 1
    $bag.AddValue("LastLoggedOnUser", $lastUser ?? "No active user")
    $bag
    
  3. 配置监视器状态显示
    在监视器的“健康状态”选项卡中,设置状态为“健康”,然后在“状态显示”字段中输入:Last Logged On User: $Data/Property[@Name='LastLoggedOnUser']$;
    确保勾选“将状态变更发送到数据仓库”。

优势:

  • 直观展示:在SCOM的监视器视图中,每台设备的状态文本直接显示登录用户;
  • 离线保留最后值:设备离线后,监视器状态会保留最后一次探测到的用户信息;
  • DW可查询:状态变更记录存储在StateChangeEventView视图中,可通过SQL查询提取数据;
  • 通用适配:可以用于展示任何自定义文本状态(比如当前运行的应用版本、系统重启时间等)。

方案选择建议

  • 如果需要通用的数据收集能力(适配多种场景),优先选方案1;
  • 如果希望将用户信息与设备属性深度绑定,选方案2;
  • 如果需要在监视器视图中快速查看信息,选方案3;

所有方案都满足你的核心要求:无冗余历史数据、不触发配置重载、离线可见、可从DW数据库查询,且都能扩展到其他类型的数据收集场景。

内容的提问来源于stack exchange,提问作者AM_Simon

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 10:08:26