Wednesday, October 14, 2009

Need help, drop me a line

I just signed up for Google Voice and put a widget to the right that will connect you directly to my voicemail.  (Sorry, no live calls...).  If you need help with something, feel free to leave me a voicemail and I'll return your call.


Binary HTTP Download

Accessing files via vbscript is easy enough using the FileSystemObject.  You probably already know how to create the object, get a file, copy it, delete it, and lots of other cool things.  But what if the file isn't on the local machine or server?  What if the file is on a web server?  You certainly can't access it like a machine on your local intranet. 

Does that mean you can't access those files?  Using the routine below you can.  Here's the scenario that prompted this code.  I was writing an application in HTA that needed to reference a file on the web that is updated quite frequently.  I could have copied it to a local server and used FSO to access it but that means more administrative overhead for me.  If the application had HTTP access, why not let it download the file?  After some research it turns out you can use the MSXML object to download files directly to your computer.  Check it out:

Sub httpBinaryDownload(sstrURL2,sstrPath2)
        Set sobjFSO = Createobject("Scripting.FileSystemObject")
        sarrURL = Split(sstrURL2,"/")
        sstrFile = sarrURL(UBound(sarrURL))
        sstrFullPath = sstrPath2 & "\" & sstrFile
        Set sobjXMLHTTP = CreateObject("MSXML2.XMLHTTP")
     "GET", sstrURL2, False
        If sobjXMLHTTP.Status = 200 Then
          Set sobjADOStream = CreateObject("ADODB.Stream")
          sobjADOStream.Type = 1 'adTypeBinary
          sobjADOStream.Write sobjXMLHTTP.ResponseBody
          sobjADOStream.Position = 0    'Set the stream position to the start
            If sobjFSO.Fileexists(sstrFullPath) Then sobjFSO.DeleteFile sstrFullPath
          Set sobjFSO = Nothing
          sobjADOStream.SaveToFile sstrFullPath
          Set sobjADOStream = Nothing
        End If
        Set sobjXMLHTTP = Nothing
    End Sub  

Note: If you are copying and pasting, be sure to fix the line breaks.

Now, this code takes in the http path of the file and the local folder path to save the file to.  It makes an MSXML object and ADODB stream to save the file locally.  It works fairly fast!  Test it out and if you run into trouble, let me know.

-Corey Thomas

Wednesday, April 1, 2009

Sorry for the absence. Did your heart grow fonder?

For the few, and by few I mean very few, that read these posts I want to come right out and say sorry.  Sorry I've been away so long!  I took a new job last year with <insert major global conglomeration> and have been completely swamped the past few months writing new code in HTA format for a new solution, possibly to be patented.  We'll have to see how that goes.

In celebration of the hard work I've been doing, I have decided to start some code examples on HTA programming and how you can add a spiffy GUI to your existing scripts.  Neat?  You bet.  Stay tuned and I promise not to leave you hanging.


Function GetChassisType

Just ran across the need to determine what kind of machine I am running a script on.  I needed to detect whether or not the machine was a laptop or desktop.  Just so happens that WMI provides a nifty class for this.

As you check out the function below, notice some of the really odd chassis types available.  How many of you have a "pizza box" or "lunchbox" chassis?


Function getChassisType(sstrComputer)
'Global: Dim intChassisType to reference by number
'Returns a string value of the type.    
    Set sobjWMIService = GetObject("winmgmts:" _
        & "{impersonationLevel=impersonate}!\\" & sstrComputer & "\root\cimv2")
    Set colChassis = sobjWMIService.ExecQuery _
        ("Select ChassisTypes from Win32_SystemEnclosure")
    For Each objChassis in colChassis
        For i = Lbound(objChassis.ChassisTypes) to Ubound(objChassis.ChassisTypes)
            intChassisType =  objChassis.ChassisTypes(i)
    Select Case intChassisType
        Case 1
            getChassisType = "Other"
        Case 2
            getChassisType = "Unknown"
        Case 3
            getChassisType = "Desktop"
        Case 4
            getChassisType = "Low Profile Desktop"
        Case 5
            getChassisType = "Pizza Box"
        Case 6
            getChassisType = "Mini Tower"
        Case 7
            getChassisType = "Tower"
        Case 8
            getChassisType = "Portable"
        Case 9
            getChassisType = "Laptop"
        Case 10
            getChassisType = "Notebook"
        Case 11
            getChassisType = "Hand Held"
        Case 12
            getChassisType = "Docking Station"
        Case 13
            getChassisType = "All in One"
        Case 14
            getChassisType = "Sub Notebook"
        Case 15
            getChassisType = "Space-Saving"
        Case 16
            getChassisType = "Lunch Box"
        Case 17
            getChassisType = "Main System Chassis"
        Case 18
            getChassisType = "Expansion Chassis"
        Case 19
            getChassisType = "SubChassis"
        Case 20
            getChassisType = "Bus Expansion Chassis"
        Case 21
            getChassisType = "Peripheral Chassis"
        Case 22
            getChassisType = "Storage Chassis"
        Case 23
            getChassisType = "Rack Mount Chassis"
        Case 24
            getChassisType = "Sealed-Case PC"
        Case Else
            getChassisType = "Unknown"
    End Select
    Set sobjWMIService = Nothing     
End Function


Enjoy the code and as always, let me know if this script helps you out!


-Corey Thomas

MCSE/MCSA/MCDBA/Security+,CIW Associate