Хорошо, я вижу, у вас уже есть глубокие знания о SCOM, поэтому, если вы не возражаете, я бы хотел дать вам удочку, а не рыбу.
Общая идея состоит в том, чтобы собирать данные в файл, загружать файл в SCOM, анализировать и вставлять в БД (предположительно, БД DW). Для этого:
- Наличие рабочего процесса ProbeActionModuleType, который обнаруживает каждый вход в систему (инициируется событием, проверяет все текущие сеансы по таймеру (https://www.codeproject.com/Articles/133372/Monitoring-of-Logon-Logout-in-Terminal-and-Client), и т. Д.).
- Этот рабочий процесс должен генерировать файл данных: XML, JSON и т. Д.
- Тогда рабочий процесс должен выводить пакет свойств, например:
[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();
}
}
Затем на вашей цели (то есть Windows Computer или около того) создайте правило с действием записи <WriteAction ID="WA_UploadFile" TypeID="System!System.FileUploadWriteAction" RunAs="System!System.PrivilegedMonitoringAccount">
При Microsoft.SystemCenter.CollectionManagementServer
создайте еще одно правило получения с источником данных <DataSource ID="DS_GetFile" TypeID="System!System.FileUploadDataSource" RunAs="System!System.PrivilegedMonitoringAccount">
В правиле получения я использую свой собственный рабочий процесс WriteActionModuleType, который анализирует загруженный файл и сохраняет его в DW DB (что в точности соответствует вашим требованиям).
NB! И ReadAction, который создает файл, и WriteAction, который анализирует файл, должны поддерживать обратные вызовы подтверждения, поэтому они ДОЛЖНЫ быть управляемым кодом, т.е. написано на C #, F #, VB, но НЕ в PowerShell.
NB! Правила отправки и получения ДОЛЖНЫ иметь атрибут ConfirmDelivery="true"
.
С наилучшими пожеланиями
Макс V.