MSI Installer Limitations
by dwarfsoft on Aug.28, 2008, under Novell, Scripting, Study, Work
I have spent the last few days creating a few MSI packages and fixing some pre-existing MSI packages. One issue that I found with working on an MSI that installs files to a Hidden partition is that InstallShield has very little in the way of control over partitions, mountpoints and the like. This was not really an issue, as I am using a SOE and can Mount Volumes through VBScript.
The one issue that we had with mounting this specific Volume is that if a USB Drive or a Virtual CD/DVD drive is installed on the machine, it modifies the volume numbering scheme. The volume we were previously attempting to mount was Volume 3. This became Volume 4 in the even that another drive was connected, or a higher number depending on how the USB drive was partitioned.
Not a grand issue, but one that was overlooked by the Corporate boys when they released one of their imaging tools (the hidden volume is the Image volume). I modified their install script to use a bit more smarts when attempting to find the volume it needs.
Function GetImageVolumeNumber On Error Resume Next Const ForWriting = 2 Const ForReading = 1 Set oShell = CreateObject("WScript.Shell") Set oFSO = CreateObject("Scripting.FileSystemObject") Set oFile = oFSO.OpenTextFile( oShell.ExpandEnvironmentStrings("C:\Temp\dp.txt"),ForWriting,True ) oFile.WriteLine("LIST VOLUME") oFile.Close() set proc = oShell.Exec ("diskpart /s C:\Temp\dp.txt") Ouptut = "" Str = "" Do while Not proc.StdOut.AtEndOfStream Str = proc.StdOut.ReadLine If InStr(Str,"Volume") > 0 Then If Not (Mid(Str,10,3) = "###") Then DriveLetter = Mid(Str,16,1) VolumeNumber = Trim(Mid(Str,10,3)) If StrComp(Mid(Str,20,5),"IMAGE")=0 Then GetImageVolumeNumber = VolumeNumber Exit Function End If End If End If Loop End Function |
This function simply uses the output from DiskPart in order to find the number of the volume named “IMAGE”. This is then returned to the call point and can be used in place of the previous DiskPart calls to “SELECT VOLUME 3” and “ASSIGN MOUNT=C:\Temp\Image”. The only issue with this Shell Exec call is that it cannot be hidden, as then we cannot retrieve the output. This is not a real issue as the Console screen should just flash up and close quickly. Alternatively I could have fed the output into a text file and read it from that, but part of me is always interested in seeing new ways to do things, which was reading from StdOut in this instance.
So this leaves my MSI to be a shell that copies files to an “install” location, then runs a VBScript that mounts the volume and copies those files to the Image Drive. Not ideal, but the best solution I have at the moment. The Corporate guys are considering implementing this in the next version of the Imaging Tool, but in the meantime I will simply replace all the buggy files for my own Administrative Area.
Oh, and I know somebody is going to mention the Shell ExpandEnvironmentStrings call that is unneccessary. This is because it was originally using %temp%. I left it there for now in case I start using %temp% again. Then I can just do a find-replace for “C:\Temp” to “%Temp%” to return it to its previous functionality.
Cheers, Chris.
You must be logged in to post a comment.