@echo off
set psscript=DiscoverClusterService.ps1
set vbscript=DiscoverClusterService.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 Cluster ServiceDiscovery
SourceId: {0} ManagedEntityId : {1} Management Group Name : {2} ComputerName : {3}
"@
$StartDiscoveryMsg = "Started cluster service 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} Management Group Name : {2} ComputerName : {3} "
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
}
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()
result = GetArguments(SourceId,ManagedEntityId,MgName,ComputerName,IsArgs)
message = "SourceId: " & SourceId & " ManagedEntityId: " & ManagedEntityId & vbCrLf
message = message & "MgName : " & MgName & " ComputerName: " & ComputerName & vbCrLf
If(False = result) Then
Call oAPI.LogScriptEvent(ScriptName,ScriptEventId, EventTypeWarning, "Wrong Number of arguments." & vbCrLf & message)
WScript.Quit(-2)
End If
Set oDiscoveryData = oAPI.CreateDiscoveryData(0, SourceId, ManagedEntityId)
If(0 <> Err.number or (False = HasValue(oDiscoveryData)) ) Then
message = "Cannot create Discovery Data. Error: " & Err.Description & vbCrLf & message
Call oAPI.LogScriptEvent(ScriptName,ScriptEventId, EventTypeError, message)
WScript.Quit(-3)
End If
If (False = IsArgs) Then
oDiscoveryData.IsSnapShot = False
Call oAPI.Return(oDiscoveryData)
Set oAPI = Nothing
Exit Sub
End If
result = DiscoverInstances(MgName,ComputerName,oDiscoveryData)
If(False = result) Then
Set oDiscoveryData = oAPI.CreateDiscoveryData(0, SourceId, ManagedEntityId)
If(0 <> Err.number or (False = HasValue(oDiscoveryData)) ) Then
message = "Cannot create empty Discovery Data. Error: " & Err.Description & vbCrLf & message
Call oAPI.LogScriptEvent(ScriptName,ScriptEventId, EventTypeError, message)
WScript.Quit(-4)
End If
oDiscoveryData.IsSnapShot = False
End If
Call oAPI.Return(oDiscoveryData)
Set oDiscoveryData = Nothing
Set oAPI = Nothing
End Sub
Private 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 MgName,ByRef ComputerName,ByRef IsArgs)
On Error Resume Next
Err.Clear
GetArguments = False
IsArgs = False
If (WScript.Arguments.Count < 2) Then
Exit Function
End If
If (WScript.Arguments.Count < 4) Then
GetArguments = True
Exit Function
Else
IsArgs = True
End If
If oArgs.Count >= 12 Then
IsArgs = True
Else
If ((True = HasValue(SourceId)) And (True = HasValue(ManagedEntityId)) ) Then
Initialize = True
End If
Exit Function
End If
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 DiscoverInstances(MgName,ComputerName,oDiscoveryData)
On Error Resume Next
Err.Clear
Dim result, oClassInstance
Dim ClusterName, IsRootHealthService,RootHealthServiceKeyName
If( (0 = Len(ClusterName)) Or ("1" = IsRootHealthService) ) Then
Exit Function
End If
Set oClassInstance = oDiscoveryData.CreateClassInstance("$MPElement[Name='Microsoft.Windows.Cluster.Monitoring.Service']$")
If (0 <> Err.number) Then
DiscoverInstances = False
Exit Function
End If