1

我们正在寻找一种方法来获取 SCOM (1801) 中最新的已知(扫描/收集/...)登录用户。对于 SCOM 中的每台设备,我们很快就想知道谁是最近登录的用户。即使服务器不再可用,我们也想知道在崩溃或连接丢失之前记录了谁。

我们不想要的:

  • 收集所有登录/注销事件。我们对历史不感兴趣,也不想浪费数据库中的空间。您仍然需要对事件进行计算(搜索没有注销的用户)。我们只想要没有历史记录的最新登录用户。
  • 如果有用户登录,则创建一个监视器。我们想确切地知道谁登录了(域 + 用户名)。
  • 使用属性“LoggedOnUsers”扩展计算机类,并通过发现添加此信息。这将是可能的,但是会非常频繁地发现此属性。每次更改都会启动配置重新加载,我们希望避免这种情况。如果我们可以忽略配置重新加载,这将是最好的情况。
  • 将所有用户作为对象导入 SCOM。这意味着:所有域用户;所有受信任的域用户;每个设备的所有本地用户...不可能。创建一个任务并即时获取已登录的用户。如果服务器宕机,我们仍然想知道最近登录的用户。
  • 为此使用 SCCM(配置管理器),因为它应该是实时数据(尽可能实时)。

在我看来,它应该看起来像计算机/设备类的属性,但没有历史记录或配置重新加载。或者没有预定义错误/警告/...状态的监视器,但有自定义文本状态(=登录用户)。

我们还通过 OperationsManager(DW) 数据库上的 SQL 查询在其他(自定义)应用程序中使用 SCOM 数据。如果数据在数据库中可用,使用 SQL 查询将其导出是没有问题的。如果我们在 SQL 查询中获取信息,则还可以搜索特定用户登录的设备。

该方法不应仅限于登录用户。解决方案也可以应用于其他类型的数据。

有人知道如何做到这一点吗?

4

1 回答 1

0

好的,所以,我看你已经对SCOM有很深的了解,所以如果你不介意的话,我想给你一根鱼竿,而不是鱼。

总体思路是将数据收集到文件中,将文件上传到SCOM,解析并插入到DB(推测为DW DB)。要做到这一点:

  1. 有一个 ProbeActionModuleType 工作流,它检测每次登录(由事件触发,检查计时器上的所有当前会话(https://www.codeproject.com/Articles/133372/Monitoring-of-Logon-Logout-in-Terminal-and-Client), ETC。)。
  2. 此工作流应生成一个数据文件:XML、JSON 等。
  3. 然后工作流应该输出一个属性包,如:

[InputStream(0)] public void OnNewDataItems(DataItemBase[] dataItems, bool logicalSet, DataItemAcknowledgementCallback acknowledgedCallback, object acknowledgedState, DataItemProcessingCompleteCallback completionCallback, object completionState) { if (shutdown) return; try { // collect data // Create JSON, save into temp file and upload it to SCOM var TempFolder = Environment.ExpandEnvironmentVariables("%TEMP%"); char[] pathSeparator = { '\' }; pathReportFileName = TempFolder.TrimEnd(pathSeparator) + "\" + "Report.json"; if (File.Exists(pathReportFileName)) File.Delete(pathReportFileName); File.WriteAllText(pathReportFileName, JsonConvert.SerializeObject(Results)); // return file name to upload Dictionary bagItem = new Dictionary(); bagItem.Add("DataGenerated", "OK"); bagItem.Add("ResultPath", pathReportFileName); Global.logWriteInformation("Returning patching report file at " + pathReportFileName + ".", this); ModuleHost.PostOutputDataItem(Global.CreatePropertyBag(bagItem), new DataItemAcknowledgementCallback(OnAcknowledgementCallback), pathReportFileName); } catch (Exception e) { Global.logWriteException("Failed to ...", e, this); ModuleHost.RequestNextDataItem(); return; } }

在您的回调中删除文件并请求下一步

protected void OnAcknowledgementCallback(object state)
    {
      try
      {
        Global.logWriteInformation("Patch report inventory file has been sent, deleting.", this);
        string sentFileName = (string)state;
        File.Delete(sentFileName);
      }
      catch (Exception e)
      {
        Global.logWriteException("Failed to delete patch report inventory file.", e, this);
      }
      finally
      {
        ModuleHost.RequestNextDataItem();
      }
    }
  1. 然后在您的目标(大约是 Windows 计算机)上,创建一个具有写入操作的规则<WriteAction ID="WA_UploadFile" TypeID="System!System.FileUploadWriteAction" RunAs="System!System.PrivilegedMonitoringAccount">

  2. Microsoft.SystemCenter.CollectionManagementServer创建另一个接收规则,其数据源为<DataSource ID="DS_GetFile" TypeID="System!System.FileUploadDataSource" RunAs="System!System.PrivilegedMonitoringAccount">

  3. 在接收规则中,我使用自己的 WriteActionModuleType 工作流,它解析上传的文件并将其保存到 DW DB 中(这正是您的要求)。

注意!生成文件的 ReadAction 和解析文件的 WriteAction 都必须支持确认回调,因此它们必须是托管代码,例如用 C#、F#、VB 而不是 PowerShell 编写的。

注意!发送和接收规则都必须有ConfirmDelivery="true"属性。

最好的问候马克斯 V。

于 2018-05-15T22:25:15.293 回答