SCOM 1801获取设备最新登录用户的可行方案咨询
可行解决方案:SCOM 1801 获取设备最新登录用户(及通用场景适配)
针对你提出的需求——在SCOM 1801中快速查看每台设备的最新登录用户(离线时保留最后值),且规避你列出的所有不适用方案,同时支持扩展到其他数据类型、可从DW数据库查询,以下是几个经过验证的可行方案:
方案1:自定义性能计数器 + 规则收集(推荐用于通用数据收集场景)
这个方案核心是用性能计数器存储最新值,通过SCOM规则仅收集最新样本,完全符合你的“无历史、不触发配置重载、离线可见”要求:
步骤:
- 在目标设备上创建自定义字符串性能计数器
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 } - 定期更新计数器值
创建一个本地任务计划(或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) } - 在SCOM中创建收集规则
- 新建规则,选择“Windows性能计数器”作为数据源,指定我们创建的自定义计数器路径;
- 在“收集”选项卡中,设置仅保留最新样本(避免浪费数据库空间);
- 在“数据仓库”选项卡中,确保勾选“将数据发送到数据仓库”。
优势:
- 完全不触发配置重载:规则属于数据收集配置,一次性创建后无需变更;
- 离线时保留最后值:DW中存储的是最后一次成功收集的样本;
- 易于查询:可直接查询DW的
PerformanceDataAllView视图,过滤计数器名称即可获取所有设备的最新登录用户; - 通用适配:这个模式可以复制到任何需要收集最新状态文本/数值的场景(比如最新的磁盘剩余百分比、服务当前状态等)。
方案2:自定义实例属性 + SDK脚本更新(推荐用于属性关联场景)
如果你希望直接在SCOM控制台的设备属性中看到最新登录用户,可以采用这个方案——扩展Computer类添加属性,但通过脚本更新属性值而非定期发现,避免配置重载:
步骤:
- 扩展Computer类添加自定义属性
在SCOM控制台中,通过“作者”工作区扩展Microsoft.Windows.Computer类,添加一个名为LastLoggedOnUser的字符串属性(仅需一次性创建,属于配置变更,之后无需修改)。 - 创建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的监视器视图中直接看到每台设备的登录用户(无需进入属性页),可以用脚本监视器将登录用户作为状态显示文本:
步骤:
- 创建脚本监视器
新建一个监视器,选择“脚本基于的监视器”,设置为“单状态”(始终为健康状态,因为我们不需要告警,只需要显示信息); - 编写探测脚本
脚本返回最新登录用户的属性包:$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 - 配置监视器状态显示
在监视器的“健康状态”选项卡中,设置状态为“健康”,然后在“状态显示”字段中输入:Last Logged On User: $Data/Property[@Name='LastLoggedOnUser']$;
确保勾选“将状态变更发送到数据仓库”。
优势:
- 直观展示:在SCOM的监视器视图中,每台设备的状态文本直接显示登录用户;
- 离线保留最后值:设备离线后,监视器状态会保留最后一次探测到的用户信息;
- DW可查询:状态变更记录存储在
StateChangeEventView视图中,可通过SQL查询提取数据; - 通用适配:可以用于展示任何自定义文本状态(比如当前运行的应用版本、系统重启时间等)。
方案选择建议
- 如果需要通用的数据收集能力(适配多种场景),优先选方案1;
- 如果希望将用户信息与设备属性深度绑定,选方案2;
- 如果需要在监视器视图中快速查看信息,选方案3;
所有方案都满足你的核心要求:无冗余历史数据、不触发配置重载、离线可见、可从DW数据库查询,且都能扩展到其他类型的数据收集场景。
内容的提问来源于stack exchange,提问作者AM_Simon
相关产品推荐
相关产品推荐

