Get Hotfix Using WMI Provider
Tagged:  •    •    •  
The following VBScript will retrieve the current hotfix for a specified SQL 2005 Server, and return that hotfix as a the return code. Useful in batch files for selectively applying unattended service packs.
Option Explicit
Dim sServer, sInstance, nVersion, bVerbose, sSQLServer

If (ParseCommandLine()) Then
	nVersion = GetSQLServerHotfix(sServer, sInstance)
	WScript.Quit(nVersion)
Else
	ShowUsage()
	WScript.Quit(-1)
End If


'*******************************************************************
'* GetSQLServerHotfix - Retrieves SQL 2005 server hotfix version #
'*******************************************************************
Function GetSQLServerHotfix(strServer, strInstance)
Dim oWMI, oRst, oRow, nHotfix, sSQLName, sVersion, sTemp, nPos

	nHotfix = 0

	If (UCase(sInstance) <> "MSSQLSERVER") Then
		sSQLName = "MSSQL$" & sInstance
	Else
		sSQLName = "MSSQLSERVER"
	End If

	Set oWMI = GetObject("winmgmts:\\" & strServer & "\root\Microsoft\SqlServer\ComputerManagement")
	Set oRst = oWMI.ExecQuery("SELECT PropertyStrValue FROM SQLServiceAdvancedProperty " _
					& " WHERE PropertyName='Version'" _
					& " AND ServiceName='" & sSQLName & "'",,48)

	For Each oRow in oRst
		sVersion = oRow.PropertyStrValue
		If (bVerbose) Then
			WScript.Echo("Server: " & sSQLServer)
			WScript.Echo("Version: " & sVersion)
		End If
		If (Len(sVersion) > 2) Then
			sTemp = sVersion
			nPos = InStr(3,sTemp,".")
			If (nPos > 0) Then
				sTemp = Mid(sTemp,nPos + 1)
				nPos = InStr(1,sTemp,".")
				If (nPos > 0) Then
					nHotfix = Left(sTemp,nPos-1)
					If (bVerbose) Then
						WScript.Echo("Hotfix: " & nHotfix)
					End If
				End If
			End If
		End If
	Next

	Set oRst = Nothing
	Set oWMI = Nothing

	GetSQLServerHotfix = nHotfix

End Function



'*******************************************************************
'* ParseCommandLine - Parses command line options into global vars
'*******************************************************************
Function ParseCommandLine()
Dim objArgs, i, sNextArg

	
	Set objArgs = WScript.Arguments
	For i = 0 To objArgs.Count - 1
		If (i < objArgs.Count - 1) Then
			sNextArg = objArgs(i+1)
		Else
			sNextArg = ""
		End If
		Select Case (UCase(objArgs(i)))
			Case "/SERVER":
				sSQLServer = sNextArg
				i = i + 1
			Case "/VERBOSE":
				bVerbose = True
			Case "/HELP":
				ParseCommandLine = False
				Exit Function
			Case "/H":
				ParseCommandLine = False
				Exit Function
		End Select
	Next

	' Check for valid arguments
	If (Len(sSQLServer) > 0) Then
		' Parse the server name/instance
		Dim nSlash
		nSlash = InStr(1,sSQLServer,"\")
		If (nSlash > 0) Then
			sInstance = Mid(sSQLServer,nSlash+1)
			sServer = Left(sSQLServer,nSlash-1)
		Else
			sInstance = "MSSQLSERVER"
			sServer = sSQLServer
		End If
		ParseCommandLine = True
	Else
		ParseCommandLine = False
	End If

End Function
AttachmentSize
versioncheck.vbs2.68 KB