' Script to run during a Longhorn Terminal Server client install
' First a down-level MSI database transform is applied for any MSI installed Terminal Server client
' Second, 

' Script to apply a down-level MSI database transform for a Remote Desktop client installs
' 2/27/2006

Option Explicit

Const msiOpenDatabaseModeReadOnly     = 0
Const msiOpenDatabaseModeTransact     = 1
Const msiOpenDatabaseModeCreate       = 3

Const suppressXFormErrors             = 63

' Source transform files for this platform.  These files are in the same directory as this install script.
Const wxpXForm = "WXPRD.MST"            ' WinXP install
Const wxpsp1XForm = "WXPSP1RD.MST"      ' WinXP SP1 install
Const wxpsp2XForm = "WXPSP2RD.MST"      ' WinXP SP2 install
Const w2k3XForm = "W2K3RD.MST"          ' Win2K3 install
Const w2k3sp1XForm = "W2K3S1RD.MST"     ' Win2K3 SP1 install

' NOTE: Use the MSISearch.exe console application to search \\products\public\... MSI files for product codes.

' Target MSI product codes for the WinXP platform install
Dim wxpProductCodes(9)
wxpProductCodes(0) = "{3E713D52-C967-41FB-AA24-3A92CC1025A4}"       ' LangCode = 1033, en-us
wxpProductCodes(1) = "{4DEEE869-7CA9-48C9-B219-105DF2BE3D6B}"       ' LangCode = 1040, it-it
wxpProductCodes(2) = "{60B9A48D-559E-43FA-8F28-D657190E4E52}"       ' LangCode = 1033, en-us
wxpProductCodes(3) = "{62416B78-C0F2-46ED-963C-F38064F7F0DB}"	    ' LangCode = 1033, en-us
wxpProductCodes(4) = "{62C4121D-CA64-413E-8444-0525FF7E8EF9}"	    ' LangCode = 1031, de-de
wxpProductCodes(5) = "{82217086-FCE7-41F8-8512-77C42583DB69}"	    ' LangCode = 1043, nl-nl
wxpProductCodes(6) = "{ACC2D401-9724-415D-BDA4-D2E96C650648}"	    ' LangCode = 1044, no-no
wxpProductCodes(7) = "{D81A311F-D26B-4BDA-8A44-0B608DF49BEF}"	    ' LangCode = 2052, zh-cn
wxpProductCodes(8) = "{DDB41B52-55BB-47DE-ADBC-057A466DC1CA}"	    ' LangCode = 1030, da

