Solved

vbscript extract sql instances and version

Posted on 2008-06-23
11
2,669 Views
Last Modified: 2009-07-29
Hello using vbscript and WMI or otherwise I am looking to list all SQL instances and their SQL version including build level (e.g.  2005.90.3042). Anyone got suggestion to achieving this?
Thanks
0
Comment
Question by:nmxsupport
11 Comments
 
LVL 67

Expert Comment

by:sirbounty
ID: 21845172
Here's a piece I used a while back - I haven't updated it for sql 2005, but you can get a good idea anyway...
Dim objShell : Set objShell = CreateObject("Wscript.Shell")
strCmd = "oSql -E -Q " & chr(34) & "SELECT @@Version" & chr(34)
Dim objExec : Set objExec = objShell.Exec(strCmd)
strOut = Split(objExec.StdOut.ReadAll, vbNewLine)
For Each item in strOut
  If Instr(oItem, "SQL") > 0 Then
    strBuild=Trim(Mid(item,"-")+1,InstrRev(Item,"(")-(Instr(Item,"-")+1)))
  End If
Next
 
Select Case strBuild
  Case "8.00.194"
    strVer="SQL Server 2000"
    strSP=""
  Case "8.00.384"
    strVer="SQL Server 2000"
    strSP="1"
  Case "8.00.534"
    strVer="SQL Server 2000"
    strSP="2"
  Case "8.00.760"
    strVer="SQL Server 2000"
    strSP="3"
  Case "8.00.818"
    strVer="SQL Server 2000"
    strSP="3a"
End Select

Open in new window

0
 
LVL 65

Expert Comment

by:RobSampson
ID: 21850487
Hi, I've never done much scripting with SQL Server, but here's one I used to get instances.
http://www.experts-exchange.com/Microsoft/Development/MS-SQL-Server/Q_22925099.html

Regards,

Rob.
0
 

Author Comment

by:nmxsupport
ID: 21853710
Hmmm that works well to give all databases on the default instance - but looking to list all the instances on a named server and the version SQL of each one.
0
Best Practices: Disaster Recovery Testing

Besides backup, any IT division should have a disaster recovery plan. You will find a few tips below relating to the development of such a plan and to what issues one should pay special attention in the course of backup planning.

 
LVL 65

Expert Comment

by:RobSampson
ID: 21861783
How does this go?

Rob.
arrServers = Array(_
      "SQLServer1", _
      "SQLServer2" _
      )
 
strOutputFile = "Servers_DBs.txt"
 
Set objServer = CreateObject("SQLDMO.SQLServer2")
'Set Authentication for Server
' Login with current Windows account
objServer.LoginSecure = True
 
strDBs = ""
For Each strServerName In arrServers
      objServer.Connect strServerName
      If strDBs = "" Then
            strDBs = "Server: " & strServerName & VbCrLf & _
            	"Major Version: " & objServer.Application.VersionMajor & VbCrLf & _
            	"Minor Version: " & objserver.Application.VersionMinor & VbCrLf & "========================"
      Else
            strDBs = strDBs & VbCrLf & VbCrLf & "Server: " & strServerName & VbCrLf & _
            	"Major Version: " & objServer.Application.VersionMajor & VbCrLf & _
            	"Minor Version: " & objserver.Application.VersionMinor & VbCrLf & "========================"
      End If
      MsgBox strDBs
      For Each objDatabase In objServer.Databases
            strDBs = strDBs & vbCrLf & objDatabase.Name
      Next
      objServer.Disconnect
Next
 
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objOutputFile = objFSO.CreateTextFile(strOutputFile, True)
objOutputFile.Write strDBs
objOutputFile.Close
Set objOutputFile = Nothing
Set objFSO = Nothing
 
MsgBox "Done. Please see " & strOutputFile

Open in new window

0
 

Author Comment

by:nmxsupport
ID: 21863663
Hi Rob, this works to list the sql version of the default instance for a given array of servers. However for each server there can be many other instances - each running their own version of SQL - it was this part I'm trying to extract.
0
 
LVL 65

Accepted Solution

by:
RobSampson earned 500 total points
ID: 21863879
Hi, this probably does the job a bit better:
http://blog.netnerds.net/2007/01/vbscript-enumerating-all-sql-servers-on-a-domain/

Regards,

Rob.
0
 
LVL 65

Expert Comment

by:RobSampson
ID: 21871547
So from that link I posted, what does this code give you?

If you browse through the keys and values in
HKLM\Software\Microsoft\Microsoft SQL Server
on one of your SQL Servers, does that tell you what their versions are? If so, we could pull those out too.

Regards,

Rob.
Set objAdRootDSE = GetObject("LDAP://RootDSE")
Set objWMIService = GetObject("winmgmts:\\" & "." & "\root\cimv2")
Set objRS = CreateObject("adodb.recordset")
Const HKEY_LOCAL_MACHINE = &H80000002
 
