Link to home
Start Free TrialLog in
Avatar of bsharath
bsharathFlag for India

asked on

How can i check if any specific Windows components are installed.

Hi,

How can i check if any specific Windows components are installed.
I need to query Terminal,SNMP etc.So is there a script that i can just specify the component name and it queries all computers or computers in a file and tell me all machines names where it can find the component.

Regards
Sharath
Avatar of abdulhameeds
abdulhameeds
Flag of Saudi Arabia image

Option Explicit

' Reg Key Security Options...
Const READ_CONTROL = &H20000
Const KEY_QUERY_VALUE = &H1
Const KEY_SET_VALUE = &H2
Const KEY_CREATE_SUB_KEY = &H4
Const KEY_ENUMERATE_SUB_KEYS = &H8
Const KEY_NOTIFY = &H10
Const KEY_CREATE_LINK = &H20
Const KEY_ALL_ACCESS = KEY_QUERY_VALUE + KEY_SET_VALUE + _
                       KEY_CREATE_SUB_KEY + KEY_ENUMERATE_SUB_KEYS + _
                       KEY_NOTIFY + KEY_CREATE_LINK + READ_CONTROL
                     
' Reg Key ROOT Types...
Const HKEY_LOCAL_MACHINE = &H80000002
Const ERROR_SUCCESS = 0
Const REG_SZ = 1                         ' Unicode nul terminated string
Const REG_DWORD = 4                      ' 32-bit number

Const gREGKEYSYSINFOLOC = "SOFTWARE\Microsoft\Shared Tools Location"
Const gREGVALSYSINFOLOC = "MSINFO"
Const gREGKEYSYSINFO = "SOFTWARE\Microsoft\Shared Tools\MSINFO"
Const gREGVALSYSINFO = "PATH"

Private Declare Function RegOpenKeyEx Lib "advapi32" Alias "RegOpenKeyExA" (ByVal hKey As Long, ByVal lpSubKey As String, ByVal ulOptions As Long, ByVal samDesired As Long, ByRef phkResult As Long) As Long
Private Declare Function RegQueryValueEx Lib "advapi32" Alias "RegQueryValueExA" (ByVal hKey As Long, ByVal lpValueName As String, ByVal lpReserved As Long, ByRef lpType As Long, ByVal lpData As String, ByRef lpcbData As Long) As Long
Private Declare Function RegCloseKey Lib "advapi32" (ByVal hKey As Long) As Long


Private Sub cmdSysInfo_Click()
  Call StartSysInfo
End Sub

Private Sub cmdOK_Click()
  Unload Me
End Sub

Private Sub Form_Load()
    Me.Caption = "About " & App.Title
    lblVersion.Caption = "Version " & App.Major & "." & App.Minor & "." & App.Revision
    lblTitle.Caption = App.Title
End Sub

Public Sub StartSysInfo()
    On Error GoTo SysInfoErr
 
    Dim rc As Long
    Dim SysInfoPath As String
   
    ' Try To Get System Info Program Path\Name From Registry...
    If GetKeyValue(HKEY_LOCAL_MACHINE, gREGKEYSYSINFO, gREGVALSYSINFO, SysInfoPath) Then
    ' Try To Get System Info Program Path Only From Registry...
    ElseIf GetKeyValue(HKEY_LOCAL_MACHINE, gREGKEYSYSINFOLOC, gREGVALSYSINFOLOC, SysInfoPath) Then
        ' Validate Existance Of Known 32 Bit File Version
        If (Dir(SysInfoPath & "\MSINFO32.EXE") <> "") Then
            SysInfoPath = SysInfoPath & "\MSINFO32.EXE"
           
        ' Error - File Can Not Be Found...
        Else
            GoTo SysInfoErr
        End If
    ' Error - Registry Entry Can Not Be Found...
    Else
        GoTo SysInfoErr
    End If
   
    Call Shell(SysInfoPath, vbNormalFocus)
   
    Exit Sub
SysInfoErr:
    MsgBox "System Information Is Unavailable At This Time", vbOKOnly
End Sub

