Contents for Ezine 63s - Registry Shane's extra
Here is the full unabridged version of Shane's script. A reminder that
the purpose of the script is to attach to the registry (Via WMI) then read
all the "Software\Microsoft\Windows\CurrentVersion\Uninstall"
Try a search and then replace which includes the re run the cleaned
enumeration section.
'first enumeration and clean up if errors exists...
For Each objItem
in objDictionary2
strKeyPath = objDictionary2.Item(objItem)
objReg.GetStringValue
HKEY_LOCAL_MACHINE,strKeyPath,unValueName,strValue
objTextFile2.WriteLine
(strValue)
If Err Then
objDictionary2.Remove(objItem)
End If
Next
're run the cleaned up enumeration...
For Each objItem in
objDictionary2
strKeyPath = objDictionary2.Item(objItem)
objReg.GetStringValue
HKEY_LOCAL_MACHINE,strKeyPath,unValueName,strValue
objTextFile2.WriteLine
(strValue)
Instructions
- Copy and paste the script below into notepad.
- Save the file with .vbs extension e.g. ReadSoftware2.vbs
- Edit Domain= " Your Domain "
- Edit this line:
Set objTextFile2 =
objFSO.OpenTextFile("\\YourComputer\Drive$\Folder\" & strFileName,
ForWriting,True)
- Double click and then check for the files in the C:\ or C:\folder\
'set up constants...
Const HKEY_LOCAL_MACHINE = &H80000002
Const REG_SZ = 1
Const ForReading = 1
Const ForWriting = 2
Const ForAppending = 8
'set objects...
Set objFSO =
CreateObject("Scripting.FileSystemObject")
Set objDictionary =
CreateObject("Scripting.Dictionary")
Set objDictionary2 =
CreateObject("Scripting.Dictionary")
Set wshShell =
CreateObject("wscript.shell")
'get domain PC List...
Domain =
"Your Domain Here"
strPCsFile = "DomainPCs.txt"
'set up domain
pc list file...
Set objPCTXTFile = objFSO.OpenTextFile("C:\" &
strPCsFile,ForWriting,True)
Set objDomain = GetObject("WinNT://" &
Domain)
objDomain.Filter = Array("Computer")
For Each pcObject
In objDomain
objPCTXTFile.WriteLine pcObject.Name
Next
objPCTXTFile.close
pcsFile = "DomainPCs.txt"
'set up
reading of domain pc file into 1st dictionary array...
Set readPCFile
= objFSO.OpenTextFile("C:\" & pcsFile, ForReading)
i = 0
Do Until
readPCFile.AtEndOfStream
strNextLine = readPCFile.Readline
objDictionary.Add i, strNextLine
i = i + 1
Loop
readPCFile.Close
'create the GetInstalledSoftware Procedure...
Sub GetInstalledSoftware
On Error Resume next
Set
objReg=GetObject("winmgmts:{impersonationLevel=impersonate}!\\"
& _
strComputer & "\root\default:StdRegProv")
If Err <> "0"
Then
Exit Sub
End If
'registry paths to be enumerated...
unKeyPath = "Software\Microsoft\Windows\CurrentVersion\Uninstall"
unValueName = ("DisplayName")
pcNamePath =
"SYSTEM\CurrentControlSet\Control\ComputerName\ActiveComputerName\"
pcNameValueName = "ComputerName"
userPath =
"Software\Microsoft\Windows NT\CurrentVersion\WinLogon\"
userValueName = "DefaultUserName"
objReg.GetStringValue
HKEY_LOCAL_MACHINE,pcNamePath,pcNameValueName,pcValue
objReg.GetStringValue
HKEY_LOCAL_MACHINE,userPath,userValueName,userValue
'enumerate subkey paths in registry for uninstall path...
objReg.EnumKey
HKEY_LOCAL_MACHINE, unKeyPath, arrSubKeys
Set objTextFile1 =
objFSO.OpenTextFile("C:\UninstallPaths.txt", ForWriting,True)
'create subkey path to be enumerated...
For Each Subkey in arrSubKeys
objTextFile1.WriteLine (unKeyPath & "\"& subkey & (Enter))
Next
'set up reading on the uninstalls.txt file...
Set objTextFile3 =
objFSO.OpenTextFile("C:\UninstallPaths.txt", ForReading)
'pipe
the uninstall paths from the uninstall.txt file into a second dictionary
array...
i = 0
Do Until objTextFile3.AtEndOfStream
strNextLine
= objTextFile3.Readline
objDictionary2.Add i, strNextLine
i = i +
1
Loop
'enumerate each path in the uninstall file...
'and
get the display name of the software then write it to the file...
'Set Up The File Name
strFileName = UserValue & "_" & "On" & "_"
& PCValue & "_" & "Software" & year(date()) & right("0" &
month(date()),2) & right("0" & day(date()),2) & ".txt"
'create
each pcs corresponding software info file...
Set objTextFile2 =
objFSO.OpenTextFile("\\YourComputer\Drive$\Folder\" & strFileName,
ForWriting,True)
'start writing info to the corresponding
Software info file...
objTextFile2.WriteLine(vbCRLF &
"-----------------------------------------------------------------------------------------------------"
& vbCRLF & _
"Current Installed Software " & vbCRLF & Time & vbCRLF &
Date & vbCRLF & "Software Found For:" & "" & userValue & vbCRLF & "On
the following System:" _
& "" & pcValue & vbCRLF &
"-----------------------------------------------------------------------------------------------------"
& vbCRLF)
'first enumeration and clean up if errors exists...
For Each objItem in objDictionary2
strKeyPath =
objDictionary2.Item(objItem)
objReg.GetStringValue
HKEY_LOCAL_MACHINE,strKeyPath,unValueName,strValue
objTextFile2.WriteLine (strValue)
If Err Then
objDictionary2.Remove(objItem)
End If
Next
're run the
cleaned up enumeration...
For Each objItem in objDictionary2
strKeyPath = objDictionary2.Item(objItem)
objReg.GetStringValue
HKEY_LOCAL_MACHINE,strKeyPath,unValueName,strValue
objTextFile2.WriteLine (strValue)
Next
End Sub
'run the procedure...
For each DomainPC in objDictionary
strComputer = objDictionary.Item(DomainPC)
GetInstalledSoftware
Next
Set objFilesystem = Nothing
wscript.echo "Finished
Scanning Network"
'cleanup the evidence....
objFSO.DeleteFile("C:\UninstallPaths.txt")
objFSO.DeleteFile("C:\DomainPCs.txt")
wscript.Quit
Learning Points
Note 1: This script has an extra run through the registry keys
're run the cleaned up enumeration...
For Each objItem in
objDictionary2
strKeyPath = objDictionary2.Item(objItem)
objReg.GetStringValue
HKEY_LOCAL_MACHINE,strKeyPath,unValueName,strValue
objTextFile2.WriteLine
(strValue)
Note 2: This script has and extra ' Clean Up section' at the end.