' Target MSI product codes for the WinXP SP1 platform install
Dim wxpsp1ProductCodes(24)
wxpsp1ProductCodes(0) = "{048C1B35-1B4D-4524-8D80-407CD00C9402}"    ' LangCode = 1036, fr-fr
wxpsp1ProductCodes(1) = "{188D0CE7-A37B-4495-B501-AEA2BA048D87}"    ' LangCode = 1055, tr
wxpsp1ProductCodes(2) = "{19BD26B5-9947-475A-984F-40BC0D83C3C3}"    ' LangCode = 1033, en-us
wxpsp1ProductCodes(2) = "{2F7E500B-ADD4-4088-AC7A-6C29B3D1B56B}"    ' LangCode = 2052, zh-cn
wxpsp1ProductCodes(4) = "{45F2A1EA-3967-4D7C-9AA2-0E24AAD6A40C}"    ' LangCode = 2070, pt-pt
wxpsp1ProductCodes(5) = "{4B3E6767-2BCC-4790-9CFF-38CB88337FA9}"    ' LangCode = 1046, pt-br
wxpsp1ProductCodes(6) = "{4C099CB3-E0E4-45BB-9C60-B1193CA47638}"    ' LangCode = 1042, ko
wxpsp1ProductCodes(7) = "{60B9A48D-559E-43FA-8F28-D657190E4E52}"    ' LangCode = 1033, en-us (ar, he)
wxpsp1ProductCodes(8) = "{69A0ACF7-8FFC-47D0-94E4-B6844AB23FC3}"    ' LangCode = 1049, ru
wxpsp1ProductCodes(9) = "{73EF628D-0D47-4DC9-841E-E65A9EF56BCD}"    ' LangCode = 1045, pl
wxpsp1ProductCodes(10) = "{77BF3069-851C-4DAC-8507-844E91826133}"   ' LangCode = 1029, cs
wxpsp1ProductCodes(11) = "{7EB86FD8-065B-46F2-8D1C-8A6CD77011AE}"   ' LangCode = 1041, ja
wxpsp1ProductCodes(12) = "{82AE5DA6-4D28-40C2-BF21-9F2B90EF488E}"   ' LangCode = 1033, en-us
wxpsp1ProductCodes(13) = "{8CBB3FAD-D1DE-4B40-B82D-C8913DE4AFEC}"   ' LangCode = 1043, nl-nl
wxpsp1ProductCodes(14) = "{8D97DFD0-90C0-4C02-ACD6-18C6222122D0}"   ' LangCode = 1038, hu
wxpsp1ProductCodes(15) = "{9C40734E-C106-43B3-BB50-4FFB8EF33C93}"   ' LangCode = 1053, sv-se
wxpsp1ProductCodes(16) = "{A1B14276-72BF-4865-8E70-827010E2DDF8}"   ' LangCode = 1040, it-it
wxpsp1ProductCodes(17) = "{ACC2D401-9724-415D-BDA4-D2E96C650648}"   ' LangCode = 1044, no-no
wxpsp1ProductCodes(18) = "{ACE34BA8-D212-48DB-B1E0-5E05271707F2}"   ' LangCode = 1028, zh-tw
wxpsp1ProductCodes(19) = "{C7A35E42-3957-4523-B793-39B92D7E4C77}"   ' LangCode = 1028, zh-tw
wxpsp1ProductCodes(20) = "{D6E11E91-AF22-4454-9665-0BBD1C110305}"   ' LangCode = 1031, de-de
wxpsp1ProductCodes(21) = "{D81A311F-D26B-4BDA-8A44-0B608DF49BEF}"   ' LangCode = 1035, fi (el, fi)
wxpsp1ProductCodes(22) = "{DDB41B52-55BB-47DE-ADBC-057A466DC1CA}"   ' LangCode = 1030, da
wxpsp1ProductCodes(23) = "{FB3E28CA-C097-40B4-A3BD-77CACF43A1DE}"   ' LangCode = 3082, es-es

