AKA: Microsoft.Windows.TimedScript.DiscoveryProvider
If you are following these VSAE Fragment posts in order, you’ll see they are tied together in the same example management pack. This fragment demonstrates the timed script discovery provider, and discovers the application component class discussed in the previous post.
What does it do?
This discovery uses a script to read a local csv file (c:\ScomSkills.csv). The file is expected to have two entries, separated by a comma. Doesn’t matter what the entries are, as they will simply be discovered as class properties.
One thing I’d like to callout here is the discovery of Entity\DisplayName, highlighted below. It is important to discover PrincipalName or NetbiosName for Entity\DisplayName, because this is what the source will be when monitors targeting this class generate an alert. Ever see an alert generated by "c:" or "Windows Server 2008"? Not very useful while looking at a long list of alerts in the console, and doesn’t help much if you have other processes that are expecting computer name values for source. This is also discussed here.
<ManagementPackFragment SchemaVersion="2.0" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <Monitoring> <Discoveries> <Discovery ID="SCOMskills.Demo.TimedScript.Discovery" ConfirmDelivery="false" Enabled="true" Priority="Normal" Remotable="true" Target="SCOMskills.Demo.LocalApplication.Class"> <Category>Discovery</Category> <DiscoveryTypes> <DiscoveryClass TypeID="SCOMskills.Demo.ApplicationComponent.Class"> <Property TypeID="SCOMskills.Demo.ApplicationComponent.Class" PropertyID="CsvField1"/> <Property TypeID="SCOMskills.Demo.ApplicationComponent.Class" PropertyID="CsvField2"/> <Property TypeID="System!System.Entity" PropertyID="DisplayName"/> </DiscoveryClass> </DiscoveryTypes> <DataSource ID="DS" TypeID="Windows!Microsoft.Windows.TimedScript.DiscoveryProvider"> <IntervalSeconds>60</IntervalSeconds> <SyncTime/> <ScriptName>SCOMskills.Demo.Discovery.vbs</ScriptName> <Arguments>$MPElement$ $Target/Id$ $Target/Host/Property[Type="Windows!Microsoft.Windows.Computer"]/PrincipalName$ c:\ScomSkillsDemo.csv</Arguments> <ScriptBody> <![CDATA[ Option Explicit Dim oArgs Set oArgs = WScript.Arguments if oArgs.Count < 4 Then Wscript.Quit -1 End If Dim SourceID, ManagedEntityId, TargetComputer, SourceFile SourceId = oArgs(0) ManagedEntityId = oArgs(1) TargetComputer = oArgs(2) SourceFile = oArgs(3) Dim oAPI, oDiscoveryData, oInst Set oAPI = CreateObject("MOM.ScriptAPI") set oDiscoveryData = oAPI.CreateDiscoveryData(0, SourceId, ManagedEntityId) Dim oFso, oFile, aField Set oFso = CreateObject("Scripting.FileSystemObject") If (oFso.FileExists(SourceFile)) Then Set oFile = oFso.OpenTextFile(SourceFile) aField = split(oFile.ReadLine,",") set oInst = oDiscoveryData.CreateClassInstance("$MPElement[Name='SCOMskills.Demo.ApplicationComponent.Class']$") call oInst.AddProperty("$MPElement[Name='Windows!Microsoft.Windows.Computer']/PrincipalName$", TargetComputer) call oInst.AddProperty("$MPElement[Name='SCOMskills.Demo.ApplicationComponent.Class']/CsvField1$", aField(0)) call oInst.AddProperty("$MPElement[Name='SCOMskills.Demo.ApplicationComponent.Class']/CsvField2$", aField(1)) call oInst.AddProperty("$MPElement[Name='System!System.Entity']/DisplayName$", TargetComputer) call oDiscoveryData.AddInstance(oInst) Else Wscript.Quit -1 End If Call oAPI.Return(oDiscoveryData) ]]> </ScriptBody> <TimeoutSeconds>30</TimeoutSeconds> </DataSource> </Discovery> </Discoveries> </Monitoring> <LanguagePacks> <LanguagePack ID="ENU" IsDefault="true"> <DisplayStrings> <DisplayString ElementID="SCOMskills.Demo.TimedScript.Discovery"> <Name>SCOMskills Timed Script Discovery</Name> </DisplayString> </DisplayStrings> </LanguagePack> </LanguagePacks> </ManagementPackFragment>
One thought on “Timed Script Discovery (vbscript)”