varConfigNC = objAdRootDSE.Get("defaultNamingContext")
strConnstring = "Provider=ADsDSOObject"
 
arrServers = Array(_
	"SQLSERVER1", _
	"SQLSERVER2" _
	)
	
For Each strServer In arrServers
  strWQL = "SELECT * FROM 'LDAP://" & varConfigNC & "' WHERE objectCategory='Computer' and Name='" & strServer & "'"
  objRS.Open strWQL, strConnstring
      Do until objRS.eof
         Set objServer = GetObject(objRS.Fields.Item(0))
          strServerName = objServer.CN
 
          Set colItems = objWMIService.ExecQuery("Select * from Win32_PingStatus Where Address = '" & objServer.DNSHostName & "'")
          For Each objItem in colItems
              If objItem.StatusCode = 0 Then 'The Computer is Pingable
                    Set objRegistry = GetObject("winmgmts:{impersonationLevel=impersonate}!\\" & strServerName & "\root\default:StdRegProv")
                      strKeyPath = "SOFTWARE\Microsoft\Microsoft SQL Server"
                      strValueName = "InstalledInstances"
                      objRegistry.GetMultiStringValue HKEY_LOCAL_MACHINE,strKeyPath, strValueName,arrValues
                        If IsNull(arrValues) = 0 Then 'It's a SQL Server! Enumerate it's instances
                          strMsg = strServerName & " is running the following SQL Instance(s): "
                          For Each strValue In arrValues
                              If strValue = "MSSQLSERVER" Then strValue = "Default Instance"
                                strMsg = strMsg & vbCrLf & strValue
                          Next
                          MsgBox strMsg
                        End If
                     Set objRegistry = Nothing
              End If
          Set objServer = Nothing
      Next
    objRS.movenext
    Loop
  objRS.close
Next
 
Set objWMIService = Nothing
Set objRS = Nothing
Set objAdRootDSE = Nothing

Open in new window

0
 
LVL 65

Expert Comment

by:RobSampson
ID: 21871564
Or, as SirBounty provided in his first post (did you try that?), perhaps the command line tools can do this better...
http://www.mssqltips.com/tip.asp?tip=1113

Rob.
0
 

Author Comment

by:nmxsupport
ID: 21872790
Rob, thanks for the links - they have provided me with a way to move forward. I've used the various sources to put together something which works for me.

Kind Regards.
sub chkSQL(strserver) '1.9
ON ERROR RESUME NEXT
  Set objRegistry = GetObject("winmgmts:{impersonationLevel=impersonate}!\\" & server & "\root\default:StdRegProv")
  strKeyPath = "SOFTWARE\Microsoft\Microsoft SQL Server"
  strValueName = "InstalledInstances"
  objRegistry.GetMultiStringValue HKEY_LOCAL_MACHINE,strKeyPath, strValueName,arrValues
	If not IsNull(arrValues) Then
		st = server
		For Each strValue In arrValues
			if strvalue = "MSSQLSERVER" then
				strInstance = server
			else
				strInstance = server & "\" & strvalue
			end if
			Set cxn = Wscript.CreateObject("ADODB.Connection")
			strConn = "Driver={SQL Server};Server=" & strInstance & ";Database=master"
 
			cxn.ConnectionString = strConn
			cxn.Open
			Set rs=cxn.Execute("SELECT @@version") 
			if not rs.eof then
        arr_1 = split(rs(0).value,"-")
				arr_2 = split(arr_1(1)," ")
				res.writeline("!!sql_instance==" & strInstance & "==" & arr_2(1))
			end if
		next
	end if
end sub

Open in new window

0
 
LVL 65

Expert Comment

by:RobSampson
ID: 21879796
Hi, that's great. Thanks for the grade, and thanks for posting your working code.

Regards,

Rob.
0
 

Expert Comment

by:Carlos_Felipe
ID: 22074729
A simplest way to get the instances:
str = "localhost"
Set objSQLDMOApp = CreateObject("SQLDMO.SQLServer2")
set objInstances = objSQLDMOApp.ListInstalledInstances(str)
For Count=1 To objInstances.Count
	WScript.Echo objInstances.Item(count)
Next

Open in new window

0

Featured Post

PRTG Network Monitor: Intuitive Network Monitoring

Network Monitoring is essential to ensure that computer systems and network devices are running. Use PRTG to monitor LANs, servers, websites, applications and devices, bandwidth, virtual environments, remote systems, IoT, and many more. PRTG is easy to set up & use.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

JSON is being used more and more, besides XML, and you surely wanted to parse the data out into SQL instead of doing it in some Javascript. The below function in SQL Server can do the job for you, returning a quick table with the parsed data.
I have a large data set and a SSIS package. How can I load this file in multi threading?
Via a live example, show how to shrink a transaction log file down to a reasonable size.
Viewers will learn how the fundamental information of how to create a table.

860 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question