Page 1 of 3 123>
Topic Options
#117504 - 2004-04-08 02:51 AM Mail the Software Inventory
NTDOC Administrator Offline
Administrator
*****

Registered: 2000-07-28
Posts: 11623
Loc: CA
I had a request from one our user groups asking if we had a tool or method where they could get a list of the applications installed on their desktops with the information placed into Excel so they could mail it.

Here is a script that I put together witht he help of some other members of the board as mentioned below.

It will retrieve a list of most applications in the HKLMSMWCVAppPath key. With the Path, Description, and BinFileVersion and place it into an array. Then this data is written into a MS Excel worksheet, then it is attached to a new Outlook email message.

This script would probably work in other environments with little to no changes, but if you do want to try it make sure you review the code for any specifics of your environment.


CONTRIBUTORS: - Shawn, Chris, Radimus, Jens





Code:
Break On

Dim $SO,$Software,$Application,$x,$File,$Send,$Excel,$Report
$SO=SetOption('Explicit','On')
$SO=SetOption('NoVarsInStrings','On')
$SO=SetOption('WrapAtEOL','On')

$Excel = ReadValue('HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\Excel.exe','')
$File = '%TEMP%\' + @USERID + '_' + @WKSTA + '.XLS'
$Software = QS(Split(GetSoftwareInfo(),@CRLF))
ImportToXLS($Software,$File)
$Send = SendOutlookMail('John.Doe@@MyCompany.com','Software Inventory for ' + @FULLNAME + ' on ' + @WKSTA,'Here is the software inventory for my pc ' + @WKSTA,$File)

If Exist($File)
Del $File
EndIf
Exit 1

Function ImportToXLS($List,$Output)
Dim $Excel, $Workbook, $Row, $App, $, $Error
If VarType($List) <> 8204 ; Not a string array
EXIT 1 ; ERROR_INVALID_FUNCTION
Endif
$Excel = CreateObject("Excel.Application")
If $Excel
$Excel.DisplayAlerts = 0
$Workbook = $Excel.Workbooks.Add(-4167)
If $Workbook
$Workbook.ActiveSheet.Rows(1).Columns(1).Value = "Application"
$Workbook.ActiveSheet.Rows(1).Columns(1).Interior.Color = &EED2BD
$Workbook.ActiveSheet.Rows(1).Columns(1).Font.Bold = -1
$Workbook.ActiveSheet.Rows(1).RowHeight = 25
$Workbook.ActiveSheet.Rows(1).VerticalAlignment = 2
$Workbook.ActiveSheet.Rows(1).HorizontalAlignment = -4131
$Workbook.ActiveSheet.Rows(1).Columns(2).Value = "Path"
$Workbook.ActiveSheet.Rows(1).Columns(2).Interior.Color = &EED2BD
$Workbook.ActiveSheet.Rows(1).Columns(2).Font.Bold = -1
$Workbook.ActiveSheet.Rows(1).Columns(3).Value = "Version"
$Workbook.ActiveSheet.Rows(1).Columns(3).Interior.Color = &EED2BD
$Workbook.ActiveSheet.Rows(1).Columns(3).Font.Bold = -1
$Row = 2
For Each $App In $List
If Instr($App,"*")
$Workbook.ActiveSheet.Rows($Row).Columns(1).Value = Split($App,"*")[0]
$Workbook.ActiveSheet.Rows($Row).Columns(2).Value = Split($App,"*")[1]
$Workbook.ActiveSheet.Rows($Row).Columns(3).Value = Split($App,"*")[2]
$Row=$Row+1
Endif
Next
; This line adds a hyperlink into the worksheet
; $= $Workbook.ActiveSheet.Hyperlinks.Add($Workbook.ActiveSheet.Range("D4"),"http://www.kixhelp.com",,"For further information on KiXtart please go here", "KiXhelp")

$= $Workbook.ActiveSheet.Columns(1).AutoFit
$= $Workbook.ActiveSheet.Columns(2).AutoFit
$= $Workbook.ActiveSheet.Columns(3).AutoFit
$= $Workbook.ActiveSheet.Select
$Workbook.ActiveSheet.Name = "Software Inventory"
Endif
$= $WorkBook.SaveAs($Output)
$Workbook = 0
$Excel.Quit()
$Excel = 0
Endif
EXIT @ERROR
EndFunction
 