Public Function GetKeyValue(KeyRoot As Long, KeyName As String, SubKeyRef As String, ByRef KeyVal As String) As Boolean
    Dim i As Long                                           ' Loop Counter
    Dim rc As Long                                          ' Return Code
    Dim hKey As Long                                        ' Handle To An Open Registry Key
    Dim hDepth As Long                                      '
    Dim KeyValType As Long                                  ' Data Type Of A Registry Key
    Dim tmpVal As String                                    ' Tempory Storage For A Registry Key Value
    Dim KeyValSize As Long                                  ' Size Of Registry Key Variable
    '------------------------------------------------------------
    ' Open RegKey Under KeyRoot {HKEY_LOCAL_MACHINE...}
    '------------------------------------------------------------
    rc = RegOpenKeyEx(KeyRoot, KeyName, 0, KEY_ALL_ACCESS, hKey) ' Open Registry Key
   
    If (rc <> ERROR_SUCCESS) Then GoTo GetKeyError          ' Handle Error...
   
    tmpVal = String$(1024, 0)                             ' Allocate Variable Space
    KeyValSize = 1024                                       ' Mark Variable Size
   
    '------------------------------------------------------------
    ' Retrieve Registry Key Value...
    '------------------------------------------------------------
    rc = RegQueryValueEx(hKey, SubKeyRef, 0, _
                         KeyValType, tmpVal, KeyValSize)    ' Get/Create Key Value
                       
    If (rc <> ERROR_SUCCESS) Then GoTo GetKeyError          ' Handle Errors
   
    If (Asc(Mid(tmpVal, KeyValSize, 1)) = 0) Then           ' Win95 Adds Null Terminated String...
        tmpVal = Left(tmpVal, KeyValSize - 1)               ' Null Found, Extract From String
    Else                                                    ' WinNT Does NOT Null Terminate String...
        tmpVal = Left(tmpVal, KeyValSize)                   ' Null Not Found, Extract String Only
    End If
    '------------------------------------------------------------
    ' Determine Key Value Type For Conversion...
    '------------------------------------------------------------
    Select Case KeyValType                                  ' Search Data Types...
    Case REG_SZ                                             ' String Registry Key Data Type
        KeyVal = tmpVal                                     ' Copy String Value
    Case REG_DWORD                                          ' Double Word Registry Key Data Type
        For i = Len(tmpVal) To 1 Step -1                    ' Convert Each Bit
            KeyVal = KeyVal + Hex(Asc(Mid(tmpVal, i, 1)))   ' Build Value Char. By Char.
        Next
        KeyVal = Format$("&h" + KeyVal)                     ' Convert Double Word To String
    End Select
   
    GetKeyValue = True                                      ' Return Success
    rc = RegCloseKey(hKey)                                  ' Close Registry Key
    Exit Function                                           ' Exit
   
GetKeyError:      ' Cleanup After An Error Has Occured...
    KeyVal = ""                                             ' Set Return Val To Empty String
    GetKeyValue = False                                     ' Return Failure
    rc = RegCloseKey(hKey)                                  ' Close Registry Key
End Function
Avatar of bsharath

ASKER

Thanks for the reply..

I get this...
---------------------------
Windows Script Host
---------------------------
Script:      C:\Check_Windows_components.vbs
Line:      13
Char:      67
Error:      Expected literal constant
Code:      800A0415
Source:       Microsoft VBScript compilation error

---------------------------
OK  
---------------------------
Thanks for the reply..

I get this...
---------------------------
Windows Script Host
---------------------------
Script:      C:\Check_Windows_components.vbs
Line:      13
Char:      67
Error:      Expected literal constant
Code:      800A0415
Source:       Microsoft VBScript compilation error

---------------------------
OK  
---------------------------
ist error when you open the form
ok then go to you visual basic folder in program files

then enter common ------go to the forms that exits
then try to open  ( about me.frm) it will work
Hi,

I just saved this file as vbs and running it.
Is this not executable like this?
Avatar of mathi28
mathi28

If you have SNMP enabled then you can query the host resource mib table to the hardware details
But not all machines have SNMP configured...
Avatar of RobSampson
Hi Sharath, run this VBS against a couple of computers in "computers.txt", and it will give you one message box per computer that lists all of the components installed, according to the sysoc.inf file that is in the Windows\INF folder.

I am not sure if it's comprehensive, but see if it's accurate.  If that works, it won't be difficult to have you enter a specific name, but take a look at the structure of those component names....

Regards,

Rob.
strInputFile = "computers.txt"
Set objFSO = CreateObject("Scripting.FileSystemObject")
Const intForReading = 1
Set objInputFile = objFSO.OpenTextFile(strInputFile, intForReading, False)
While Not objInputFile.AtEndOfStream
	strComputer = objInputFile.ReadLine
	If Trim(strComputer) <> "" Then
		If Ping(strComputer) = True Then
			strFileName = "\\" & strComputer & "\C$\Windows\Inf\SysOC.inf"
			boolFound = False
			If objFSO.FileExists(strFileName) = False Then
				strFileName = "\\" & strComputer & "\C$\WINNT\Inf\SysOC.inf"
				If objFSO.FileExists(strFileName) = True Then boolFound = True
			Else
				boolFound = True
			End If
			If boolFound = True Then
				Set objSysOCFile = objFSO.OpenTextFile(strFileName, intForReading, False)
				strComponents = "|"
				While Not objSysOCFile.AtEndOfStream
					strLine = objSysOCFile.ReadLine
					If InStr(strLine, "=") > 0 Then
						strComponents = strComponents & Trim(Split(strLine, "=")(0)) & "|"
					End If
				Wend
				objSysOCFile.Close
				Set objSysOCFile = Nothing
				If Len(strComponents) = 1 Then
					MsgBox "No components found on " & strComputer
				Else
					strComponents = Mid(strComponents, 2, Len(strComponents) - 2)
					MsgBox "Components on " & strComputer & VbCrLf & Replace(strComponents, "|", vbCrLf)
				End If
			Else
				MsgBox "Could not find SysOC.inf on " & strComputer
			End If
		Else
			MsgBox "Failed to ping: " & strComputer
		End If
	End If
