Hi All
I have a dilemma, I have to install the SAP Duet Client for Microsoft onto 200 machines.
The problem that I have is that there is 6 components that needs to be on, before I can install the client


  1. Dot Net Framework 2.0
    [/align]

  2. Microsoft Windows Installer 3.1 which reboots the pc
    [/align]

  3. Microsoft KB899317
    [/align]

  4. Microsoft KB907417
    [/align]

  5. Microsoft Office 2003 Smart Tags
    [/align]

  6. Microsoft Duet Client Visual Studio Tools
    [/align]

  7. SQL Express
    [/align]

  8. Microsoft Duet Client 2005
    [/align]

What is the best way to do this? We are using SMS2003 to deploy the apps. I know that creating dependencies in SMS for applications is really troublesome and I am not a VB fundi (if a script is the best idea)
Any ideas
Thanks
0 Comments   [ + ] Show Comments

Comments

Please log in to comment

Rating comments in this legacy AppDeploy message board thread won't reorder them,
so that the conversation will remain readable.

Answers

0
@Moderators,
What happened to the response I posted to this when it was in the 'Windows Installer Errors' forum? :(
Answered 03/07/2008 by: VBScab
Red Belt

Please log in to comment
0
Apologies VBScab, I meant to ask you. They already are exe's files and msi's with transforms. I can deploy all of them unattended.
Are you referring to an application that can take all those exe's and msi's and create just one exe?
Thanks
Answered 03/11/2008 by: cduplessis
Orange Senior Belt

Please log in to comment
0
ORIGINAL: cduplessis
Are you referring to an application that can take all those exe's and msi's and create just one exe?
The gist of my reply, IIRC, was that you could create a wrapper EXE. The two main protagonists in MSI-authoring provide a means to do this quite straightforwardly.
Answered 03/11/2008 by: VBScab
Red Belt

Please log in to comment
0
Could you write a small batch file that simply executes each installation using the START /WAIT command, meaning each executed thread will wait until completed before moving to the next?

EG:
START /WAIT MSIEXEC /i App1.msi
START /WAIT MSIEXEC /i App2.msi
etc
?
Answered 03/11/2008 by: dm1
Blue Belt

Please log in to comment
0
here ya go, i stripped a bunch of stuff out for your requirements should be ok. im sure you get the idea..


INSTALL mode...
Invoked: cscript Multi-Install.vbs (installs - using "multi-install.xml")
cscript Multi-Install.vbs /I (installs - using "multi-install.xml")
cscript Multi-Install.vbs /I /somefile.xml (installs - using "somefile.xml")
Notes:
* all <Install> tags are actioned (installed)
* all <ProductCode> tags have their associated product removed

UNINSTALL mode...
Invoked: cscript Multi-Install.vbs /U (uninstalls - using "multi-install.xml")
cscript Multi-Install.vbs /U /somefile.xml (uninstalls - using "somefile.xml")
Notes:
* all <Uninstall> tags are actioned for non-MSI's such as .exe .cmd .vbs
* all MSI/MSP's which have entries under <Install> tags are automatically removed
* MSI/MSP/s do not need <Uninstall> tags

Package tag: = Name, Vendor, Version, Cr number, Sw number, RegKeys (Y/N)

Tags for each action:

<Name> = The name of the action being taken, include the product name here
<Install> = The name of the install filename
For MSI/MSP only include the filename
For .exe's, .vbs, .cmd, etc, include any command-line switches, etc
<Uninstall> = The uninstall command-line
For .exe's, .vbs, .cmd, etc, include any command-line switches, etc
<Transform> = The transform filename, if required
<Options> = Options/Properties to append to the MSI/MSP command-line, only for MSI/MSP use
<Productcode> = The ProductCode of an already-installed MSI to be uninstalled

All files that are executed must exist in the same path as this file
If you do not require this script to write the Corp registry keys set RegKeys="N"
All tags are case-sensitive
All log files will be created in C:\Build, MSI logs are created by default
Filenames should not include spaces

For MSI's and MSP's:
The default UI switch will be /QN unless otherwise specified by using the <Options> tag
For MSP uninstall, use the <Uninstall> tag and include the source ProductCode and the
patch ProductCode as per the example below
-->

<Package Name="blah blah" Vendor="MS" Version="8.0.50728" >

<Actions>
<Action>
<Name>App A</Name>
<Install>install.exe /q</Install>
<Productcode>{44D4AF75-6870-41F5-9181-662EA05507E1}</Productcode>
</Action>

<Action>
<Name>App B</Name>
<Install>test\install.exe /q</Install>
<Uninstall>wcu\j#RedistCore\jsredist.msi /qn</Uninstall>
</Action>

<Action>
<Name>dsfdsfdsfdsfdsf dsf sdf sdf </Name>
<Install>vs_setup.msi</Install>
<Transform>blahblah.mst</Transform>
</Action>

<Action>
<Name>Installation_IIS_5.1</Name>
<Install>Build\Installation_IIS_5.1.vbs</Install>
</Action>

<Action>
<Name>Set permissions</Name>
<Install>secedit.exe /configure /db secedit.sdb /areas FILESTORE REGKEYS /cfg "C:\Build\test_Perms.inf" /log "C:\Build\test_Perms.log"</Install>
</Action>

</Actions>

</Package>


Set sobjShell = CreateObject("Wscript.Shell")
Set sobjFSO = CreateObject("Scripting.FileSystemObject")
Set sobjXML = CreateObject("MSXML.DOMDocument")
sobjXML.async = false
if not sobjFSO.FolderExists("c:\build") then sobjFSO.CreateFolder("c:\build")
sstrPath = Left(Wscript.ScriptFullName,InStrRev(Wscript.ScriptFullName,"\"))
sstrXMLFile = sstrPath & "\Multi-Install.xml"
sstrMSILogpath = "c:\build\"

'-- Check for uninstall argument in the command string
If (Wscript.Arguments.Count = 1) Then
If (UCase(Wscript.Arguments(0)) = "/U") Then
sstrInstType = "Uninstall"
Else
sstrInstType = "Install"
End If
Else
sstrInstType = "Install"
End If
'-- Read the actions XML file
sobjXML.load sstrXMLFile
Set sobjPackage = sobjXML.selectSingleNode("//Package")
sstrPackageName = sobjPackage.GetAttribute("Name")

sstrLogFile = sstrMSILogpath & sstrPackageName & " " & ".log"

Set sobjActions = sobjXML.selectSingleNode("//Actions")
For each sobjNode in sobjActions.childNodes
sstrActionName = sobjNode.selectSingleNode("Name").text
sstrActionInstall = sobjNode.selectSingleNode("Install").text
sstrActionTransform = sobjNode.selectSingleNode("Transform").text
sstrActionUninstall = sobjNode.selectSingleNode("Uninstall").text
sstrActionOptions = sobjNode.selectSingleNode("Options").text
sstrActionType = sobjFSO.GetExtensionName(sstrPath & sstrActionInstall)
if sstrInstType = "Install" then
select case ucase(sstrActionType)
case "MSI"
Call RunMSI(sstrActionInstall, sstrActionTransform, sstrActionOptions)
case "MSP"
Call RunMSP(sstrActionInstall)
case "VBS"
Call RunVBS(sstrActionInstall, sstrActionOptions)
case else
Call RunEXE(sstrActionInstall, sstrActionOptions)
end select
else
select case ucase(sstrActionType)
case "MSI"
Call RemoveMSI(sstrActionInstall, "", sstrActionOptions)
case "MST"
Call RemoveMSI(sstrActionInstall, sstrActionTransform, sstrActionOptions)
case "MSP"
Call RemoveMSP(sstrActionInstall)
case else
Call RunEXE(sstrActionUnistall, sstrActionUninstall)
end select
End If
Next
LogInfo "All actions have been processed, execution complete."
sobjShell.RegWrite sstrRootKey & "Status", sstrInstType & "ed"
WScript.Quit 0
' ------------------------------------------------------------------------------
' Sub: LogInfo
' Inputs: msg
'
' Purpose: Writes %msg% to log
' ------------------------------------------------------------------------------
Sub LogInfo(msg)
Const ForAppending = 8
WScript.Echo msg
Set sobjLogFile = sobjFSO.OpenTextFile(sstrLogFile, ForAppending, True)
sobjLogFile.WriteLine msg
sobjLogFile.Close
Set sobjLogFile = Nothing
End Sub
' ------------------------------------------------------------------------------
' Function: RunMSI
' Inputs: strMSI - Name of MSI can contain spaces
' strMST - Name of MST can contain spaces (optional)
' strOptions - MSI options (usually at least /qb)
'
' Purpose: Executes an MSI / MST with MSI based parameters
' Returns: String with return code interpretation
' ------------------------------------------------------------------------------
function runMSI(strMSI, strMST, strOptions)
on error resume next
err.clear
dim strMSIlog, strCommand, strExecute, strFilename, intRet
strMSIlog = sstrMSILogpath & sstrActionName & " - " & sstrPackageCR & " - " & sstrInstType & ".log"
if strMST = "" then
strCommand = " /l*v " & chr(34) & strMSIlog & chr(34)
else
strCommand = " TRANSFORMS=" & chr(34) & sstrPath & strMST & chr(34) & " /l*v " & chr(34) & strMSIlog & chr(34)
end if
if NOT strOptions = "" then strCommand = strCommand & " " & strOptions
strExecute = "/i " & Chr(34) & sstrPath & strMSI & Chr(34) & strCommand
LogInfo ("Running command: msiexec.exe " & strExecute)
intRet = sobjShell.Run("msiexec.exe " & strExecute ,1,1)
if intRet <> "0" OR intRet <> "3010" then runMSI = SetReturnText(intRet)
LogInfo ("MSIEXEC: " & strExecute & vbcrlf _
& ", result=" & RunMSI & vbCRLF)
strOptions = null
end function
' ------------------------------------------------------------------------------
' Function: RemoveMSI
' Inputs: strMSI - Name of MSI can contain spaces
' strOptions - MSI options (usually at least /qb)
' strMST - Name of MST can contain spaces (optional)
'
' Purpose: Executes an MSI / MST with MSI based parameters
' Returns: String with return code interpretation
' ------------------------------------------------------------------------------
function RemoveMSI(strMSI, strMST, strOptions)
on error resume next
err.clear
dim strMSIlog, strCommand, strExecute, strFilename, intRet
strMSIlog = sstrMSILogpath & sstrActionName & " - " & sstrPackageCR & " - " & sstrInstType & ".log"
if strMST = "" then
strCommand = " /l*v " & chr(34) & strMSIlog & chr(34)
else
strCommand = " TRANSFORMS=" & chr(34) & sstrPath & strMST & chr(34) & " /l*v " & chr(34) & strMSIlog & chr(34)
end if
if NOT strOptions = "" then strCommand = strCommand & " " & strOptions
strExecute = "/x " & Chr(34) & sstrPath & strMSI & Chr(34) & strCommand
LogInfo ("Running command: msiexec.exe " & strExecute)

intRet = sobjShell.Run("msiexec.exe " & strExecute ,1,1)
if intRet <> "0" OR intRet <> "3010" then removeMSI = SetReturnText(intRet)
LogInfo ("MSIEXEC: " & strExecute & vbcrlf _
& ", result=" & removeMSI & vbCRLF)
strOptions = null
end function
' ------------------------------------------------------------------------------
' Function: RunMSP
' Inputs: strMSP - Name of MSP can contain spaces
'
' Purpose: Executes an MSP
' Returns: String with return code interpretation
' ------------------------------------------------------------------------------
function RunMSP(sMSP)
on error resume next
err.clear
dim sMSPlog, strCommand, strExecute, strFilename, intRet
strMSPlog = sstrMSILogpath & sstrActionName & " - " & sstrPackageCR & " - " & sstrInstType & ".log"
strCommand = " ALLUSERS=1 /l*v " & chr(34) & sMSPlog & chr(34) & " /qb- REINSTALL=ALL REINSTALLMODE=omus"
strExecute = "/p " & Chr(34) & sstrPath & sMSP & Chr(34) & strCommand
LogInfo ("Running command: msiexec.exe " & strExecute)
intRet = sobjShell.Run("msiexec.exe " & strExecute ,1,1)
if intRet <> "0" OR intRet <> "3010" then runMSP = SetReturnText(intRet)
LogInfo ("MSIEXEC: " & strExecute & vbcrlf _
& ", result=" & RunMSI & vbCRLF)

end function
' ------------------------------------------------------------------------------
' Sub: RunEXE
' Inputs: strEXE - Name of EXE can contain spaces
'
' Purpose: Executes an EXE with associated arguments / options
' ------------------------------------------------------------------------------
sub RunEXE(strEXE, strOptions)
dim intRet, strPath
strPath = sstrPath
if Not sobjFSO.FileExists(strPath & strExe) then strPath = ""
LogInfo ("Running command: " & Chr(34) & strPath & strExe & " " & strOptions &Chr(34))
if strOptions = "" then
intRet = sobjShell.Run(Chr(34) & strPath & strExe & Chr(34),1,1)
else
intRet = sobjShell.Run(Chr(34) & strPath & strExe & Chr(34) & " " & strOptions,1,1)
end if
if intRet = 0 then
Loginfo("EXEC: " & strPath & strExe & ", result=" & intRet & vbCRLF)
else
Loginfo("EXEC: " & strPath & strExe & ", result=failed" & vbCRLF)
end if
end sub

'================================================================================================================================
' ------------------------------------------------------------------------------
' Sub: RunVBS
' Inputs: strVBS - Name of EXE can contain spaces
' strOptions - command-line options to send to VBS
'
' Purpose: Executes an VBS using cscript.exe with associated arguments / options
' ------------------------------------------------------------------------------
sub RunVBS(strVBS, strOptions)
dim intRet, strPath
strPath = sstrPath
LogInfo ("Running command: cscript.exe " & Chr(34) & strPath & strVBS & " " & strOptions &Chr(34))
if strOptions = "" then
intRet = sobjShell.Run("cscript.exe " & Chr(34) & strPath & strVBS & Chr(34),1,1)
else
intRet = sobjShell.Run("cscript.exe " & Chr(34) & strPath & strVBS & Chr(34) & " " & strOptions,1,1)
end if
if intRet = 0 then
Loginfo("EXEC: cscript.exe " & strPath & strVBS & ", result=" & intRet & vbCRLF)
else
Loginfo("EXEC: cscript.exe " & strPath & strVBS & ", result=failed" & vbCRLF)
end if
end sub
'================================================================================================================================
Answered 03/13/2008 by: jmcfadyen
Fifth Degree Black Belt

Please log in to comment
Answer this question or Comment on this question for clarity