Function GetSoftwareInfo()
Dim $HKLMAppPaths1, $HKLMAppPaths2, $App1, $App2, $Key, $SoftInfo, $Path,$AppName,$AppVer
Dim $DisplayName, $DisplayVersion, $FileVer
$HKLMAppPaths1 = 'HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths'
$HKLMAppPaths2 = 'HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall'
$App1=ArrayEnumKey($HKLMAppPaths1)
$App2=ArrayEnumKey($HKLMAppPaths2)
For Each $Key in $App1
$Path = ReadValue($HKLMAppPaths1 + "\" + $Key,"")
If Len($Path)
If InStr($Path,'%') $Path = ExpandEnvironmentVars($Path) EndIf
If InStr($Path,'"') $Path=Split($Path,'"')[1] EndIf
$Path = IIF(InStr($Key,'WRITE.EXE'),'',$Path)
$Path = IIF(InStr($Key,'winzip.exe'),'',$Path)
If Trim(GetFileVersion($Path,'FileDescription')) <> ""
If Trim(GetFileVersion($Path,'BinFileVersion'))='0.0.0.0'
$FileVer = 'FileVersion'
Else
$FileVer = 'BinFileVersion'
EndIf
$SoftInfo = $SoftInfo + Trim(GetFileVersion($Path,'FileDescription')) + CHR(42)
+ $Path + CHR(42) + Trim(GetFileVersion($Path,$FileVer)) + @CRLF
EndIf
EndIf
Next
For Each $Key in $App2
$DisplayName = ReadValue($HKLMAppPaths2 + "\" + $Key,'DisplayName')
$DisplayVersion = ReadValue($HKLMAppPaths2 + "\" + $Key,'DisplayVersion')
$DisplayName = IIF(InStr($SoftInfo,$DisplayName),'',$DisplayName)
$DisplayName = IIF(InStr($DisplayName,'ACDSee'),'',$DisplayName)
$DisplayName = IIF(InStr($DisplayName,'Adobe Acrobat 6.0'),'',$DisplayName)
$DisplayName = IIF(InStr($DisplayName,'Adobe Illustrator'),'',$DisplayName)
$DisplayName = IIF(InStr($DisplayName,'Adobe Photoshop 5.5'),'',$DisplayName)
$DisplayName = IIF(InStr($DisplayName,'Adobe Photoshop 6.0'),'',$DisplayName)
$DisplayName = IIF(InStr($DisplayName,'Adobe Photoshop 7.0'),'',$DisplayName)
$DisplayName = IIF(InStr($DisplayName,'Adobe Reader'),'',$DisplayName)
$DisplayName = IIF(InStr($DisplayName,'Alcohol 120'),'',$DisplayName)
$DisplayName = IIF(InStr($DisplayName,'Dreamweaver MX'),'',$DisplayName)
$DisplayName = IIF(InStr($DisplayName,'Fireworks MX'),'',$DisplayName)
$DisplayName = IIF(InStr($DisplayName,'Flash MX'),'',$DisplayName)
$DisplayName = IIF(InStr($DisplayName,'FreeHand MX'),'',$DisplayName)
$DisplayName = IIF(InStr($DisplayName,'LiveReg'),'',$DisplayName)
$DisplayName = IIF(InStr($DisplayName,'LiveUpdate'),'',$DisplayName)
$DisplayName = IIF(InStr($DisplayName,'MSN Messenger'),'',$DisplayName)
$DisplayName = IIF(InStr($DisplayName,'Macromedia FreeHand'),'',$DisplayName)
$DisplayName = IIF(InStr($DisplayName,'Microsoft Office FrontPage'),'',$DisplayName)
$DisplayName = IIF(InStr($DisplayName,'Microsoft Outlook'),'',$DisplayName)
$DisplayName = IIF(InStr($DisplayName,'Net2Phone'),'',$DisplayName)
$DisplayName = IIF(InStr($DisplayName,'RoboHelp Office'),'',$DisplayName)
$DisplayName = IIF(InStr($DisplayName,'SnagIt'),'',$DisplayName)
$DisplayName = IIF(InStr($DisplayName,'Symantec AntiVirus'),'',$DisplayName)
$DisplayName = IIF(InStr($DisplayName,'Windows Media Encoder'),'',$DisplayName)
If Len($DisplayName)
If Len($DisplayVersion)
$SoftInfo = $SoftInfo + Trim($DisplayName) + CHR(42) + Trim($Key) + CHR(42) + Trim($DisplayVersion) + @CRLF
EndIf
EndIf
Next
$GetSoftwareInfo=$SoftInfo
EndFunction


Function ArrayEnumKey($regsubkey)
Dim $retcode, $subkeycounter, $currentsubkey, $subkeyarray
If Not KeyExist($regsubkey)
Exit 87
EndIf
$subkeycounter=0
Do
$currentsubkey=EnumKey($regsubkey,$subkeycounter)
If Not @ERROR
ReDim Preserve $subkeyarray[$subkeycounter]
$subkeyarray[$subkeycounter]=$currentsubkey
$subkeycounter=$subkeycounter+1
EndIf
Until @ERROR
$arrayenumkey=$subkeyarray
Exit 0
EndFunction

Function QS($a)
DIM $b[32],$c[32],$d,$e,$f,$g,$h,$i,$j,$k,$l
$b[0]=0
$c[0]=Ubound($a)
$d=0
While $d >=0
$e=$b[$d]
$f=$c[$d]
While $e < $f
$h=$e+($f-$e)/2
$k=$a[$e]
$A[$e]=$A[$h]
$A[$h]=$k
$i=$e+1
$j=$f
$l=0
Do
While ($i<$j) And $A[$e] > $A[$i]
$i=$i+1
Loop
While ($j>=$i) And $A[$j] > $A[$e]
$j=$j-1
Loop
IF $i>=$j
$l=1
Else
$k=$A[$i]
$A[$i]=$A[$j]
$A[$j]=$k
$j=$j-1
$i=$i+1
EndIf
Until $l=1
$k=$a[$e]
$a[$e]=$a[$j]
$a[$j]=$k
$g=$j
If $g-$e <= $f - $g
If $g+1 < $f
$b[$d]=$g+1
$c[$d]=$f
$d=$d+1
EndIf
$f=$g-1
Else
If $g-1 > $e
$b[$d]=$e
$c[$d]=$g-1
$d=$d+1
EndIf
$e=$g+1
EndIf
Loop
$d=$d-1
Loop
$qs=$a
EndFunction

Function SendOutlookMail($To, $Subject, optional $Body, optional $Attachment)
Dim $objOutlook, $Msg, $Recip, $Attach, $Deliver
$objOutlook = CreateObject("Outlook.Application")
$Msg = $objOutlook.CreateItem(0)
$Msg.Subject = ($Subject)
$Msg.Body = ($Body + @CRLF)
$Recip = $Msg.Recipients.Add($To)
If Not $Recip.Resolve
$Msg.Display
EndIf
$Msg.attachments.add($Attachment)
$Msg.Display
; $Deliver = $Msg.Send
$objOutlook = ""
EndFunction




Edited by NTDOC (2004-04-13 09:54 AM)

Top
#117505 - 2004-04-08 04:06 AM Re: Mail the Software Inventory
Radimus Moderator Offline
Moderator
*****

Registered: 2000-01-06
Posts: 5187
Loc: Tampa, FL
not to kibbitz your excellent inventory/export routine, but I'd just use Open/writeline/close into a CSV. In this case, since all the data is already in an array, I'd just use WriteFile() to dump the array to a file. There would only be issues if any of the fields had commas... (may want to a joinsplit on each element and replace with a period)

It would work out about the same... as excel would still open it. And the code (and output) would be much lighter

and to nitpick... I'd call the function ExportToXLS()...
_________________________
How to ask questions the smart way <-----------> Before you ask

Top
#117506 - 2004-04-08 04:50 AM Re: Mail the Software Inventory
NTDOC Administrator Offline
Administrator
*****

Registered: 2000-07-28
Posts: 11623
Loc: CA
No kibbitz at all.

You can take just about any task known to man and ask a dozen different people to do it, and you will end up with different solutions.

I like the idea and control of directly using Excel myself. This solution is not for everyone and makes Excel and Outlook a requirement, but for our environment it works quite well.

Top
#117507 - 2004-04-12 10:35 PM Re: Mail the Software Inventory
NTDOC Administrator Offline
Administrator
*****

Registered: 2000-07-28
Posts: 11623
Loc: CA
I've updated the code here to use the revised GetSoftwareInfo() UDF from here

http://www.kixtart.org/ubbthreads/showflat.php?Cat=&Board=UBB14&Number=116520


Top
#117508 - 2004-04-15 03:26 PM Re: Mail the Software Inventory
Trackz Offline
Fresh Scripter

Registered: 2004-03-18
Posts: 37
Loc: Rotterdam, The Netherlands
Very nice work..
i won't use this to send emails to any addres. will convert this with some code to add info to a MySQL db.. Thanx sofar!


Moved my question to URL: http://www.kixtart.org/ubbthreads/showflat.php?Cat=&Number=116475

So this one can be deleted


Edited by thoek (2004-04-16 10:51 AM)

Top
#117509 - 2004-04-16 08:28 PM Re: Mail the Software Inventory
NTDOC Administrator Offline
Administrator
*****

Registered: 2000-07-28
Posts: 11623
Loc: CA
Glad you like it. I hope to add some more information to it and start to insert the data into a SQL 2000 database soon.
Top
#117510 - 2005-03-02 05:59 AM Re: Mail the Software Inventory
ClientMaster Offline
Fresh Scripter

Registered: 2005-01-19
Posts: 46
Loc: Tokyo, Japan
This is great.
A couple of minor modifications and it works wonders.
Thanks guys..
_________________________
How can you know good, unless you experience bad.

Top
#117511 - 2005-03-02 10:16 AM Re: Mail the Software Inventory
ClientMaster Offline
Fresh Scripter

Registered: 2005-01-19
Posts: 46
Loc: Tokyo, Japan
Just noticed one thing..

If an key in the uninstall hive doesn`t have a display version, it doesn`t get exported to the Excel file..
Any ideas on how to fix this?
_________________________
How can you know good, unless you experience bad.

Top
#117512 - 2005-10-11 03:51 AM Re: Mail the Software Inventory
NTDOC Administrator Offline
Administrator
*****

Registered: 2000-07-28
Posts: 11623
Loc: CA
Since there has been a bit of interest lately of getting System information into different formats lately I thought I'd post a variation on this script.

This one does not gather the software information but simply puts in some of the user and hardware information.

This is just an example which can be altered to easily fit what it is you're wanting to put into the file.

Break On
Dim $SO,$File,$Excel,$Report
$SO=SetOption('Explicit','On')
$SO=SetOption('NoVarsInStrings','On')
$SO=SetOption('NoMacrosInStrings','On')

$Excel = ReadValue('HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\Excel.exe','')
If Not $Excel Quit 1 EndIf
$File = '%TEMP%\' + @USERID + '_' + @WKSTA + '.XLS'

If Exist($File)
DEL $File
EndIf

Global $Admin,$Ram,$FreeSpace,$ComputerMfg,$ComputerModel,$MyBIOSInfo,$Serial
$Admin = IIf(InGroup(@WKSTA+'\'+SidToName('S-1-5-32-544')),'Yes','No')
$RAM = MemorySize()
$FreeSpace = DiskSpace(,1)
$ComputerMfg = WMIQuery("Manufacturer","Win32_ComputerSystem")[0]
$ComputerModel = WMIQuery("Model","Win32_ComputerSystem")[0]
$MyBIOSInfo = GetBIOSInfo()
$Serial = $MyBIOSInfo[3]

SendToXLS($File)

If Exist($File)
$Report = $Excel+CHR(32)+$File
RUN $Report
EndIf
Exit 1

Function SendToXLS($Output)
Dim $Excel, $Workbook, $Row, $App, $AF, $Error
$Excel = CreateObject("Excel.Application")
If $Excel
$Excel.DisplayAlerts = 0
$Workbook = $Excel.Workbooks.Add(-4167)
If $Workbook
$Workbook.ActiveSheet.Rows(1).Columns(1).Value = "DATE"
$Workbook.ActiveSheet.Rows(1).Columns(1).Interior.Color = &EED2BD
$Workbook.ActiveSheet.Rows(1).Columns(1).Font.Bold = -1
$Workbook.ActiveSheet.Rows(1).RowHeight = 12.75
$Workbook.ActiveSheet.Rows(1).VerticalAlignment = 2
$Workbook.ActiveSheet.Rows(1).HorizontalAlignment = -4131
$Workbook.ActiveSheet.Rows(1).Columns(2).Value = "COMPUTER"
$Workbook.ActiveSheet.Rows(1).Columns(2).Interior.Color = &EED2BD
$Workbook.ActiveSheet.Rows(1).Columns(2).Font.Bold = -1
$Workbook.ActiveSheet.Rows(1).Columns(3).Value = "IP"
$Workbook.ActiveSheet.Rows(1).Columns(3).Interior.Color = &EED2BD
$Workbook.ActiveSheet.Rows(1).Columns(3).Font.Bold = -1
$Workbook.ActiveSheet.Rows(1).Columns(4).Value = "MAC"
$Workbook.ActiveSheet.Rows(1).Columns(4).Interior.Color = &EED2BD
$Workbook.ActiveSheet.Rows(1).Columns(4).Font.Bold = -1
$Workbook.ActiveSheet.Rows(1).Columns(5).Value = "USERID"
$Workbook.ActiveSheet.Rows(1).Columns(5).Interior.Color = &EED2BD
$Workbook.ActiveSheet.Rows(1).Columns(5).Font.Bold = -1
$Workbook.ActiveSheet.Rows(1).Columns(6).Value = "FULLNAME"
$Workbook.ActiveSheet.Rows(1).Columns(6).Interior.Color = &EED2BD
$Workbook.ActiveSheet.Rows(1).Columns(6).Font.Bold = -1
$Workbook.ActiveSheet.Rows(1).Columns(7).Value = "ADMIN"
$Workbook.ActiveSheet.Rows(1).Columns(7).Interior.Color = &EED2BD
$Workbook.ActiveSheet.Rows(1).Columns(7).Font.Bold = -1
$Workbook.ActiveSheet.Rows(1).Columns(8).Value = "OS"
$Workbook.ActiveSheet.Rows(1).Columns(8).Interior.Color = &EED2BD
$Workbook.ActiveSheet.Rows(1).Columns(8).Font.Bold = -1
$Workbook.ActiveSheet.Rows(1).Columns(9).Value = "SP"
$Workbook.ActiveSheet.Rows(1).Columns(9).Interior.Color = &EED2BD
$Workbook.ActiveSheet.Rows(1).Columns(9).Font.Bold = -1
$Workbook.ActiveSheet.Rows(1).Columns(10).Value = "CPU"
$Workbook.ActiveSheet.Rows(1).Columns(10).Interior.Color = &EED2BD
$Workbook.ActiveSheet.Rows(1).Columns(10).Font.Bold = -1
$Workbook.ActiveSheet.Rows(1).Columns(11).Value = "SPEED"
$Workbook.ActiveSheet.Rows(1).Columns(11).Interior.Color = &EED2BD
$Workbook.ActiveSheet.Rows(1).Columns(11).Font.Bold = -1
$Workbook.ActiveSheet.Rows(1).Columns(12).Value = "MEMORY"
$Workbook.ActiveSheet.Rows(1).Columns(12).Interior.Color = &EED2BD
$Workbook.ActiveSheet.Rows(1).Columns(12).Font.Bold = -1
$Workbook.ActiveSheet.Rows(1).Columns(13).Value = "FREESPACE"
$Workbook.ActiveSheet.Rows(1).Columns(13).Interior.Color = &EED2BD
$Workbook.ActiveSheet.Rows(1).Columns(13).Font.Bold = -1
$Workbook.ActiveSheet.Rows(1).Columns(14).Value = "MFG"
$Workbook.ActiveSheet.Rows(1).Columns(14).Interior.Color = &EED2BD
$Workbook.ActiveSheet.Rows(1).Columns(14).Font.Bold = -1
$Workbook.ActiveSheet.Rows(1).Columns(15).Value = "MODEL"
$Workbook.ActiveSheet.Rows(1).Columns(15).Interior.Color = &EED2BD
$Workbook.ActiveSheet.Rows(1).Columns(15).Font.Bold = -1
$Workbook.ActiveSheet.Rows(1).Columns(16).Value = "SERIAL"
$Workbook.ActiveSheet.Rows(1).Columns(16).Interior.Color = &EED2BD
$Workbook.ActiveSheet.Rows(1).Columns(16).Font.Bold = -1
$Row = 2
$Workbook.ActiveSheet.Rows($Row).Columns(1).Value = @Date
$Workbook.ActiveSheet.Rows($Row).Columns(2).Value = @WKSTA
$Workbook.ActiveSheet.Rows($Row).Columns(3).Value = Join(Split(@IPADDRESS0,' '),'')
$Workbook.ActiveSheet.Rows($Row).Columns(4).Value = @ADDRESS
$Workbook.ActiveSheet.Rows($Row).Columns(5).Value = @UserID
$Workbook.ActiveSheet.Rows($Row).Columns(6).Value = @FullName
$Workbook.ActiveSheet.Rows($Row).Columns(7).Value = $Admin
$Workbook.ActiveSheet.Rows($Row).Columns(8).Value = @ProductType
$Workbook.ActiveSheet.Rows($Row).Columns(9).Value = @CSD
$Workbook.ActiveSheet.Rows($Row).Columns(10).Value = Trim(@CPU)
$Workbook.ActiveSheet.Rows($Row).Columns(11).Value = @MHz
$Workbook.ActiveSheet.Rows($Row).Columns(12).Value = $Ram
$Workbook.ActiveSheet.Rows($Row).Columns(13).Value = $FreeSpace
$Workbook.ActiveSheet.Rows($Row).Columns(14).Value = $ComputerMfg
$Workbook.ActiveSheet.Rows($Row).Columns(15).Value = $ComputerModel
$Workbook.ActiveSheet.Rows($Row).Columns(16).Value = $Serial
; This line adds a hyperlink into the worksheet if wanted
; $= $Workbook.ActiveSheet.Hyperlinks.Add($Workbook.ActiveSheet.Range("D1"),"http://www.winzip.com",,"WinZip", "WinZip Home Page")
$AF= $Workbook.ActiveSheet.Columns(1).AutoFit
$AF= $Workbook.ActiveSheet.Columns(2).AutoFit
$AF= $Workbook.ActiveSheet.Columns(3).AutoFit
$AF= $Workbook.ActiveSheet.Columns(4).AutoFit
$AF= $Workbook.ActiveSheet.Columns(5).AutoFit
$AF= $Workbook.ActiveSheet.Columns(6).AutoFit
$AF= $Workbook.ActiveSheet.Columns(7).AutoFit
$AF= $Workbook.ActiveSheet.Columns(8).AutoFit
$AF= $Workbook.ActiveSheet.Columns(9).AutoFit
$AF= $Workbook.ActiveSheet.Columns(10).AutoFit
$AF= $Workbook.ActiveSheet.Columns(11).AutoFit
$AF= $Workbook.ActiveSheet.Columns(12).AutoFit
$AF= $Workbook.ActiveSheet.Columns(13).AutoFit
$AF= $Workbook.ActiveSheet.Columns(14).AutoFit
$AF= $Workbook.ActiveSheet.Columns(15).AutoFit
$AF= $Workbook.ActiveSheet.Columns(16).AutoFit
$AF= $Workbook.ActiveSheet.Select
$Workbook.ActiveSheet.Name = "Sys Info " + @WKSTA
Endif
$AF = $WorkBook.SaveAs($Output)
$Workbook = 0
$Excel.Quit()
$Excel = 0
Endif
EXIT @ERROR
EndFunction


Function DiskSpace(optional $drive,$format)
Dim $objWMIService, $sWQL, $colDrives, $objDrive
If Not $drive
$drive='%WINDIR%'
EndIf
$format=Val($format)
If $format<5
$format=IIf($format=1,1024,IIf($format=2,1024.0*1024,IIf($format=3,1024.0*1024*1024,IIf($format=4,1024.0*1024*1024*1024,1))))
$diskspace=Cdbl(GetDiskSpace($drive))/$format
$diskspace=Val($diskspace)
Else
$objWMIService=GetObject('WinMgmts:root/cimv2')
$sWQL = "Select Size, FreeSpace FROM Win32_LogicalDisk WHERE Name='"+Left($drive,2)+"'"
$colDrives=$objWMIService.ExecQuery($sWQL)
For Each $objDrive in $colDrives
$diskspace=Cdbl($objDrive.FreeSpace)/Cdbl($objDrive.Size)*100
$diskspace=Val($diskspace)
Next
EndIf
$objWMIService=0
Exit @ERROR
EndFunction

Function WMIQuery($sWhat, $sFrom, Optional $sComputer, $sWhere, $x, $root)
Dim $sQuery, $objEnum, $sValue, $sItem, $TMP, $SystemSet, $, $objInstance
If Not $sComputer $sComputer="." EndIf
If InStr($sComputer,'\') $sComputer=Right($sComputer,InStrRev($sComputer,'\')) EndIf
If Not $root $root="\root\cimv2" EndIf
$sQuery = "Select " + $sWhat + " From "+ $sFrom
If $sWhere And $x $sQuery = $sQuery+" Where "+$sWhere+" = '"+$x+"'" EndIf
$SystemSet = GetObject("winmgmts:{impersonationLevel=impersonate}!\\"+$sComputer+$root)
If @ERROR Exit Val("&"+Right(DecToHex(@ERROR),4)) EndIf
$objEnum = $SystemSet.ExecQuery($sQuery)
If @ERROR Exit Val("&"+Right(DecToHex(@ERROR),4)) EndIf
For Each $objInstance in $objEnum
If $objInstance
$=Execute("$"+"sValue = $"+"objInstance."+$sWhat)
If VarType($sValue) & 8192
For Each $sItem in $sValue $tmp=$tmp+'|'+Trim($sItem) Next
Else
$tmp=$tmp+'|'+Trim($svalue)
EndIf
EndIf
Next
$WMIQuery = Split(SubStr($tmp,2),'|')
$SystemSet=0
Exit Val("&"+Right(DecToHex(@ERROR),4))
EndFunction

Function GetBIOSInfo()
Dim $sComputer, $WMIService, $BIOSItems, $BIOSName, $BIOSVersion, $SMBIOSVersion
Dim $Item, $SerialNumber, $Manufacturer, $BIOSArray[4]
$sComputer = ''
$WMIService = GetObject('WinMgmts:root/cimv2')
$BIOSItems = $WMIService.ExecQuery( "Select * from Win32_BIOS where PrimaryBIOS = true", , 48 )
For Each $Item in $BIOSItems
$BIOSName = Trim($Item.Name)
$BIOSVersion = Trim($Item.Version)
$SMBIOSVersion = Trim($Item.SMBIOSBIOSVersion)
$SerialNumber = Trim($Item.SerialNumber)
$Manufacturer = Trim($Item.Manufacturer)
Next
$BIOSArray[0]=$BIOSName $BIOSArray[1]=$BIOSVersion $BIOSArray[2]=$SMBIOSVersion $BIOSArray[3]=$SerialNumber
$BIOSArray[4]=$Manufacturer
$GetBIOSInfo=$BIOSArray
EndFunction

Top
#117513 - 2005-10-11 03:14 PM Re: Mail the Software Inventory
Co Offline
MM club member
***

Registered: 2000-11-20
Posts: 1341
Loc: NL
Doc,

First of all I like your script in all it formats. I myself am very interested in the Excel or Database format because you can use it to audit the Configuration Database...


Edited by Co (2005-10-11 03:17 PM)
_________________________
Co


Top
#117514 - 2006-05-17 07:03 AM Re: Mail the Software Inventory
jeremyschubert Offline
Getting the hang of it

Registered: 2005-09-17
Posts: 89
Hi NTDOC,

Thanks for posting such a terrific script.

Problem - when I try run it on my XP machine at home, the spread sheet opens up with only row 1, columns a - p filled out.
Tomorrow I'll try it out at my school. Does it need to be run on a computer in a domain setting?

Thanks,
Jeremy
_________________________
---
Bishop Grandin Technology Department
'Either we're on time, or we're late'

Top
#117515 - 2006-05-17 07:31 AM Re: Mail the Software Inventory
NTDOC Administrator Offline
Administrator
*****

Registered: 2000-07-28
Posts: 11623
Loc: CA
Hi Jerremy,

Thanks.

I think you're probably running the bottom script which is just some User Info
and a bit of Hardware and does not include the Software.

If you want to see all the information for the Software then you can run this one.
I've removed the actual mailing portion of the script so you should be able to run it locally with or without a network.

Some of the code could probably be written a little better now days, but for the most part if works.

My home computer returns 287 items installed.

Break On
Dim $SO,$Software,$Application,$x,$File,$Send,$Excel,$Report
$SO=SetOption('Explicit','On')
$SO=SetOption('NoVarsInStrings','On')
$SO=SetOption('WrapAtEOL','On')

$Excel = ReadValue('HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\Excel.exe','')
$File = '%TEMP%\' + @USERID + '_' + @WKSTA + '.XLS'
If Exist($File)
Del $File
EndIf
$Software = QS(Split(GetSoftwareInfo(),@CRLF))
ImportToXLS($Software,$File)

If Exist($File)
$Report = $Excel+CHR(32)+$File
RUN $Report
EndIf
Exit 1

Function ImportToXLS($List,$Output)
Dim $Excel, $Workbook, $Row, $App, $, $Error
If VarType($List) <> 8204 ; Not a string array
EXIT 1 ; ERROR_INVALID_FUNCTION
Endif
$Excel = CreateObject("Excel.Application")
If $Excel
$Excel.DisplayAlerts = 0
$Workbook = $Excel.Workbooks.Add(-4167)
If $Workbook
$Workbook.ActiveSheet.Rows(1).Columns(1).Value = "Application"
$Workbook.ActiveSheet.Rows(1).Columns(1).Interior.Color = &EED2BD
$Workbook.ActiveSheet.Rows(1).Columns(1).Font.Bold = -1
$Workbook.ActiveSheet.Rows(1).RowHeight = 25
$Workbook.ActiveSheet.Rows(1).VerticalAlignment = 2
$Workbook.ActiveSheet.Rows(1).HorizontalAlignment = -4131
$Workbook.ActiveSheet.Rows(1).Columns(2).Value = "Path"
$Workbook.ActiveSheet.Rows(1).Columns(2).Interior.Color = &EED2BD
$Workbook.ActiveSheet.Rows(1).Columns(2).Font.Bold = -1
$Workbook.ActiveSheet.Rows(1).Columns(3).Value = "Version"
$Workbook.ActiveSheet.Rows(1).Columns(3).Interior.Color = &EED2BD
$Workbook.ActiveSheet.Rows(1).Columns(3).Font.Bold = -1
$Row = 2
For Each $App In $List
If Instr($App,"*")
$Workbook.ActiveSheet.Rows($Row).Columns(1).Value = Split($App,"*")[0]
$Workbook.ActiveSheet.Rows($Row).Columns(2).Value = Split($App,"*")[1]
$Workbook.ActiveSheet.Rows($Row).Columns(3).Value = Split($App,"*")[2]
$Row=$Row+1
Endif
Next
; This line adds a hyperlink into the worksheet
; $= $Workbook.ActiveSheet.Hyperlinks.Add($Workbook.ActiveSheet.Range("D4")
; ,"http://www.kixhelp.com",,"For further information on KiXtart please go here", "KiXhelp")

$= $Workbook.ActiveSheet.Columns(1).AutoFit
$= $Workbook.ActiveSheet.Columns(2).AutoFit
$= $Workbook.ActiveSheet.Columns(3).AutoFit
$= $Workbook.ActiveSheet.Select
$Workbook.ActiveSheet.Name = "Software Inventory"
Endif
$= $WorkBook.SaveAs($Output)
$Workbook = 0
$Excel.Quit()
$Excel = 0
Endif
EXIT @ERROR
EndFunction

Function GetSoftwareInfo()
Dim $HKLMAppPaths1, $HKLMAppPaths2, $App1, $App2, $Key, $SoftInfo, $Path,$AppName,$AppVer
Dim $DisplayName, $DisplayVersion, $FileVer
$HKLMAppPaths1 = 'HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths'
$HKLMAppPaths2 = 'HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall'
$App1=ArrayEnumKey($HKLMAppPaths1)
$App2=ArrayEnumKey($HKLMAppPaths2)
For Each $Key in $App1
$Path = ReadValue($HKLMAppPaths1 + "\" + $Key,"")
If Len($Path)
If InStr($Path,'%') $Path = ExpandEnvironmentVars($Path) EndIf
If InStr($Path,'"') $Path=Split($Path,'"')[1] EndIf
$Path = IIF(InStr($Key,'WRITE.EXE'),'',$Path)
$Path = IIF(InStr($Key,'winzip.exe'),'',$Path)
If Trim(GetFileVersion($Path,'FileDescription')) <> ""
If Trim(GetFileVersion($Path,'BinFileVersion'))='0.0.0.0'
$FileVer = 'FileVersion'
Else
$FileVer = 'BinFileVersion'
EndIf
$SoftInfo = $SoftInfo + Trim(GetFileVersion($Path,'FileDescription')) + CHR(42)
+ $Path + CHR(42) + Trim(GetFileVersion($Path,$FileVer)) + @CRLF
EndIf
EndIf
Next
For Each $Key in $App2
$DisplayName = ReadValue($HKLMAppPaths2 + "\" + $Key,'DisplayName')
$DisplayVersion = ReadValue($HKLMAppPaths2 + "\" + $Key,'DisplayVersion')
$DisplayName = IIF(InStr($SoftInfo,$DisplayName),'',$DisplayName)
$DisplayName = IIF(InStr($DisplayName,'ACDSee'),'',$DisplayName)
$DisplayName = IIF(InStr($DisplayName,'Adobe Acrobat 6.0'),'',$DisplayName)
$DisplayName = IIF(InStr($DisplayName,'Adobe Illustrator'),'',$DisplayName)
$DisplayName = IIF(InStr($DisplayName,'Adobe Photoshop 5.5'),'',$DisplayName)
$DisplayName = IIF(InStr($DisplayName,'Adobe Photoshop 6.0'),'',$DisplayName)
$DisplayName = IIF(InStr($DisplayName,'Adobe Photoshop 7.0'),'',$DisplayName)
$DisplayName = IIF(InStr($DisplayName,'Adobe Reader'),'',$DisplayName)
$DisplayName = IIF(InStr($DisplayName,'Alcohol 120'),'',$DisplayName)
$DisplayName = IIF(InStr($DisplayName,'Dreamweaver MX'),'',$DisplayName)
$DisplayName = IIF(InStr($DisplayName,'Fireworks MX'),'',$DisplayName)
$DisplayName = IIF(InStr($DisplayName,'Flash MX'),'',$DisplayName)
$DisplayName = IIF(InStr($DisplayName,'FreeHand MX'),'',$DisplayName)
$DisplayName = IIF(InStr($DisplayName,'LiveReg'),'',$DisplayName)
$DisplayName = IIF(InStr($DisplayName,'LiveUpdate'),'',$DisplayName)
$DisplayName = IIF(InStr($DisplayName,'MSN Messenger'),'',$DisplayName)
$DisplayName = IIF(InStr($DisplayName,'Macromedia FreeHand'),'',$DisplayName)
$DisplayName = IIF(InStr($DisplayName,'Microsoft Office FrontPage'),'',$DisplayName)
$DisplayName = IIF(InStr($DisplayName,'Microsoft Outlook'),'',$DisplayName)
$DisplayName = IIF(InStr($DisplayName,'Net2Phone'),'',$DisplayName)
$DisplayName = IIF(InStr($DisplayName,'RoboHelp Office'),'',$DisplayName)
$DisplayName = IIF(InStr($DisplayName,'SnagIt'),'',$DisplayName)
$DisplayName = IIF(InStr($DisplayName,'Symantec AntiVirus'),'',$DisplayName)
$DisplayName = IIF(InStr($DisplayName,'Windows Media Encoder'),'',$DisplayName)
If Len($DisplayName)
If Len($DisplayVersion)
$SoftInfo = $SoftInfo + Trim($DisplayName) + CHR(42) + Trim($Key) + CHR(42) + Trim($DisplayVersion) + @CRLF
EndIf
EndIf
Next
$GetSoftwareInfo=$SoftInfo
EndFunction


Function ArrayEnumKey($regsubkey)
Dim $retcode, $subkeycounter, $currentsubkey, $subkeyarray
If Not KeyExist($regsubkey)
Exit 87
EndIf
$subkeycounter=0
Do
$currentsubkey=EnumKey($regsubkey,$subkeycounter)
If Not @ERROR
ReDim Preserve $subkeyarray[$subkeycounter]
$subkeyarray[$subkeycounter]=$currentsubkey
$subkeycounter=$subkeycounter+1
EndIf
Until @ERROR
$arrayenumkey=$subkeyarray
Exit 0
EndFunction

Function QS($a)
DIM $b[32],$c[32],$d,$e,$f,$g,$h,$i,$j,$k,$l
$b[0]=0
$c[0]=Ubound($a)
$d=0
While $d >=0
$e=$b[$d]
$f=$c[$d]
While $e < $f
$h=$e+($f-$e)/2
$k=$a[$e]
$A[$e]=$A[$h]
$A[$h]=$k
$i=$e+1
$j=$f
$l=0
Do
While ($i<$j) And $A[$e] > $A[$i]
$i=$i+1
Loop
While ($j>=$i) And $A[$j] > $A[$e]
$j=$j-1
Loop
IF $i>=$j
$l=1
Else
$k=$A[$i]
$A[$i]=$A[$j]
$A[$j]=$k
$j=$j-1
$i=$i+1
EndIf
Until $l=1
$k=$a[$e]
$a[$e]=$a[$j]
$a[$j]=$k
$g=$j
If $g-$e <= $f - $g
If $g+1 < $f
$b[$d]=$g+1
$c[$d]=$f
$d=$d+1
EndIf
$f=$g-1
Else
If $g-1 > $e
$b[$d]=$e
$c[$d]=$g-1
$d=$d+1
EndIf
$e=$g+1
EndIf
Loop
$d=$d-1
Loop
$qs=$a
EndFunction

 

Top
#117516 - 2006-05-17 11:22 PM Re: Mail the Software Inventory
jeremyschubert Offline
Getting the hang of it

Registered: 2005-09-17
Posts: 89
Hi Doc,

I've tried it out and it works well. Thanks.
Correct me if I'm wrong, but while this script takes software inventory, the script you posted above does hardware inventory. So, I'm going to try and be ambitious (for me atleast) and combine the two. I'm going to try make it so tht the software shows up on one workbook and the hardware on another.

Don't expect me to be quick at this though. Finals are coming up so I have to get all my computer labs read!.

Jeremy
_________________________
---
Bishop Grandin Technology Department
'Either we're on time, or we're late'

Top
#117517 - 2006-05-18 01:17 AM Re: Mail the Software Inventory
NTDOC Administrator Offline
Administrator
*****

Registered: 2000-07-28
Posts: 11623
Loc: CA
Cool,

Let us know how it goes guy. See, isn't KiXing FUN

Top
#172577 - 2007-01-09 03:22 PM Re: Mail the Software Inventory [Re: NTDOC]
Phoenix1987 Offline
Fresh Scripter

Registered: 2007-01-02
Posts: 49
Loc: Rotterdam, Netherlands
ive tried the software script. Its awesome.
there is only one thing. The mailing function isnt user friendly.
Maybe this script is written a while ago, but in outlook 2003 the user must press a butten 3 times before i receive the file.
1. Allow external program to use outlook (Warning could be a virus)
2. External program trying to sent email allow yes/no
3. Send button.

I was wondering and even tried it myself. Cant u make it so that there will be no mail sent, but that the file is copied to the network. That way u can also check, if the file exsist dont perform the inventarisation. So the login script is taking long for only 1 time, or untill i delete the file to refresh it.
Im a kix beginner so cant do it myself. Is there anybody that can help me with this

PLeeeeaaaseeee \:D
_________________________
A mistake is Human, But to make it a real mess you need a computer.

Top
#172622 - 2007-01-10 01:55 PM Re: Mail the Software Inventory [Re: Phoenix1987]
Phoenix1987 Offline
Fresh Scripter

Registered: 2007-01-02
Posts: 49
Loc: Rotterdam, Netherlands
Originally Posted By: Phoenix1987
ive tried the software script. Its awesome.
there is only one thing. The mailing function isnt user friendly.
Maybe this script is written a while ago, but in outlook 2003 the user must press a butten 3 times before i receive the file.
1. Allow external program to use outlook (Warning could be a virus)
2. External program trying to sent email allow yes/no
3. Send button.

I was wondering and even tried it myself. Cant u make it so that there will be no mail sent, but that the file is copied to the network. That way u can also check, if the file exsist dont perform the inventarisation. So the login script is taking long for only 1 time, or untill i delete the file to refresh it.
Im a kix beginner so cant do it myself. Is there anybody that can help me with this

PLeeeeaaaseeee \:D


PLease :P
_________________________
A mistake is Human, But to make it a real mess you need a computer.

Top
#172626 - 2007-01-10 03:53 PM Re: Mail the Software Inventory [Re: Phoenix1987]
Gargoyle Offline
MM club member
*****

Registered: 2004-03-09
Posts: 1597
Loc: Valley of the Sun (Arizona, US...
Look at the post # #117515 just a few up from here, and it does not have the mail function enabled on it.

You can simply copy the $file to wherever you like.
_________________________
Today is the tomorrow you worried about yesterday.

Top
#172628 - 2007-01-10 04:46 PM Re: Mail the Software Inventory [Re: Gargoyle]
Phoenix1987 Offline
Fresh Scripter

Registered: 2007-01-02
Posts: 49
Loc: Rotterdam, Netherlands
ok , but the script runs Excel. i dont want that. and i cant find the file anywhere \:o
_________________________
A mistake is Human, But to make it a real mess you need a computer.

Top
#172638 - 2007-01-10 07:31 PM Re: Mail the Software Inventory [Re: Phoenix1987]
Gargoyle Offline
MM club member
*****

Registered: 2004-03-09
Posts: 1597
Loc: Valley of the Sun (Arizona, US...
Then remove this section -
Code:
If Exist($File)  
  $Report = $Excel+CHR(32)+$File  
  RUN $Report
EndIf
Exit 1


As to the location it tells you with this section -
Code:
$File = '%TEMP%\' + @USERID + '_' + @WKSTA + '.XLS'


To move it -
Code:
copy $file "\\server\share\directory"


Edited by Gargoyle (2007-01-10 07:32 PM)
_________________________
Today is the tomorrow you worried about yesterday.

Top
#172684 - 2007-01-11 01:06 PM Re: Mail the Software Inventory [Re: Gargoyle]
Phoenix1987 Offline
Fresh Scripter

Registered: 2007-01-02
Posts: 49
Loc: Rotterdam, Netherlands
ok that works thanks.

But know i want if the file exist that the software script wil stop, but that he does continue with the kix
_________________________
A mistake is Human, But to make it a real mess you need a computer.

Top
Page 1 of 3 123>


Moderator:  Glenn Barnas, NTDOC, Arend_, Jochen, Radimus, Allen, ShaneEP, Ruud van Velsen, Mart 
Hop to:
Shout Box

Who's Online
2 registered (morganw, mole) and 414 anonymous users online.
Newest Members
gespanntleuchten, DaveatAdvanced, Paulo_Alves, UsTaaa, xxJJxx
17864 Registered Users

Generated in 0.079 seconds in which 0.028 seconds were spent on a total of 14 queries. Zlib compression enabled.

Search the board with:
superb Board Search
or try with google:
Google
Web kixtart.org