Kaseya Community

Windows 7 SP1 - manual install?

This question is answered

I am looking to push out the SP1 to a few test machines, but when I come to the roll-out it is only showing as a manual install for the machine. Has anyone pushed this out before? Do you gave the manual download link so that I can create a procedure?

In the pending approval section of the patches two of the SP1 updates are manual, yet another is automatic - other than 64 bit, is there any other difference?

Thanks

Dean

Verified Answer
  • I also had this problem and found the "Patch Approval" was not rolling out the SP1 on my test machines as I would like.

    So.. I created a script that does it using the patch management file source. Enjoy..

    --------------------------------

    Checks if SP1 is at that the patch source and/or downloads it. Works for both 32-bit and 64-bit systems.

    Once downloaded it executes a silent installation, after install finishes gives the user a 5 minute warning for reboot using the /warnrestart feature in service pack installation.

    If patch source does not exist or no access to the UNC it at the time, script aborts.

    Installation executes under the "Set Credential" user account in Kaseya so it must have admin rights to the PC.

    Note: Script does not check if SP1 is already installed so assuming the service pack installation exits gracefully if it is.  The script line that does the installation only executes for windows 7 agents so it could be run mistakenly against non-windows 7 hosts without issues.

    Please reference this URL for more information on SP1 switches and modify to your liking.

    www.sysadminlab.net/.../deploy-service-pack-1-for-windows-7-and-server-2008-r2

    ----------------------------------

    <?xml version="1.0" encoding="utf-8"?>

    <ScriptExport xmlns:xsi="www.w3.org/.../XMLSchema-instance" xmlns:xsd="www.w3.org/.../XMLSchema" xmlns="www.kaseya.com/.../Scripting">

     <Procedure name="Windows 7 SP1 Install" treePres="3" id="592448215">

       <Body description="Checks if SP1 is at that the patch source and/or downloads it. Works for both 32-bit and 64-bit systems.&#xA;&#xA;Once downloaded it executes a silent installation, after install finishes gives the user a 5 minute warning for reboot using the /warnrestart feature in service pack installation.&#xA;&#xA;If patch source does not exist or no access to the UNC it at the time, script aborts.&#xA;Installation executes under the "Set Credential" user account in Kaseya so it must have admin rights to the PC.&#xA;&#xA;Note: Script does not check if SP1 is already installed so assuming the service pack installation exits gracefully if it is.  The script line that does the installation only executes for windows 7 agents so it could be run mistakenly against non-windows 7 hosts without issues. &#xA;&#xA;Please reference this URL for more information on SP1 switches&#xA;www.sysadminlab.net/.../deploy-service-pack-1-for-windows-7-and-server-2008-r2">

         <If description="">

           <Condition name="CheckVariable">

             <Parameter xsi:type="StringParameter" name="VariableName" value="#vMachine.OsInfo#" />

             <Parameter xsi:type="EnumParameter" name="Condition" value="Contains" />

             <Parameter xsi:type="StringParameter" name="Value" value="x64" />

           </Condition>

           <Then>

             <If description="">

               <Condition name="CheckVariable">

                 <Parameter xsi:type="StringParameter" name="VariableName" value="#vPatchConfiguration.FileSourceUNCPath#" />

                 <Parameter xsi:type="EnumParameter" name="Condition" value="Contains" />

                 <Parameter xsi:type="StringParameter" name="Value" value="\\" />

               </Condition>

               <Then>

                 <Statement description="Use the user logon credentials set for the machine ID to execute a file or shell command - Windows 2000 and above only." name="UseCredential" continueOnFail="false" />

                 <If description="">

                   <Condition name="TestFile">

                     <Parameter xsi:type="StringParameter" name="Path" value="#vPatchConfiguration.FileSourceUNCPath#\windows6.1-KB976932-X86.exe" />

                     <Parameter xsi:type="EnumParameter" name="Condition" value="Exists" />

                     <Parameter xsi:type="StringParameter" name="Value" value="" />

                   </Condition>

                   <Then>

                     <Statement description="Write an Entry into the Procedure Log" name="WriteScriptLogEntry" continueOnFail="false">

                       <Parameter xsi:type="StringParameter" name="Comment" value="#vPatchConfiguration.FileSourceUNCPath#\windows6.1-KB976932-X86.exe  - Does exist - Executing script" />

                     </Statement>

                     <Statement description="Use the user logon credentials set for the machine ID to execute a file or shell command - Windows 2000 and above only." name="UseCredential" continueOnFail="false" />

                     <Statement description="Execute the specified file - full path to file required." name="ExecuteFile" continueOnFail="false" osType="7">

                       <Parameter xsi:type="StringParameter" name="Path" value="#vPatchConfiguration.FileSourceUNCPath#\windows6.1-KB976932-X86.exe" />

                       <Parameter xsi:type="StringParameter" name="Arguments" value="/quiet /nodialog /warnrestart:300" />

                       <Parameter xsi:type="EnumParameter" name="ExecuteAccount" value="User" />

                       <Parameter xsi:type="BooleanParameter" name="WaitComplete" value="True" />

                     </Statement>

                     <Statement description="Write an Entry into the Procedure Log" name="WriteScriptLogEntry" continueOnFail="false">

                       <Parameter xsi:type="StringParameter" name="Comment" value="Installation Script Completed." />

                     </Statement>

                   </Then>

                   <Else>

                     <Statement description="Write an Entry into the Procedure Log" name="WriteScriptLogEntry" continueOnFail="false">

                       <Parameter xsi:type="StringParameter" name="Comment" value="#vPatchConfiguration.FileSourceUNCPath#\windows6.1-KB976932-X86.exe - Does not exist - Downloading file " />

                     </Statement>

                     <Statement description="Retrieves a file from a URL using the File Source configuration under Patch Management. 10 download attempts will be made per day if there are download problems. Windows only." name="Get URL (Use Patch File Source setting)" continueOnFail="false" />

                     <Statement description="Execute the specified file - full path to file required." name="ExecuteFile" continueOnFail="false" osType="7">

                       <Parameter xsi:type="StringParameter" name="Path" value="#vPatchConfiguration.FileSourceUNCPath#\windows6.1-KB976932-X86.exe" />

                       <Parameter xsi:type="StringParameter" name="Arguments" value="/quiet /nodialog /warnrestart:300" />

                       <Parameter xsi:type="EnumParameter" name="ExecuteAccount" value="User" />

                       <Parameter xsi:type="BooleanParameter" name="WaitComplete" value="True" />

                     </Statement>

                     <Statement description="Write an Entry into the Procedure Log" name="WriteScriptLogEntry" continueOnFail="false">

                       <Parameter xsi:type="StringParameter" name="Comment" value="Installation Script Completed." />

                     </Statement>

                   </Else>

                 </If>

               </Then>

               <Else>

                 <Statement description="Write an Entry into the Procedure Log" name="WriteScriptLogEntry" continueOnFail="false">

                   <Parameter xsi:type="StringParameter" name="Comment" value="No Patch Source Configured - Aborting Install - #vPatchConfiguration.FileSourceUNCPath#" />

                 </Statement>

               </Else>

             </If>

           </Then>

           <Else>

             <If description="">

               <Condition name="CheckVariable">

                 <Parameter xsi:type="StringParameter" name="VariableName" value="#vPatchConfiguration.FileSourceUNCPath#" />

                 <Parameter xsi:type="EnumParameter" name="Condition" value="Contains" />

                 <Parameter xsi:type="StringParameter" name="Value" value="\\" />

               </Condition>

               <Then>

                 <Statement description="Use the user logon credentials set for the machine ID to execute a file or shell command - Windows 2000 and above only." name="UseCredential" continueOnFail="false" />

                 <If description="">

                   <Condition name="TestFile">

                     <Parameter xsi:type="StringParameter" name="Path" value="#vPatchConfiguration.FileSourceUNCPath#\windows6.1-KB976932-X64.exe" />

                     <Parameter xsi:type="EnumParameter" name="Condition" value="Exists" />

                     <Parameter xsi:type="StringParameter" name="Value" value="" />

                   </Condition>

                   <Then>

                     <Statement description="Write an Entry into the Procedure Log" name="WriteScriptLogEntry" continueOnFail="false">

                       <Parameter xsi:type="StringParameter" name="Comment" value="#vPatchConfiguration.FileSourceUNCPath#\windows6.1-KB976932-X64.exe  - Does exist - Executing script" />

                     </Statement>

                     <Statement description="Use the user logon credentials set for the machine ID to execute a file or shell command - Windows 2000 and above only." name="UseCredential" continueOnFail="false" />

                     <Statement description="Execute the specified file - full path to file required." name="ExecuteFile" continueOnFail="false" osType="7">

                       <Parameter xsi:type="StringParameter" name="Path" value="#vPatchConfiguration.FileSourceUNCPath#\windows6.1-KB976932-X64.exe" />

                       <Parameter xsi:type="StringParameter" name="Arguments" value="/quiet /nodialog /warnrestart:300" />

                       <Parameter xsi:type="EnumParameter" name="ExecuteAccount" value="User" />

                       <Parameter xsi:type="BooleanParameter" name="WaitComplete" value="True" />

                     </Statement>

                     <Statement description="Write an Entry into the Procedure Log" name="WriteScriptLogEntry" continueOnFail="false">

                       <Parameter xsi:type="StringParameter" name="Comment" value="Installation Script Completed." />

                     </Statement>

                   </Then>

                   <Else>

                     <Statement description="Write an Entry into the Procedure Log" name="WriteScriptLogEntry" continueOnFail="false">

                       <Parameter xsi:type="StringParameter" name="Comment" value="#vPatchConfiguration.FileSourceUNCPath#\windows6.1-KB976932-X64.exe - Does not exist - Downloading file " />

                     </Statement>

                     <Statement description="Retrieves a file from a URL using the File Source configuration under Patch Management. 10 download attempts will be made per day if there are download problems. Windows only." name="Get URL (Use Patch File Source setting)" continueOnFail="false" />

                     <Statement description="Execute the specified file - full path to file required." name="ExecuteFile" continueOnFail="false" osType="7">

                       <Parameter xsi:type="StringParameter" name="Path" value="#vPatchConfiguration.FileSourceUNCPath#\windows6.1-KB976932-X64.exe" />

                       <Parameter xsi:type="StringParameter" name="Arguments" value="/quiet /nodialog /warnrestart:300" />

                       <Parameter xsi:type="EnumParameter" name="ExecuteAccount" value="User" />

                       <Parameter xsi:type="BooleanParameter" name="WaitComplete" value="True" />

                     </Statement>

                     <Statement description="Write an Entry into the Procedure Log" name="WriteScriptLogEntry" continueOnFail="false">

                       <Parameter xsi:type="StringParameter" name="Comment" value="Installation Script Completed." />

                     </Statement>

                   </Else>

                 </If>

               </Then>

               <Else>

                 <Statement description="Write an Entry into the Procedure Log" name="WriteScriptLogEntry" continueOnFail="false">

                   <Parameter xsi:type="StringParameter" name="Comment" value="No Patch Source Configured - Aborting Install - #vPatchConfiguration.FileSourceUNCPath#" />

                 </Statement>

               </Else>

             </If>

           </Else>

         </If>

       </Body>

     </Procedure>

    </ScriptExport>