' Target MSI product codes for the WinXP SP2 platform install
Dim wxpsp2ProductCodes(36)
wxpsp2ProductCodes(0) = "{0E31FAD5-5F2E-40B3-ABAF-086AECECD3A1}"    ' LangCode = 1033, en-us
wxpsp2ProductCodes(1) = "{1A145C39-5344-4FBC-BD65-2C178D782405}"    ' LangCode = 1046, pt-br
wxpsp2ProductCodes(2) = "{25DB82FC-E42D-4D79-B25D-93CC8B3C83DC}"    ' LangCode = 2070, pt-pt
wxpsp2ProductCodes(3) = "{3E713D52-C967-41FB-AA24-3A92CC1025A4}"    ' LangCode = 1033, en-us
wxpsp2ProductCodes(4) = "{50DE22EF-E283-4BA5-A499-98DEB34648C0}"    ' LangCode = 1049, ru
wxpsp2ProductCodes(5) = "{53FED547-6089-48E0-A640-5B1A87323F88}"    ' LangCode = 2052, zh-cn
wxpsp2ProductCodes(6) = "{549511D0-E5AF-4049-95F4-F233AF7E5253}"    ' LangCode = 1042, ko
wxpsp2ProductCodes(7) = "{5C6B4358-4EBF-43AE-9C74-76690CB4172F}"    ' LangCode = 1036, fr-fr
wxpsp2ProductCodes(8) = "{60B9A48D-559E-43FA-8F28-D657190E4E52}"    ' LangCode = 1033, en-us (ar, he)
wxpsp2ProductCodes(9) = "{62C4121D-CA64-413E-8444-0525FF7E8EF9}"    ' LangCode = 1031, de-de
wxpsp2ProductCodes(10) = "{65DF3237-1232-467E-8C47-5B9A582996E4}"   ' LangCode = 1043, nl-nl
wxpsp2ProductCodes(11) = "{671464CD-07BC-409A-995C-6E537F3F0568}"   ' LangCode = 1041, ja
wxpsp2ProductCodes(12) = "{76DA003B-CBCF-4756-84F3-BB605CB0238A}"   ' LangCode = 1045, pl
wxpsp2ProductCodes(13) = "{7B5870F5-304F-49E4-9B81-7451C0E595F0}"   ' LangCode = 3082, es-es
wxpsp2ProductCodes(14) = "{81610BE6-BF0B-42C2-BB9C-B7D1084290FA}"   ' LangCode = 1040, it-it
wxpsp2ProductCodes(15) = "{A4C8D492-AB9A-41A0-AF8C-9C2769DD1E6D}"   ' LangCode = 1053, sv-se
wxpsp2ProductCodes(16) = "{ACC2D401-9724-415D-BDA4-D2E96C650648}"   ' LangCode = 1044, no-no
wxpsp2ProductCodes(17) = "{AE9F5CF9-8539-4D80-B2ED-65A3D8ABFB52}"   ' LangCode = 1055, tr
wxpsp2ProductCodes(18) = "{B21A1FAD-9060-43BD-85EF-89F26DBDDB4A}"   ' LangCode = 1029, cs
wxpsp2ProductCodes(19) = "{C4EE1A62-C412-4B4D-816D-061128B5381B}"   ' LangCode = 1038, hu
wxpsp2ProductCodes(20) = "{D81A311F-D26B-4BDA-8A44-0B608DF49BEF}"   ' LangCode = 1035, fi (el, fi)
wxpsp2ProductCodes(21) = "{DDB41B52-55BB-47DE-ADBC-057A466DC1CA}"   ' LangCode = 1030, da
wxpsp2ProductCodes(22) = "{FC1C1D59-0E56-4C4B-80B2-A36B603EF64E}"   ' LangCode = 1028, zh-tw
wxpsp2ProductCodes(23) = "{0829EBD7-B354-4308-9500-26A9F5BAB37C}"   ' LangCode = 1028
wxpsp2ProductCodes(24) = "{104180F4-719E-44E8-B86F-F7B9F3EBD5C2}"   ' LangCode = 1033
wxpsp2ProductCodes(25) = "{36A28C49-B51E-4A1B-BDE4-3016259834A0}"   ' LangCode = 2052
wxpsp2ProductCodes(26) = "{695E8231-32BD-4139-B502-7B35F286E8F6}"   ' LangCode = 1040
wxpsp2ProductCodes(27) = "{7CDD6357-CB43-4830-8D2C-152AEE98088B}"   ' LangCode = 1029
wxpsp2ProductCodes(28) = "{9A0FEC92-F4C6-4190-B1D1-D52308E58CEF}"   ' LangCode = 1038
wxpsp2ProductCodes(29) = "{9C75D5E7-252D-4CA1-B42F-DF4E83521096}"   ' LangCode = 3082
wxpsp2ProductCodes(30) = "{DD1EE7BA-AF73-4183-8F44-C03F9E613DFC}"   ' LangCode = 1049
wxpsp2ProductCodes(31) = "{50DE22EF-E283-4BA5-A499-98DEB34648C0}"   ' LangCode = 1049
wxpsp2ProductCodes(32) = "{53FED547-6089-48E0-A640-5B1A87323F88}"   ' LangCode = 2052
wxpsp2ProductCodes(33) = "{5DEB2A35-9CDA-49A1-B9AA-D8FE4E5564E0}"   ' LangCode = 1028
wxpsp2ProductCodes(34) = "{806D0202-0F0D-4BA4-B348-448A37319990}"   ' LangCode = 1040
wxpsp2ProductCodes(35) = "{CDA7B0FC-15FB-462F-81E5-473162D05836}"   ' LangCode = 1036


