好的,所以,我看你已经对SCOM有很深的了解,所以如果你不介意的话,我想给你一根鱼竿,而不是鱼。
总体思路是将数据收集到文件中,将文件上传到SCOM,解析并插入到DB(推测为DW DB)。要做到这一点:
- 有一个 ProbeActionModuleType 工作流,它检测每次登录(由事件触发,检查计时器上的所有当前会话(https://www.codeproject.com/Articles/133372/Monitoring-of-Logon-Logout-in-Terminal-and-Client), ETC。)。
- 此工作流应生成一个数据文件: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 计算机)上,创建一个具有写入操作的规则<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 中(这正是您的要求)。
注意!生成文件的 ReadAction 和解析文件的 WriteAction 都必须支持确认回调,因此它们必须是托管代码,例如用 C#、F#、VB 而不是 PowerShell 编写的。
注意!发送和接收规则都必须有ConfirmDelivery="true"
属性。
最好的问候马克斯 V。