All Replies
  • Just found the D/L links

    download.microsoft.com/.../windows6.1-KB976932-X86.exe

    download.microsoft.com/.../windows6.1-KB976932-X64.exe

    still why can't it be done automatically?

  • I also had this problem and found the "Patch Approval" was not rolling out the SP1 on my test machines as I would like.

    So.. I created a script that does it using the patch management file source. Enjoy..

    --------------------------------

    Checks if SP1 is at that the patch source and/or downloads it. Works for both 32-bit and 64-bit systems.

    Once downloaded it executes a silent installation, after install finishes gives the user a 5 minute warning for reboot using the /warnrestart feature in service pack installation.

    If patch source does not exist or no access to the UNC it at the time, script aborts.

    Installation executes under the "Set Credential" user account in Kaseya so it must have admin rights to the PC.

    Note: Script does not check if SP1 is already installed so assuming the service pack installation exits gracefully if it is.  The script line that does the installation only executes for windows 7 agents so it could be run mistakenly against non-windows 7 hosts without issues.

    Please reference this URL for more information on SP1 switches and modify to your liking.

    www.sysadminlab.net/.../deploy-service-pack-1-for-windows-7-and-server-2008-r2

    ----------------------------------

    <?xml version="1.0" encoding="utf-8"?>

    <ScriptExport xmlns:xsi="www.w3.org/.../XMLSchema-instance" xmlns:xsd="www.w3.org/.../XMLSchema" xmlns="www.kaseya.com/.../Scripting">

     <Procedure name="Windows 7 SP1 Install" treePres="3" id="592448215">

       <Body description="Checks if SP1 is at that the patch source and/or downloads it. Works for both 32-bit and 64-bit systems.&#xA;&#xA;Once downloaded it executes a silent installation, after install finishes gives the user a 5 minute warning for reboot using the /warnrestart feature in service pack installation.&#xA;&#xA;If patch source does not exist or no access to the UNC it at the time, script aborts.&#xA;Installation executes under the "Set Credential" user account in Kaseya so it must have admin rights to the PC.&#xA;&#xA;Note: Script does not check if SP1 is already installed so assuming the service pack installation exits gracefully if it is.  The script line that does the installation only executes for windows 7 agents so it could be run mistakenly against non-windows 7 hosts without issues. &#xA;&#xA;Please reference this URL for more information on SP1 switches&#xA;www.sysadminlab.net/.../deploy-service-pack-1-for-windows-7-and-server-2008-r2">

         <If description="">

           <Condition name="CheckVariable">

             <Parameter xsi:type="StringParameter" name="VariableName" value="#vMachine.OsInfo#" />

             <Parameter xsi:type="EnumParameter" name="Condition" value="Contains" />

             <Parameter xsi:type="StringParameter" name="Value" value="x64" />

           </Condition>

           <Then>

             <If description="">

               <Condition name="CheckVariable">

                 <Parameter xsi:type="StringParameter" name="VariableName" value="#vPatchConfiguration.FileSourceUNCPath#" />

                 <Parameter xsi:type="EnumParameter" name="Condition" value="Contains" />

                 <Parameter xsi:type="StringParameter" name="Value" value="\\" />

               </Condition>

               <Then>

                 <Statement description="Use the user logon credentials set for the machine ID to execute a file or shell command - Windows 2000 and above only." name="UseCredential" continueOnFail="false" />

                 <If description="">

                   <Condition name="TestFile">

                     <Parameter xsi:type="StringParameter" name="Path" value="#vPatchConfiguration.FileSourceUNCPath#\windows6.1-KB976932-X86.exe" />

                     <Parameter xsi:type="EnumParameter" name="Condition" value="Exists" />

                     <Parameter xsi:type="StringParameter" name="Value" value="" />

                   </Condition>

                   <Then>

                     <Statement description="Write an Entry into the Procedure Log" name="WriteScriptLogEntry" continueOnFail="false">

                       <Parameter xsi:type="StringParameter" name="Comment" value="#vPatchConfiguration.FileSourceUNCPath#\windows6.1-KB976932-X86.exe  - Does exist - Executing script" />

                     </Statement>

                     <Statement description="Use the user logon credentials set for the machine ID to execute a file or shell command - Windows 2000 and above only." name="UseCredential" continueOnFail="false" />

                     <Statement description="Execute the specified file - full path to file required." name="ExecuteFile" continueOnFail="false" osType="7">

                       <Parameter xsi:type="StringParameter" name="Path" value="#vPatchConfiguration.FileSourceUNCPath#\windows6.1-KB976932-X86.exe" />

                       <Parameter xsi:type="StringParameter" name="Arguments" value="/quiet /nodialog /warnrestart:300" />

                       <Parameter xsi:type="EnumParameter" name="ExecuteAccount" value="User" />

                       <Parameter xsi:type="BooleanParameter" name="WaitComplete" value="True" />

                     </Statement>

                     <Statement description="Write an Entry into the Procedure Log" name="WriteScriptLogEntry" continueOnFail="false">

                       <Parameter xsi:type="StringParameter" name="Comment" value="Installation Script Completed." />

                     </Statement>

                   </Then>

                   <Else>

                     <Statement description="Write an Entry into the Procedure Log" name="WriteScriptLogEntry" continueOnFail="false">

                       <Parameter xsi:type="StringParameter" name="Comment" value="#vPatchConfiguration.FileSourceUNCPath#\windows6.1-KB976932-X86.exe - Does not exist - Downloading file " />

                     </Statement>

                     <Statement description="Retrieves a file from a URL using the File Source configuration under Patch Management. 10 download attempts will be made per day if there are download problems. Windows only." name="Get URL (Use Patch File Source setting)" continueOnFail="false" />

                     <Statement description="Execute the specified file - full path to file required." name="ExecuteFile" continueOnFail="false" osType="7">

                       <Parameter xsi:type="StringParameter" name="Path" value="#vPatchConfiguration.FileSourceUNCPath#\windows6.1-KB976932-X86.exe" />

                       <Parameter xsi:type="StringParameter" name="Arguments" value="/quiet /nodialog /warnrestart:300" />

                       <Parameter xsi:type="EnumParameter" name="ExecuteAccount" value="User" />

                       <Parameter xsi:type="BooleanParameter" name="WaitComplete" value="True" />

                     </Statement>

                     <Statement description="Write an Entry into the Procedure Log" name="WriteScriptLogEntry" continueOnFail="false">

                       <Parameter xsi:type="StringParameter" name="Comment" value="Installation Script Completed." />

                     </Statement>

                   </Else>

                 </If>

               </Then>

               <Else>

                 <Statement description="Write an Entry into the Procedure Log" name="WriteScriptLogEntry" continueOnFail="false">

                   <Parameter xsi:type="StringParameter" name="Comment" value="No Patch Source Configured - Aborting Install - #vPatchConfiguration.FileSourceUNCPath#" />

                 </Statement>

               </Else>

             </If>

           </Then>

           <Else>

             <If description="">

               <Condition name="CheckVariable">

                 <Parameter xsi:type="StringParameter" name="VariableName" value="#vPatchConfiguration.FileSourceUNCPath#" />

                 <Parameter xsi:type="EnumParameter" name="Condition" value="Contains" />

                 <Parameter xsi:type="StringParameter" name="Value" value="\\" />

               </Condition>

               <Then>

                 <Statement description="Use the user logon credentials set for the machine ID to execute a file or shell command - Windows 2000 and above only." name="UseCredential" continueOnFail="false" />

                 <If description="">

                   <Condition name="TestFile">

                     <Parameter xsi:type="StringParameter" name="Path" value="#vPatchConfiguration.FileSourceUNCPath#\windows6.1-KB976932-X64.exe" />

                     <Parameter xsi:type="EnumParameter" name="Condition" value="Exists" />

                     <Parameter xsi:type="StringParameter" name="Value" value="" />

                   </Condition>

                   <Then>

                     <Statement description="Write an Entry into the Procedure Log" name="WriteScriptLogEntry" continueOnFail="false">

                       <Parameter xsi:type="StringParameter" name="Comment" value="#vPatchConfiguration.FileSourceUNCPath#\windows6.1-KB976932-X64.exe  - Does exist - Executing script" />

                     </Statement>

                     <Statement description="Use the user logon credentials set for the machine ID to execute a file or shell command - Windows 2000 and above only." name="UseCredential" continueOnFail="false" />

                     <Statement description="Execute the specified file - full path to file required." name="ExecuteFile" continueOnFail="false" osType="7">

                       <Parameter xsi:type="StringParameter" name="Path" value="#vPatchConfiguration.FileSourceUNCPath#\windows6.1-KB976932-X64.exe" />

                       <Parameter xsi:type="StringParameter" name="Arguments" value="/quiet /nodialog /warnrestart:300" />

                       <Parameter xsi:type="EnumParameter" name="ExecuteAccount" value="User" />

                       <Parameter xsi:type="BooleanParameter" name="WaitComplete" value="True" />

                     </Statement>

                     <Statement description="Write an Entry into the Procedure Log" name="WriteScriptLogEntry" continueOnFail="false">

                       <Parameter xsi:type="StringParameter" name="Comment" value="Installation Script Completed." />

                     </Statement>

                   </Then>

                   <Else>

                     <Statement description="Write an Entry into the Procedure Log" name="WriteScriptLogEntry" continueOnFail="false">

                       <Parameter xsi:type="StringParameter" name="Comment" value="#vPatchConfiguration.FileSourceUNCPath#\windows6.1-KB976932-X64.exe - Does not exist - Downloading file " />

                     </Statement>

                     <Statement description="Retrieves a file from a URL using the File Source configuration under Patch Management. 10 download attempts will be made per day if there are download problems. Windows only." name="Get URL (Use Patch File Source setting)" continueOnFail="false" />

                     <Statement description="Execute the specified file - full path to file required." name="ExecuteFile" continueOnFail="false" osType="7">

                       <Parameter xsi:type="StringParameter" name="Path" value="#vPatchConfiguration.FileSourceUNCPath#\windows6.1-KB976932-X64.exe" />

                       <Parameter xsi:type="StringParameter" name="Arguments" value="/quiet /nodialog /warnrestart:300" />

                       <Parameter xsi:type="EnumParameter" name="ExecuteAccount" value="User" />

                       <Parameter xsi:type="BooleanParameter" name="WaitComplete" value="True" />

                     </Statement>

                     <Statement description="Write an Entry into the Procedure Log" name="WriteScriptLogEntry" continueOnFail="false">

                       <Parameter xsi:type="StringParameter" name="Comment" value="Installation Script Completed." />

                     </Statement>

                   </Else>

                 </If>

               </Then>

               <Else>

                 <Statement description="Write an Entry into the Procedure Log" name="WriteScriptLogEntry" continueOnFail="false">

                   <Parameter xsi:type="StringParameter" name="Comment" value="No Patch Source Configured - Aborting Install - #vPatchConfiguration.FileSourceUNCPath#" />

                 </Statement>

               </Else>

             </If>

           </Else>

         </If>

       </Body>

     </Procedure>

    </ScriptExport>

  • Just looking at this, not sure if the get URL with patch source feature actually exports where it gets the files from. I used the URLs in ds_aztechit's post so you might need to modify it yourself to work.

  • Thanks for the script, certainly looks like it will be useful - just a shame that this has to be done manually

  • The patch will install via Kaseya's Patch Management as long as the endpoint has access to the update location.  Endpoints should be able to reach all of the following sites for successful patching:

    update.microsoft.com

    download.microsoft.com

    download.windowsupdate.com

    windowsupdate.com

    vsaupdate.kaseya.net

    This patch (as well as others that are marked as "Internet-based Install Only") uses Microsoft's Windows Update Agent (WUA) to detect the functions of the patch that the individual endpoint requires (system type, language, required functions, etc.).  Microsoft also recommends taking necessary precautions before installing this Service Pack.  You can read the full details of the Service Pack as well as recommended steps to take before installation at www.microsoft.com/.../details.aspx

    If your endpoint does not have access to the internet or cannot access the above sites, then the patch, at this time, does need to be installed manually either through a software deployment or from media deskside.

  • Brande,

    Such is true and has never been problem for me with Windows 2008, XP, Vista etc.  But in testing Windows 7 SP1 I found it to be a problem and the systems I tried through both an automatic update, machine update and initial update in Kaseya. None of which worked. All the systems have access to the websites you mentioned.

    Not ready to deploy yet anyway, but my script did successfully work for the test environment. Plus it is better on bandwidth.

    If it gets to a point where the Kaseya patch management works for W7 SP1 then that would be my preferred option.

  • Interesting - thanks for that info.  I'll do some digging and see what turns up.

  • Thank you for the script...I'd love to use it, but I can't seem to import it. There are some characters and quotes in the Body Description that won't take, but after I remove those Kaseya just says "There is an error in the XML document." I've imported and exported scripts before so I know the process, but for some reason this one won't take. I placed the text in Notepad++ and couldn't find anything obvious.

    I could just create it using the GUI, but there's no fun in that!

  • Second on the script - I desperately need to force SP1 (Kaseya PM has only been successful about 20% of the time for our machines) and so I need something to force it to install.  I'm getting the same XML errors as Jerry.

    Lenski, would you mind re-posting it?  Thanks!

  • I dont think its going to work unless i give you the .xml.

    Kaseya in promoting a community it would be great to be able to share scripts. No way I can attach it or PM it to someone?

  • @lenski, it might not be obvious enough but there are several methods to share scripts and other files in the community forums. Simplest way is to use the "Use rich formatting" link next to the blue "Reply" button when you post and go to the "Options" tab after you have written you comments and want to attach the file you want to share in your post.

    Another way is to use the forum's encapsulation codes "code" and "/code" enclosed in brackets "[" &"]". If you want to share it privately you can "Friend" each other and attach the files to the messages or if the files you want to share would be something worthwhile to the whole community you can use the Knowledge Exchange, if you go to the very top of this page just below the Kaseya logo you will see a "Resources" link/menu button.

    Note though that if you want to share XML files its best practice to zip them up first as some web browsers will open the file instead of downloading it.

  • I thought my rant might attract a way to do it :)

    I have posted it to the resources area..

  • Thanks lenski, it worked perfectly.