' Target MSI product codes for the Win2K3 platform install
Dim w2k3ProductCodes(26)
w2k3ProductCodes(0) = "{0CCE003B-FB12-4E31-AAE1-AF1EEA173373}" 	    ' LangCode = 1045, pl
w2k3ProductCodes(1) = "{0E6993D3-4445-4B76-BEAE-917070BB4B7B}"      ' LangCode = 1043, nl-nl
w2k3ProductCodes(2) = "{116BB940-46EE-4452-8B5D-F552B9B710F6}"	    ' LangCode = 2052, zh-cn (simple)
w2k3ProductCodes(3) = "{28881FE9-F071-4E91-9056-A3D44D1A71E7}"	    ' LangCode = 1053, sv-se
w2k3ProductCodes(4) = "{35D027A4-57BA-4E59-94DB-DFB36FFFDC1E}"	    ' LangCode = 1033, en-us
w2k3ProductCodes(5) = "{483336E5-6C6E-481B-8F7D-DFDFB614C3D6}"	    ' LangCode = 3082, es-es
w2k3ProductCodes(6) = "{48A33815-DA40-4929-B665-FB14FA88D84B}"	    ' LangCode = 2070, pt-pt
w2k3ProductCodes(7) = "{4A206C4A-1D17-453C-8FEC-9F3BD8ABF05D}"	    ' LangCode = 1055, tr
w2k3ProductCodes(8) = "{52657E64-5500-44E9-BEF9-4BB2F706C168}"	    ' LangCode = 1038, hu
w2k3ProductCodes(9) = "{533EC88C-E3EC-46E2-86A5-4F40B7322C50}"	    ' LangCode = 1033, en-us
w2k3ProductCodes(10) = "{68C334F5-ECF8-4799-B0D8-1EA7C7E2FD5E}"	    ' LangCode = 1033, en-us
w2k3ProductCodes(11) = "{7279FE8E-B3C5-4858-9AB2-B72DCD7145DA}"	    ' LangCode = 1046, pt-br
w2k3ProductCodes(12) = "{80CA330E-0432-443B-8698-5AAC53882C36}"	    ' LangCode = 1042, ko
w2k3ProductCodes(13) = "{86B7355A-4160-45D6-89EA-E57F9A422ABD}" 	' LangCode = 1036, fr-fr
w2k3ProductCodes(14) = "{961B8EA6-AA4E-44B3-94B1-8AE34D06B414}"	    ' LangCode = 1031, de-de
w2k3ProductCodes(15) = "{A3AE4DE4-E2A3-452B-A249-47586EEE45CF}"	    ' LangCode = 1049, ru
w2k3ProductCodes(16) = "{BBD0063D-2177-4C67-9987-AC1D646A31EE}"	    ' LangCode = 1029, cs
w2k3ProductCodes(17) = "{C854EEAE-02A0-4849-B24B-FD3E6B213098}"	    ' LangCode = 1041, ja
w2k3ProductCodes(18) = "{D08BCAA5-6F87-455A-80FC-B46B9F90C0F9}"	    ' LangCode = 1033, en-us
w2k3ProductCodes(19) = "{D65D9BE2-EB8B-4267-AF18-07E93DFB8CBE}"	    ' LangCode = 1033, en-us
w2k3ProductCodes(20) = "{D67D66A7-7A12-487F-BE94-71CD0EFA58E3}"	    ' LangCode = 1033, en-us
w2k3ProductCodes(21) = "{DA1CF98B-D338-4BB6-B15F-80A1E87FF823}"	    ' LangCode = 1028, sz-tw (traditional, PanChin)
w2k3ProductCodes(22) = "{E0A75FC0-D531-4530-965D-6B66914A46F6}"	    ' LangCode = 1033, en-us
w2k3ProductCodes(23) = "{E3CCAB4C-108B-4D9E-A5B0-A24921DB1C42}"	    ' LangCode = 1033, en-us
w2k3ProductCodes(24) = "{F91CD0F6-D045-44F3-834E-38FA844A8F2F}"	    ' LangCode = 1028, sz_tw (traditional, TradChin)
w2k3ProductCodes(25) = "{FCF4B77A-9D90-4A47-8FE5-FF2B3D2F1CE5}"	    ' LangCode = 1040, it-it

