SCOM - 查看上次登录的用户

时间:2018-05-15 14:54:52

标签: scom

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

我们不想要的:

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

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

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

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

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

1 个答案:

答案 0 :(得分:0)

好的,所以,我知道你已经对SCOM有了深入的了解,所以如果你不介意的话,我想给你一个钓竿,而不是鱼。

一般的想法是将数据收集到文件,将文件上传到SCOM,解析并插入到DB(可能的DW DB)中。要做到这一点:

  1. 有一个ProbeActionModuleType工作流,它检测每个登录(由事件触发,检查计时器(https://www.codeproject.com/Articles/133372/Monitoring-of-Logon-Logout-in-Terminal-and-Client)上的所有当前会话等)。
  2. 此工作流程应生成数据文件:XML,JSON等
  3. 然后工作流程应该输出一个属性包,如:
  4. [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. 的规则
    3. Microsoft.SystemCenter.CollectionManagementServer创建另一个数据源为<DataSource ID="DS_GetFile" TypeID="System!System.FileUploadDataSource" RunAs="System!System.PrivilegedMonitoringAccount">的接收规则

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

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

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

      祝你好运 Max V。