@echo off
set psscript=DiscoverService.ps1
set vbscript=DiscoverService.vbs
set cscript=%windir%\system32\cscript.exe
set ps=%windir%\system32\WindowsPowerShell\v1.0\powershell.exe
set params=
if Exist "%cscript%" goto vb
if Exist "%ps%" goto pshell
goto end
:vb
if not exist "%~dp0%vbscript%" goto end
if exist "%~dp0vbparams.txt" (
set /p params=<"%~dp0vbparams.txt"
)
"%cscript%" /nologo "%~dp0%vbscript%" %params%
goto end
:pshell
if not exist "%~dp0%psscript%" goto end
if exist "%~dp0psparams.txt" (
set /p params=<"%~dp0psparams.txt"
)
"%ps%" -nologo -EP bypass -command "& '%~dp0%psscript%'" %params%
goto end
Function Init-ScomHelper
{
$DiscHelper = @'
namespace SCOM.Helper
{
using System;
using System.Runtime.InteropServices;
public class ConvertData
{
public static string GetDataItemFromOutput(
Object oData)
{
NativeMethods.ISerialize discoverySerializer = null;
discoverySerializer = oData as NativeMethods.ISerialize;
string xmlString = null;
if (null != discoverySerializer)
{
int hr = discoverySerializer.SaveToString(out xmlString);
Marshal.ThrowExceptionForHR(hr);
}
return xmlString;
}
public static class NativeMethods
{
[Guid("A4E79E8A-9494-47A4-A280-8C7D35C88A2F"),
InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
public interface ISerialize
{
int SaveToString([MarshalAs(UnmanagedType.BStr)] out string output);
int LoadFromString([MarshalAs(UnmanagedType.BStr)] string input);
}
}
}
}
Windows DNS Server Discovery
SourceId: {0} ManagedEntityId : {1} Target ComputerId : {2} IsVirtual : {3}
"@
$StartDiscoveryMsg = "Started DNS Server discovery at machine local time:"
$FinishDiscoveryMsg = "Finished dicovery at machine local time: "
$CreateDiscoveryDataErrorMsg = "Failed to get Discovery Data Object. MOM v3 must be installed to execute this script."
$InitApiErrorMsg = "Failed to get Discovery API. MOM v3 must be installed to execute this script. Error:{0}"
$InitScomSerApiErrorMsg = "Failed to Initialize SCOM Discovery Serialization API. MOM v3 must be installed to execute this script."
$ErrorStartParametersMsg = "Minimal list of parameters is empty. Exiting discovery. SourceId: {0} ManagedEntityId : {1} Target ComputerId : {2} "
function Get-EmptyDiscoveryData($SourceId, $ManagedEntityId,$IsSnapshot)
{
$ErrorActionPreference = 'SilentlyContinue' # Scoped only to function
$Error.Clear()
if ($null -eq $oAPI)
{
$oAPI = New-Object -ComObject "MOM.ScriptAPI"
if ($null -eq $oAPI)
{
return $null
}
}
Function Log-DiscoveryMessage([string]$message)
{
$ErrorActionPreference = 'SilentlyContinue' # Scoped only to function
$timex=get-date -displayhint time
$message = $message +" " + $timex
LogMessage $DBG_TRACE $message
}
#======================================================================
# Method: LogMessage
# Description: Log a debug message to ScriptContext
# Parameters:
# nLevel - Debug level for the message that
# we're logging.
# strMessage - The message to write to the trace.
#======================================================================
Function LogMessage($nLevel, $strMessage,$LogId = $EventId)
{
$ErrorActionPreference = 'SilentlyContinue' # Scoped only to function
#==========================================================================
# Initialize the arguments in Script
#==========================================================================
Function Initialize-DiscoveryScript
(
[ref]$oAPI
)
{
$ErrorActionPreference = 'SilentlyContinue' # Scoped only to function
$error.Clear()
Dim oAPI, oDiscoveryData
Dim SourceId, ManagedEntityId, TargetComputer, IsVirtualNode
Dim result
Dim message
result = False
Set oAPI = CreateObject("MOM.ScriptAPI")
If(0 <> Err.number or (False = HasValue(oAPI)) ) Then
WScript.Quit(-1)
End If
result = GetArguments(SourceId,ManagedEntityId,TargetComputer,IsVirtualNode)
If(False = result) Then
message = "Wrong number of Arguments."
Call oAPI.LogScriptEvent(ScriptName,EventId,1,message)
WScript.Quit(-1)
End If
Set oDiscoveryData = oAPI.CreateDiscoveryData(0, SourceId, ManagedEntityId)
If(0 <> Err.number or (False = HasValue(oDiscoveryData)) ) Then
WScript.Quit(-1)
End If
If ("TRUE" = IsVirtualNode) Then
Call oAPI.Return(oDiscoveryData)
Set oDiscoveryData = Nothing
Set oAPI = Nothing
Exit Sub
End If
result = DiscoverInstances(DnsClassId,OsVersionFilter,DnsServiceName ,TargetComputer,oDiscoveryData)
If(False = result) Then
Set oDiscoveryData = oAPI.CreateDiscoveryData(0, SourceId, ManagedEntityId)
If(0 <> Err.number or (False = HasValue(oDiscoveryData)) ) Then
WScript.Quit(-1)
End If
oDiscoveryData.IsSnapShot = False
End If
Call oAPI.Return(oDiscoveryData)
Set oDiscoveryData = Nothing
Set oAPI = Nothing
End Sub
Function HasValue(Value)
Dim bNothing
bNothing = false
IF ( IsObject(Value) ) THEN
IF (Nothing is Value) THEN
bNothing = true
END IF
END IF
HasValue = Not ( IsEmpty(Value) or bNothing or IsNull(Value) )
End Function
Function GetArguments(ByRef SourceId,ByRef ManagedEntityId,ByRef TargetComputer,ByRef IsVirtualNode)
On Error Resume Next
Err.Clear
Dim objArguments
GetArguments = False
Set objArguments = WScript.Arguments
If (objArguments.Count < 3) Then
Exit Function
End If
If (objArguments.Count > 3) Then
IsVirtualNode = UCase(Replace(objArguments(3), Chr(34), ""))
End If
Set objArguments = Nothing
GetArguments = True
On Error Goto 0
End Function
Function DiscoverInstances(ClassId,OsVersion,ServiceName,TargetComputer,oDiscoveryData)
Dim DisplayName
Dim OsVersionName
On Error Resume Next
Err.Clear
Dim result, oClassInstance
DiscoverInstances = True
OsVersionName = OsVersion
result = GetSnapshotDiscovery(OsVersionName,ServiceName)
If (Exit_IncrementalDiscovery = result) Then
oDiscoveryData.IsSnapshot = false
ElseIf(Start_SnapShotDiscovery = result) Then
Set oClassInstance = oDiscoveryData.CreateClassInstance(ClassId)
If (0 <> Err.number) Then
DiscoverInstances = False
Exit Function
End If
DisplayName = "Windows DNS Server on (" & TargetComputer & ")"
Call oClassInstance.AddProperty("$MPElement[Name='Windows!Microsoft.Windows.Computer']/PrincipalName$",TargetComputer)
Call oClassInstance.AddProperty("$MPElement[Name='Microsoft.Windows.DNSServer.2016.Server']/Name$",TargetComputer)
Call oClassInstance.AddProperty("$MPElement[Name='Microsoft.Windows.DNSServer.2016.Server']/WindowsVersion$",OsVersionName)
Call oClassInstance.AddProperty("$MPElement[Name='System!System.Entity']/DisplayName$",DisplayName)
If (0 <> Err.number) Then
DiscoverInstances = False
Exit Function
End If
If ( IsObject(OsVersion)) Then
Exit Function
End If
sWmiTarget = "."
If ( Not IsObject(sComputerName)) Then
If (HasValue(sComputerName) and Len(sComputerName) > 0 ) Then
sWmiTarget = "" & sComputerName
End If
End If
sWmiTarget = "winmgmts:\\" & sWmiTarget & "\root\cimv2"
Filter = GetOsFilter(OsVersion,",")
StrQuery = "select Version from Win32_OperatingSystem" + Filter
Set oWmiSet = WMIExecQueryNoAbort(sWmiTarget, strQuery)
If Err.Number <> 0 Then
IsError = True
Exit Function
End If
Count = oWmiSet.Count
If Err.Number <> 0 Then
IsError = True
Exit Function
End If
For Each oObject in oWmiSet
OsVersion = oObject.Version
Exit For
Next
Set oObject = Nothing
GetServerOsVersionCheck = ( Count > 0)
On Error Goto 0
End Function
Function GetSnapshotDiscovery(ByRef OsVersion,ServiceName)
If (bIsOsValid) Then
If (bIsService) Then
iResult = Start_SnapShotDiscovery
Else
iResult = Exit_SnapShotDiscovery
End If
Else
If (bIsError) Then
iResult = Exit_IncrementalDiscovery
Else
iResult = Exit_SnapShotDiscovery
End IF
End If
GetSnapshotDiscovery = iResult
End Function
Function GetRegistryKeyValue(ByVal keyPath, ByVal key)
Dim oReg, strKeyValue
On Error Resume Next
strKeyValue = ""
Set oReg = CreateObject("WScript.Shell")
If Err.Number <> 0 Then
GetRegistryKeyValue = strKeyValue
On Error Goto 0
Exit Function
End If
strKeyValue = oReg.RegRead(keyPath & key)
If Err.Number <> 0 Then
strKeyValue = ""
End If
' resume error
On Error Goto 0
GetRegistryKeyValue = strKeyValue
End Function
Function GetServiceStartType(ServiceName)
Dim ServiceRegKey,RegValue
Dim Value
GetServiceStartType = -1
On Error Resume Next
RegValue = "Start"
ServiceRegKey = ServiceKey & ServiceName & "\"
Value = GetRegistryKeyValue(ServiceRegKey, RegValue)
If (0 = Len(Value) ) Then
Value = -1
End If
GetServiceStartType = Value
' resume error
On Error Goto 0
End Function
Function CheckServiceStartType(ServiceName)
Dim ServiceValue
Dim Value
CheckServiceStartType = False
On Error Resume Next
ServiceValue = GetServiceStartType(ServiceName)
If ( (-1 = ServiceValue) Or ("-1" = ServiceValue) ) Then
Exit Function
End If
If (StartTypeDisabled <> ServiceValue) Then
CheckServiceStartType = True
End If