' Target MSI product codes for the Win2K3 SP1 platform install
Dim w2k3sp1ProductCodes(27)
w2k3sp1ProductCodes(0) = "{1006255F-12EF-4B8C-96A1-6969555AEC12}"   ' LangCode = 1029, cs
w2k3sp1ProductCodes(1) = "{37A63585-68A9-479E-886C-7AF839DDDDEE}"   ' LangCode = 1031, de-de
w2k3sp1ProductCodes(2) = "{40D658EE-6524-4E59-BF40-8D3E89C17F30}"   ' LangCode = 1053, sv-se
w2k3sp1ProductCodes(3) = "{4DAE7947-672B-47D9-B4EE-71B5CC1ECF30}"   ' LangCode = 1055, tr
w2k3sp1ProductCodes(4) = "{5231FF0F-1DB0-4EFE-985F-BE640A9A6A2F}"   ' LangCode = 1043, nl-nl
w2k3sp1ProductCodes(5) = "{53B054FD-6037-4832-8DC8-1E8584D3215A}"   ' LangCode = 1041, ja
w2k3sp1ProductCodes(6) = "{574FFAFD-F176-4807-BE0B-6B4278C2C630}"   ' LangCode = 1046, pt-br
w2k3sp1ProductCodes(7) = "{5944D41A-1902-4CC4-B454-4FD74958B684}"   ' LangCode = 2070, pt-pt
w2k3sp1ProductCodes(8) = "{59C98CDB-5699-4F8F-92C9-DB70C33A9B57}"   ' LangCode = 1036, fr-fr
w2k3sp1ProductCodes(9) = "{5F2E4735-52F1-457B-8CF4-C226FE790B90}"   ' LangCode = 1042, ko
w2k3sp1ProductCodes(10) = "{7BC66CD9-E8A2-4CBA-AA23-E837529EE494}"  ' LangCode = 1045, pl
w2k3sp1ProductCodes(11) = "{832AC8C9-0BEF-4167-BEE9-4E84C338E3EF}"  ' LangCode = 1049, ru
w2k3sp1ProductCodes(12) = "{84A622C4-03A3-44FC-AB1A-99F44C317E5A}"  ' LangCode = 2052, zh-cn
w2k3sp1ProductCodes(13) = "{8D45A40C-3EB0-42B4-B827-61DF6A9E5DB9}"  ' LangCode = 1028, zh-tw
w2k3sp1ProductCodes(14) = "{9CE1CB00-FE6A-4364-913E-959E222B9526}"  ' LangCode = 1028, zh-tw
w2k3sp1ProductCodes(15) = "{A1E8F8D3-CB6B-43F4-B716-D9086204B0D9}"  ' LangCode = 1038, hu
w2k3sp1ProductCodes(16) = "{AFB5847C-242F-428C-BBD9-BD4311818CF9}"  ' LangCode = 1040, it-it
w2k3sp1ProductCodes(17) = "{B7F39004-BA30-4235-A4ED-A65CFC727D61}"  ' LangCode = 3082, es-es
w2k3sp1ProductCodes(18) = "{D08BCAA5-6F87-455A-80FC-B46B9F90C0F9}"  ' LangCode = 1033, en-us
w2k3sp1ProductCodes(19) = "{F874A799-5EF4-42C4-BE1C-F90D260A109F}"  ' LangCode = 1033, en-us
w2k3sp1ProductCodes(20) = "{1F572FD2-85C9-4A3C-9A26-1074AB2AE2BE}"  ' LangCode = 1033
w2k3sp1ProductCodes(21) = "{48BC47A4-71D9-4D63-89A9-63E652FD7721}"  ' LangCode = 1055
w2k3sp1ProductCodes(22) = "{78FC320F-79A2-41B2-9A18-FFCE786C6E0A}"  ' LangCode = 1033
w2k3sp1ProductCodes(23) = "{82D47B86-AA32-4DA1-BAD7-9907659FEA45}"  ' LangCode = 2052
w2k3sp1ProductCodes(24) = "{92929B56-2A96-4DAF-A800-85BF73307832}"  ' LangCode = 1028
w2k3sp1ProductCodes(25) = "{C166FA8A-69B0-49F3-9CF6-897DBBB369C4}"  ' LangCode = 1041
w2k3sp1ProductCodes(26) = "{E3304A54-688B-40C2-88D9-E1F4007790BF}"  ' LangCode = 1033


On Error Resume Next

' Windows shell object
Dim WshShell : Set WshShell = nothing
Set WshShell = Wscript.CreateObject("WScript.Shell") : CheckError

' Instantiate Windows Installer object
Dim installer : Set installer = Nothing
Set installer = Wscript.CreateObject("WindowsInstaller.Installer") : CheckError

' Windows directory
Dim WinDir : WinDir = WshShell.ExpandEnvironmentStrings("%WinDir%") : CheckError

Dim productCode