Wend
objInputFile.Close
Set objInputFile = Nothing
 
Function Ping(strComputer)
	Dim objShell, boolCode
	Set objShell = CreateObject("WScript.Shell")
	boolCode = objShell.Run("Ping -n 1 -w 300 " & strComputer, 0, True)
	If boolCode = 0 Then
		Ping = True
	Else
		Ping = False
	End If
End Function

Open in new window

Rob...Thanks for the reply.....
The script output as this...

---------------------------

---------------------------
Components on sophos

Signature

DriverVer

NtComponents

WBEM

WBEMMSI

Display

Fax

NetOC

RSTORAGE

iis

com

dtc

IndexSrv_System

TerminalServer

msmq

RemInst

Cluster

aspnet

netfx

ins

ims

fp_extensions

certsrv

LicenseServer

wms

RootAutoUpdate

IEAccess

BITSServerExtensions

UDDIServices

Pop3Srv

authman

OEAccess

IEHarden

Rmserver

SCW

MultiM

AccessUtil

CommApps

AccessOpt

MSWordPad

StorageServer

ComputeServer

InetPrint

WindowTitle

WindowTitle.StandAlone

WindowTitle

WindowTitle_Standalone
---------------------------
OK  
---------------------------

But are all these windows components....?
Can i just get as

Application Server
>ASP.Net
>IIS

Terminal server licensing

Something like this....
Rob...Thanks for the reply.....
The script output as this...

---------------------------

---------------------------
Components on sophos

Signature

DriverVer

NtComponents

WBEM

WBEMMSI

Display

Fax

NetOC

RSTORAGE

iis

com

dtc

IndexSrv_System

TerminalServer

msmq

RemInst

Cluster

aspnet

netfx

ins

ims

fp_extensions

certsrv

LicenseServer

wms

RootAutoUpdate

IEAccess

BITSServerExtensions

UDDIServices

Pop3Srv

authman

OEAccess

IEHarden

Rmserver

SCW

MultiM

AccessUtil

CommApps

AccessOpt

MSWordPad

StorageServer

ComputeServer

InetPrint

WindowTitle

WindowTitle.StandAlone

WindowTitle

WindowTitle_Standalone
---------------------------
OK  
---------------------------

But are all these windows components....?
Can i just get as

Application Server
>ASP.Net
>IIS

Terminal server licensing

Something like this....
I'm not sure.  I can't find a full list of matching names for those short names that are used by the SysOC.inf file.  You might find that most of the components are listed as Services, but not all of them will be....

Have a look in Services.msc (Start --> Run --> Services.msc) and see if that has the required components....

Regards,

Rob.
Ok then can we query specific components....
So that meets the requirment
Ok then can we query specific components....
So that meets the requirment
ASKER CERTIFIED SOLUTION
Avatar of RobSampson
RobSampson
Flag of Australia image

Link to home
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
Start Free Trial
Ok Rob this is perfect...
Can i have the results to a file
Ok Rob this is perfect...
Can i have the results to a file
Sure, instead of this line (line 47):
MsgBox strResults


put this
strResultsFile = "Component_Results.txt"
Set objOutputFile = CreateObject(strResultsFile, True)
objOutputFile.Write strResults
objOutputFile.Close
Set objOutputFile = Nothing
MsgBox "Done. Please see " & strResultsFile


Regards,

Rob.
Rob i get this

---------------------------
Windows Script Host
---------------------------
Script:      C:\Windows components.vbs
Line:      48
Char:      1
Error:      ActiveX component can't create object: 'Component_Results.txt'
Code:      800A01AD
Source:       Microsoft VBScript runtime error

---------------------------
OK  
---------------------------
Oh whoops!
Change this line
   Set objOutputFile = CreateObject(strResultsFile, True)

to this:
Set objOutputFile = objFSO.CreateTextFile(strResultsFile, True)


Regards,

Rob.
Thanks Rob worked perfect...