SCOM - Просмотр последних зарегистрированных пользователей - PullRequest
0 голосов
/ 15 мая 2018

Мы ищем способ получения последних известных (отсканированных / собранных / ...) зарегистрированных пользователей в SCOM (1801). Для каждого устройства в SCOM мы быстро хотим узнать, кто был последним вошедшим в систему пользователем. Даже если сервер больше не доступен, мы хотим знать, кто был зарегистрирован непосредственно перед сбоем или потерей соединения.

Чего мы не хотим:

  • Собрать все события входа / выхода. Мы не интересуемся историей и не хотим тратить пространство в базе данных. Вы все еще должны сделать расчет по событию (поиск пользователей без выхода из системы). Мы хотим, чтобы только последние пользователи вошли в систему без истории.
  • Создать монитор, если в систему вошли пользователи. Мы хотим знать кто именно вошел в систему (домен + имя пользователя).
  • Расширьте класс Computer со свойством LoggedOnUsers и добавьте эта информация с открытием. Это было бы возможно, но это собственность будет обнаруживаться очень часто. Каждое изменение будет запустить перезагрузку конфигурации, и мы хотим избежать этого. Если бы мы могли игнорируйте перезагрузку конфигурации, это будет лучший сценарий.
  • Импортировать всех пользователей как объекты в SCOM. Это будет означать: весь домен пользователь; все доверенные пользователи домена; все локальные пользователи каждого устройства ... Невозможно. Создать задачу и получить зарегистрированных пользователей на лету. Если сервер не работает, мы все еще хотим знать последние вошли в систему пользователей.
  • Используйте для этого SCCM (Configuration Manager), потому что он должен быть активным данные (максимально живые).

По моему мнению, это должно выглядеть как свойство класса компьютера / устройства, но без перезагрузки истории или конфигурации. Или монитор без заранее определенного состояния ошибки / предупреждения / ..., но с пользовательским текстовым состоянием (= вошедшие в систему пользователи).

Мы также используем данные SCOM в других (пользовательских) приложениях через SQL-запросы к базам данных OperationsManager (DW). Если данные доступны в базе данных, их экспорт с помощью SQL-запроса не составляет проблем. Если мы получим информацию в запросе SQL, можно будет также выполнить поиск устройств, на которых зарегистрирован конкретный пользователь.

Метод не должен ограничиваться только зарегистрированными пользователями. Решение может также применяться к другим видам данных.

У кого-нибудь есть идеи, как это сделать?

1 Ответ

0 голосов
/ 16 мая 2018

Хорошо, я вижу, у вас уже есть глубокие знания о SCOM, поэтому, если вы не возражаете, я бы хотел дать вам удочку, а не рыбу.

Общая идея состоит в том, чтобы собирать данные в файл, загружать файл в SCOM, анализировать и вставлять в БД (предположительно, БД DW). Для этого:

  1. Наличие рабочего процесса ProbeActionModuleType, который обнаруживает каждый вход в систему (инициируется событием, проверяет все текущие сеансы по таймеру (https://www.codeproject.com/Articles/133372/Monitoring-of-Logon-Logout-in-Terminal-and-Client), и т. Д.).
  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 Computer или около того) создайте правило с действием записи <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 (что в точности соответствует вашим требованиям).

NB! И ReadAction, который создает файл, и WriteAction, который анализирует файл, должны поддерживать обратные вызовы подтверждения, поэтому они ДОЛЖНЫ быть управляемым кодом, т.е. написано на C #, F #, VB, но НЕ в PowerShell.

NB! Правила отправки и получения ДОЛЖНЫ иметь атрибут ConfirmDelivery="true".

С наилучшими пожеланиями Макс V.

...