' WinXP platform : Loop through all possible product codes and apply MSI transform
For Each productCode In wxpProductCodes

    ApplyXForm productCode, installer, wxpXForm
    
Next


' WinXP SP1 platform : Loop through all possible product codes and apply MSI transform
For Each productCode In wxpsp1ProductCodes

    ApplyXForm productCode, installer, wxpsp1XForm
    
Next


' WinXP SP2 platform : Loop through all possible product codes and apply MSI transform
For Each productCode In wxpsp2ProductCodes

    ApplyXForm productCode, installer, wxpsp2XForm
    
Next


' Win2K3 platform : Loop through all possible product codes and apply MSI transform
For Each productCode In w2k3ProductCodes

    ApplyXForm productCode, installer, w2k3XForm
    
Next


' Win2K3 sp1 platform : Loop through all possible product codes and apply MSI transform
For Each productCode In w2k3sp1ProductCodes

    ApplyXForm productCode, installer, w2k3sp1XForm
    
Next


' Target MSI product codes for the WinXP platform install
Dim OcxGuids(1)
OcxGuids(0) = "{4EB89FF4-7F78-4A0F-8B8D-2BF02E94E4B2}"      'WinXP SP2 msrdp.ocx

Const Ocx = "msrdp.ocx"
Const OcxMUI = "msrdp.ocx.redist.mui"
Const AAClient = "aaclient.dll"
Const AAClientMUI = "aaclient.dll.redist.MUI"
Const Rhttpaa = "rhttpaa.dll"

' Registry key paths
Dim KeyCodeStore : KeyCodeStore = "HKLM\SOFTWARE\Microsoft\Code Store Database\Distribution Units\"
Dim KeyModuleUsage : KeyModuleUsage = "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\ModuleUsage\"

' %WinDir%
WinDir = WinDir & "\DownLoaded Program Files\"
WinDir = Replace(WinDir, "\", "/")

' ModuleUsage
Dim MURegKey : MURegKey = KeyModuleUsage & WinDir & Ocx & "\"
WshShell.RegDelete MURegKey : Error1

MURegKey = KeyModuleUsage & WinDir & OcxMUI & "\"
WshShell.RegDelete MURegKey : Error1

MURegKey = KeyModuleUsage & WinDir & AAClient & "\"
WshShell.RegDelete MURegKey : Error1

MURegKey = KeyModuleUsage & WinDir & AAClientMUI & "\"
WshShell.RegDelete MURegKey : Error1

MURegKey = KeyModuleUsage & WinDir & Rhttpaa & "\"
WshShell.RegDelete MURegKey : Error1


' Code Store Database
Dim OcxGuid
For Each OcxGuid In OcxGuids

    Dim CSRegKey : CSRegKey = KeyCodeStore & OcxGuid & "\"
    WshShell.RegDelete CSRegKey & "DownloadInformation\"
    WshShell.RegDelete CSRegKey & "Contains\Files\"
    WshShell.RegDelete CSRegKey & "Contains\"
    WshShell.RegDelete CSRegKey & "InstalledVersion\"
    WshShell.RegDelete CSRegKey

Next


WScript.Echo "Done"


Sub ApplyXForm(productCode, installer, xFormFile)

    Dim localMSIFileName
    Dim dataBaseObj

    Err = 0

    ' Get product information
    localMSIFileName = installer.ProductInfo(productCode, "LocalPackage")
    if (Err = 0) Then
    
        WScript.Echo localMSIFileName
    
        ' Open the MSI database for this package
        Set dataBaseObj = installer.OpenDatabase(localMSIFileName, msiOpenDatabaseModeTransact)
        If (Err = 0) Then
        
            ' Apply the transform to this MSI database
            dataBaseObj.ApplyTransform xFormFile, suppressXFormErrors
            dataBaseObj.Commit
        
        End If
        
    End If

End Sub

Sub CheckError
	Dim message
	if Err = 0 Then Exit Sub
	message = "Error: " & Err.Source & " " & Hex(Err) & ": " & Err.Description
	WScript.Echo message
	WScript.Quit 1
End Sub

Sub CheckError1
    Dim message
    if Err = 0 Then Exit Sub
    message = "Error: " & Err.Source & " " & Hex(Err) & ": " & Err.Description
    WScript.Echo message
End Sub
