The WINS connector checks the WINS lookup by a DNS server. I suppose the monitor only runs when you have configured DNS to use WINS forward lookup.

In order for this monitor to work you need to have a static record in WINS which doesn’t exist in DNS (this is not mentioned in the knowledge, but it runs a nslookup, so make sure it doesn’t resolve by using dns) and configure the monitor to lookup this HostName. Default the monitor looks up “PlaceHolder”, so you could just create a Wins record named “PlaceHolder”.
I had done this, but i still received errors and when i ran the nslookup query i did receive a valid response for placeholder, so the wins connector does work.
The knowledge mention something about a debug flag to get some helpful troubleshooting information to solve the issue. The description of the debug events i got:
DNS.TTL.vbs : Starting DNS.TTL.vbs Host:PlaceHolder Server:xxx.xxx.xxx.xxx
DNS.TTL.vbs : Writing Property Bag . State=False ttl1:0 ttl2:0 Authority Flag:
It’s not helpful at all and even worse it’s wrong as well. The vbscript file’s name is ttl.vbs, so look for this in the “system center management” folder. Also the parameters are wrong so manually running it fails as well.
To run the script manually on the dns server open a commandline box and run:
path.to.ttl.vbs>cscript /nologo ttl.vbs <hostname> <dnsserverip> false
<hostname>= static wins entry, which doesnt exist in dns (placeholder) (The script says to fill in fqdn, but this is incorrect as well).
<dnsserverip> = listening ip address of the dns server
bolean = debug flag. When you set this to true you get the worthless debug information in scom, so keep it on false
When you save the output to an xml file and open it you’ll get something like this.
<Collection>
<DataItem type=”System.PropertyBagData” time=”2010-08-25T17:18:49.1162249+02:00” sourceHealthServiceId=”BA0AF2AD-5058-0DA0-D5D0-BF3CDD878B88“>
<ConversionType>StateData</ConversionType>
<Property Name=”state” VariantType=”8“>ERROR</Property>
</DataItem>
</Collection>
i’ve modified the script so it will run show the stdout for the nslookup and show a line that it has exited the regex compare function (which it shouldn’t when it functions ok).
Just save the script below to a temp location and run it from there. When you run this vbs and all goes well you should just get this as output:
std_output:
————
Got answer:
HEADER:
opcode = QUERY, id = 1, rcode = NOERROR
header flags: response, want recursion, recursion avail.
questions = 1, answers = 1, authority records = 0, additional = 0
QUESTIONS:
xxxxxxxxxxx, type = PTR, class = IN
ANSWERS:
-> xxxxxxxxxxxxxxxxx
name = xxxxxxxxxxxxxxxxxx
ttl = 168 (2 mins 48 secs)
————
Server: xxxxxxxxxxxxxxxxxx
Address: xxxxxxxxxxxxxxxxxx
————
Got answer:
HEADER:
opcode = QUERY, id = 2, rcode = NOERROR
header flags: response, auth. answer, want recursion, recursion avail.
questions = 1, answers = 1, authority records = 0, additional = 0
QUESTIONS:
xxxxxxxxxxxxxx, type = A, class = IN
ANSWERS:
-> xxxxxxxxxxxx
internet address = xxxxxxxxxxxx
ttl = 1200 (20 mins)
————
Name: xxxxxxxxxxxxxxx
Address: xxxxxxxxxxxx
When it fails it will log a line before this output:
exit function at regex: 16
This means the WINS_LOOKUP_REGEX array fails at “”^\s*ttl = “,_” or the line after that.
I couldn’t be bothered to figure out the exact regular expression mismatch, rewrite the WINS_LOOKUP_REGEX array, disable the monitor and create a new one with a new script. I’ve just disabled this monitor as it’s just gives me incorrect information.
Modified script:
'
' Microsoft Corporation
' Copyright (c) Microsoft Corporation. All rights reserved.
'
' ttl.vbs
'
' Determine if a wins connector is healthy.
'
' Parameters -
' TargetComputer The FQDN of the computer targeted by the script.
' Server - the listening ip
' DebugFlag True / False
Option Explicit
SetLocale("en-us")
Const DNS_TRACEEVENTNUMBER = 1125
Const DNS_SCRIPTNAME = "DNS.TTL.vbs"
Const SCOM_ERROR=1
Const SCOM_WARNING=2
Const SCOM_INFORMATIONAL=4
Const SCOM_PB_STATEDATA = 3
Const NSLOOKUP_PATH = "%SystemRoot%\system32\nslookup.exe"
Dim ImagePath, oWMI, rc, oArgs, oAPI, oDiscoveryData, oInst, SourceID, ManagedEntityId, TargetComputer, OSVersion, oDebugFlag
Dim TTL1 , TTL2, AuthorityFlag
dim host,server,bolDebug
dim objAPI ,boolWins , oPropertyBag
Dim sCommand,iErrCode, sOutput, sError,m_sNetshPath ,aSubMatches, oShell, objArgs
Dim WINS_LOOKUP_REGEX
WINS_LOOKUP_REGEX = Array( _
".*\r\n",_
".*\r\n",_
".*\r\n",_
".*\r\n",_
".*\r\n",_
"^[\s]*questions = [0-9]*,",_
"^[\s]*answers = ",_
"[0-9]*,",_
"^[\s]*authority records = ",_
"[0-9]*",_
".*\r\n",_
".*\r\n",_
".*\r\n",_
".*\r\n",_
".*\r\n",_
".*\r\n",_
"^\s*ttl = ",_
"[0-9]*.*" )
'***************
'
' start here.
'
'***************
On Error Resume Next
Set objAPI = CreateObject("MOM.ScriptAPI")
If Err.Number <> 0 Then
Wscript.Quit
end if
Set oPropertyBag = objAPI.CreateTypedPropertyBag(3)
If Err.Number <> 0 Then
ThrowErrorAndExit "CreateStateDataTypedPropertyBag failed. code = " & Err.Number
end if
Set objArgs = WScript.Arguments
If objArgs.Count <> 3 Then
Call objAPI.LogScriptEvent( DNS_SCRIPTNAME & " <host> <computername> [debug [true | false]")
wscript.Quit
End If
host = objArgs(0)
server = objArgs(1)
bolDebug= objArgs(2)
Set oShell = CreateObject("WScript.Shell")
boolWins=cbool(false)
TTL1=0
TTL2=0
Set oShell = CreateObject("WScript.Shell")
trace "Starting " & DNS_SCRIPTNAME & " Host:" & host & " Server:" & server
sOutput=ExecuteCmd("-debug -querytype=a " +host + " "+ server ,NSLOOKUP_PATH ,true)
If LCase(sOutput) <> "error" Then
If GetSubMatches( WINS_LOOKUP_REGEX, sOutput, sOutput, aSubMatches) Then
TTL1=cint(aSubMatches(8) )
AuthorityFlag=cint(aSubMatches(4) )
end if
end if
if AuthorityFlag=1 then
Wscript.sleep (1020)
sOutput=ExecuteCmd("-debug -querytype=a " +host + " "+ server ,NSLOOKUP_PATH ,true)
If LCase(sOutput) <> "error" Then
If GetSubMatches( WINS_LOOKUP_REGEX, sOutput, sOutput, aSubMatches) Then
TTL2=cint(aSubMatches(8) )
if ttl1>ttl2 then
boolWins=cbool(true)
end if
end if
end if
end if
wscript.echo ""
wscript.echo "std_output:"
wscript.echo sOutput
trace "Writing Property Bag . State=" & cstr(boolWins) & " ttl1:" & cstr(ttl1) & " ttl2:" & cstr(ttl2) & " Authority Flag:" & cstr( AuthorityFlag)
if boolWins=true then
oPropertyBag.AddValue "state", "OK"
else
oPropertyBag.AddValue "state", "ERROR"
end if
objAPI.AddItem(oPropertyBag)
If Err.Number <> 0 Then ThrowErrorAndExit "Error adding state data to property bag. code = " & Err.Number
objAPI.ReturnItems
If Err.Number <> 0 Then ThrowErrorAndExit "Error returning property bag data. code = " & Err.Number
Set objAPI = Nothing
Set oPropertyBag = Nothing
Wscript.Quit
'*******************************************************
Sub ThrowErrorAndExit(Message)
Err.Clear
Call oAPI.LogScriptEvent(DNS_SCRIPTNAME, DNS_TRACEEVENTNUMBER, SCOM_ERROR, Message)
WScript.Quit
End Sub
Sub Trace(Message)
If (bolDebug) Then
Call objAPI.LogScriptEvent(DNS_SCRIPTNAME, DNS_TRACEEVENTNUMBER, SCOM_INFORMATIONAL, Message)
End If
End Sub
Function GetSubMatches(ByVal aRegexes, ByVal sText, ByRef sRemainingText, ByRef aCapturedSubMatches)
Dim oRegex
Set oRegex = New RegExp
oRegex.Global = False
Dim oMatches
Dim oMatch
Dim sPattern
Dim aSubMatches()
aCapturedSubMatches = aSubMatches
GetSubMatches = False
Dim i
Dim lSubMatchCount
lSubMatchCount = 0
sRemainingText = sText
dim intCount
intCount = 0
For i = 0 To UBound(aRegexes)
sPattern = aRegexes(i)
oRegex.Pattern = "^" & sPattern
Set oMatches = oRegex.Execute(sRemainingText)
if oMatches.Count = 0 then
wscript.echo "exit function at regex: " & intCount
end if
If oMatches.Count <> 1 Then
sRemainingText = sText
Exit Function
End If
Set oMatch = oMatches(0)
sRemainingText = Mid(sRemainingText, oMatch.Length + 1)
' save output If odd line, or only line.
If i Mod 2 = 1 Then
lSubMatchCount = lSubMatchCount + 1
ReDim Preserve aSubMatches(lSubMatchCount - 1)
aSubMatches(lSubMatchCount - 1) = oMatch.Value
elseIf UBound(aRegexes)=0 Then
lSubMatchCount = lSubMatchCount + 1
ReDim Preserve aSubMatches(lSubMatchCount - 1)
aSubMatches(lSubMatchCount - 1) = oMatch.Value
End If
intCount = intCount + 1
Next
GetSubMatches = True
aCapturedSubMatches = aSubMatches
End Function
Function ExecuteCmd(strOptionToUse, strCmdToUse, boolReadOutput)
Dim ncControlcommand
Dim oShell
Dim curDir
Dim strExecOut
Set oShell = CreateObject("WScript.Shell")
curDir = oShell.CurrentDirectory
ncControlcommand = "cmd.exe /C """ & QuoteWrap(strCmdToUse) & " " & strOptionToUse & " " &""""
IF boolReadOutput Then
strExecOut = RunCmd(ncControlcommand,true)
Else
strExecOut = RunCmd(ncControlcommand,false)
End If
ExecuteCmd = strExecOut
End Function
Function RunCmd(CmdString, boolGetOutPut)
Dim wshshell
Dim oExec
Dim output
Dim strOutPut
Set wshshell = CreateObject("WScript.Shell")
Set oExec = wshshell.Exec(CmdString)
Set output = oExec.StdOut
Do While oExec.Status = 0
WScript.Sleep 100
if output.AtEndOfStream = false then
IF boolGetOutPut Then
strOutPut = strOutPut & output.ReadAll
End IF
else
exit Do
End If
Loop
IF boolGetOutPut Then
strOutPut = strOutPut & output.ReadAll
Else
strOutPut = "1"
End IF
If oExec.ExitCode <> 0 Then
strOutPut = "Error"
End If
Set wshshell = Nothing
RunCmd = strOutPut
End Function
Function QuoteWrap(myString)
If (myString <> "") And (left(mySTring,1) <> Chr(34)) And (Right(myString,1) <> Chr(34)) Then
QuoteWrap = Chr(34) & myString & Chr(34)
Else
QuoteWrap = myString
End If
End Function
Function IsValidObject(ByVal oObject)
IsValidObject = False
If IsObject(oObject) Then
If Not oObject Is Nothing Then
IsValidObject = True
End If
End If
End Function