<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://blogs.technet.com/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>Marcus Hass' [MS] Blog : Development</title><link>http://blogs.technet.com/mhass/archive/tags/Development/default.aspx</link><description>Tags: Development</description><dc:language>en</dc:language><generator>CommunityServer 2.1 SP1 (Build: 61025.2)</generator><item><title>SharePoint 3.0 WSP Deployment Scripts</title><link>http://blogs.technet.com/mhass/archive/2007/08/20/sharepoint-3-0-wsp-deployment-scripts.aspx</link><pubDate>Mon, 20 Aug 2007 22:03:00 GMT</pubDate><guid isPermaLink="false">d5e57398-b9ef-4490-9955-07cbb4e4a80d:1791292</guid><dc:creator>mhass</dc:creator><slash:comments>4</slash:comments><comments>http://blogs.technet.com/mhass/comments/1791292.aspx</comments><wfw:commentRss>http://blogs.technet.com/mhass/commentrss.aspx?PostID=1791292</wfw:commentRss><wfw:comment>http://blogs.technet.com/mhass/rsscomments.aspx?PostID=1791292</wfw:comment><description>&lt;P&gt;I have been working with a customer over the last few weeks to come up with a mechanism that their Configuration Management (CM)&amp;nbsp;team can use to deploy custom WSS code.&amp;nbsp; Fortunately, WSS allows our developers to wrap up their code into a Solution (WSP files).&amp;nbsp; The solution can have things like templates that&amp;nbsp;go on the file system,&amp;nbsp;web.config changes and features.&amp;nbsp;&amp;nbsp;Features are cool little things that can do things on WSS as well as have additional tasks on the server or file system,&amp;nbsp;all defined by the developer through and XML file.&amp;nbsp; Not all solutions will have a feature.&lt;/P&gt;
&lt;P&gt;The trick here was to make it very simple for the CM team to deploy different versions of code to different environments such as Dev, Test and Prod.&amp;nbsp; So, I looked at some of my old WSS 2.0 scripts that would deploy web parts out to&amp;nbsp;EVERY&amp;nbsp;INDIVIDUAL box in the farm&amp;nbsp;by draining the application pools, deploying the DLL and GAC'ing them, restarting the web site (iisapp.vbs), and running a warm up script to fire up the ISAPI filters.&amp;nbsp; This was a pain for the CM teams, especially in Internet facing properties that you wish to have as little service interruption as possible.&amp;nbsp; You had to really watch the logs to ensure each box updated successfully, restart the site, etc.&lt;/P&gt;
&lt;P&gt;WSS 3.0 makes this a lot easier by having a solution database that can store those solutions that you want to deploy, and then can either use a timer to deploy them across the farm or you can force them.&amp;nbsp; You deploy the solution to a single web server in the farm, it is stored in the solution database, and SharePoint takes care of installing them on all the web boxes.&amp;nbsp; In my scripts below, we decided that we&amp;nbsp;would rather have the solutions deploy immediately so that we could troubleshoot any problems right away.&lt;/P&gt;
&lt;P&gt;I further wanted to simplify the CM groups deployment by having all deployment scripts and logs on a central server.&amp;nbsp; They basically "push a button" for the particular solution package they want to deploy and it fires off a remote task to the web server.&lt;/P&gt;
&lt;P&gt;The last BIG bonus about this is disaster recovery.&amp;nbsp; Since we do SQL backups regularly, we are able to bring up a new SharePoint farm, restore our DB's, run our WSP files, and we are back in business.&amp;nbsp; This is how MSIT does it, BTW.&lt;/P&gt;
&lt;P&gt;Here is how it works, pay attention, it gets a little tricky as to what&amp;nbsp;server is running what:&lt;/P&gt;
&lt;P&gt;&lt;A href="http://blogs.technet.com/blogfiles/mhass/WindowsLiveWriter/SharePoint3.0WSPDeploymentScripts_B78E/image_1.png" mce_href="http://blogs.technet.com/blogfiles/mhass/WindowsLiveWriter/SharePoint3.0WSPDeploymentScripts_B78E/image_1.png" atomicselection="true"&gt;&lt;IMG style="BORDER-RIGHT: 0px; BORDER-TOP: 0px; BORDER-LEFT: 0px; BORDER-BOTTOM: 0px" height=385 alt=image src="http://blogs.technet.com/blogfiles/mhass/WindowsLiveWriter/SharePoint3.0WSPDeploymentScripts_B78E/image_thumb_1.png" width=509 border=0 mce_src="http://blogs.technet.com/blogfiles/mhass/WindowsLiveWriter/SharePoint3.0WSPDeploymentScripts_B78E/image_thumb_1.png"&gt;&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;Basically, a script is kicked off&amp;nbsp;on the deployment server with parameters for the environment, it fires SchedTaskWebSolDeploy.cmd, which fires a WMIC command to the web server based on name in WMICSolMachines.txt.&amp;nbsp; This wakes up a scheduled task on the web server, which is&amp;nbsp;set to only run once in 1978 (ensuring that it doesn't fire automatically), and runs the WebServerDeploySolutionwithFeature.cmd.&amp;nbsp; All of these output log files on the deployment server so that the status can&amp;nbsp;easily be checked from a central place.&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Below are the scripts, I posted them as text to have the search engines crawl them for reference.&amp;nbsp; If you want to skip to the good stuff, it is in the WebServerDeploySolutionWithFeature.cmd section.&amp;nbsp; Please NOTE: Thes scripts are intended to overwrite the existing Solutions and Features, so be sure you know what they do before you get them up and running.&amp;nbsp; Also, the normal rules apply here around the fact that these are examples, please use at your risk and support them yourselves, the last thing I need is any midnight phone calls.&lt;/P&gt;
&lt;P&gt;The names of the innocent servers have been changed to "deploymentserver" or "mossdev" to protect their identity:&lt;/P&gt;
&lt;H3&gt;DeployWebPartsFeature.cmd&lt;/H3&gt;
&lt;P&gt;://////////////////////////////////////////////////&lt;BR&gt;:// Author: Marcus Hass (mhass@microsoft.com)&lt;BR&gt;:// Version: 2.0&lt;BR&gt;:// Date: 08.01.2007&lt;BR&gt;://&lt;BR&gt;:// Notes:&lt;BR&gt;://&lt;BR&gt;://&amp;nbsp;&amp;nbsp; Runs a remote task via WMIC to deploy a SharePoint 2007 Solution&lt;BR&gt;://&amp;nbsp;&amp;nbsp; THIS SCRIPT MUST BE RUN FROM THE deployscripts DIRECTORY (assumes the \CORE is below current direcotry)&lt;BR&gt;://&amp;nbsp;&amp;nbsp; Assumes all necesary infrastructure exists for Sharepoint on all boxes&lt;BR&gt;://&amp;nbsp;&amp;nbsp; Assumes that the remote scheduled tasks exist&lt;BR&gt;://&lt;BR&gt;:// Inputs:&lt;BR&gt;://&lt;BR&gt;://&amp;nbsp;&amp;nbsp; LogFile(%1) - Path to centralized log file (i.e \\endor\deployscripts$)&lt;BR&gt;://&amp;nbsp;&amp;nbsp; WebSiteName(%2) - The name of the web site that will be deployed to, also used on log file name (Tntranet, ProdMOSSWeb1)&lt;BR&gt;://&amp;nbsp;&amp;nbsp; PathtoScripts(%3) - UNC path to scripts (i.e. \\endor\deployscripts$)&lt;BR&gt;://&amp;nbsp;&amp;nbsp; SchedTaskName(%4) - Name of the scheduled task on the remote box&lt;BR&gt;://&lt;BR&gt;://////////////////////////////////////////////////&lt;BR&gt;echo Starting DeployDeployIntranetSiteDefWSP.cmd 
&lt;P&gt;\\deploymentserver\deployscripts$\dev\core\SchedTaskWebSolDepoly.cmd \\deploymentserver\deployscripts$\dev\logs \\deploymentserver\deployscripts$\dev DeployWebPartsFeature 
&lt;H3&gt;SchedTaskWebSolDepoly.cmd&lt;/H3&gt;
&lt;P&gt;@echo off&lt;BR&gt;://////////////////////////////////////////////////&lt;BR&gt;:// Author: Marcus Hass (mhass@microsoft.com)&lt;BR&gt;:// Version: 2.0&lt;BR&gt;:// Date: 08.01.2007&lt;BR&gt;://&lt;BR&gt;:// Script File:&lt;BR&gt;://&lt;BR&gt;://&amp;nbsp;&amp;nbsp; SchedTaskWebSolDeply.cmd&lt;BR&gt;://&lt;BR&gt;:// Notes:&lt;BR&gt;://&lt;BR&gt;://&amp;nbsp;&amp;nbsp; Runs the local sched task to deploy a MOSS solution&lt;BR&gt;://&amp;nbsp;&amp;nbsp; THIS SCRIPT MUST BE RUN FROM THE deployscripts DIRECTORY (assumes the \CORE is below current direcotry)&lt;BR&gt;://&amp;nbsp;&amp;nbsp; Assumes all necesary infrastructure exists for Sharepoint on all boxes&lt;BR&gt;://&amp;nbsp;&amp;nbsp; Assumes that the remote scheduled tasks exist&lt;BR&gt;://&lt;BR&gt;:// Inputs:&lt;BR&gt;://&lt;BR&gt;://&amp;nbsp;&amp;nbsp; LogFile(%1) - Path to centralized log file (i.e \\endor\deployscripts$, etc)&lt;BR&gt;://&amp;nbsp;&amp;nbsp; PathtoScripts(%2) - UNC path to scripts (i.e. \\endor\deployscripts$, etc)&lt;BR&gt;://&amp;nbsp;&amp;nbsp; SchedTaskName(%3) - Name of the scheduled task on the remote box&lt;BR&gt;://&amp;nbsp;&amp;nbsp; &lt;BR&gt;:// Outputs:&lt;BR&gt;://&lt;BR&gt;:// Environment variables referenced:&lt;BR&gt;://&lt;BR&gt;:// Runs in:&lt;BR&gt;://&lt;BR&gt;://&amp;nbsp;&amp;nbsp; N32, N64&lt;BR&gt;://&lt;BR&gt;:////////////////////////////////////////////////// 
&lt;P&gt;:Main 
&lt;P&gt;:// Validate the input parameters to make sure they exist. 
&lt;P&gt;&amp;nbsp; if NOT "%1"=="" goto :LogFileOK&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; echo ERROR: Empty LogFile parameter. Aborting.&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; set RETSTS=1&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; goto :usage&lt;BR&gt;&amp;nbsp; :LogFileOK 
&lt;P&gt;&amp;nbsp; set PathtoScripts=%2&lt;BR&gt;&amp;nbsp; set SchedTaskName=%3&lt;BR&gt;&amp;nbsp; set LogFile=%1\Status%computername%%WebSiteName%_DeployServer.txt 
&lt;P&gt;:// Sending script info to log file 
&lt;P&gt;&amp;nbsp; echo. &amp;gt;&amp;gt; %LogFile%&lt;BR&gt;&amp;nbsp; echo Running script SchedTaskWebSolDeploy &amp;gt;&amp;gt; %LogFile%&lt;BR&gt;&amp;nbsp; Date /T &amp;gt;&amp;gt; %LogFile%&lt;BR&gt;&amp;nbsp; Time /T &amp;gt;&amp;gt; %LogFile%&lt;BR&gt;&amp;nbsp; set username &amp;gt;&amp;gt; %LogFile% 
&lt;P&gt;:// Run script to envoke remote scheduled tasks 
&lt;P&gt;&amp;nbsp; set cmd1=WMIC /node:@"%PathtoScripts%\WMICSolMachines.txt" PROCESS CALL Create "schtasks /Run /TN %SchedTaskName%" 
&lt;P&gt;&amp;nbsp; echo.&lt;BR&gt;&amp;nbsp; echo.&lt;BR&gt;&amp;nbsp; echo Sending Deployment commands to remote computers.&lt;BR&gt;&amp;nbsp; echo.&lt;BR&gt;&amp;nbsp; echo Envoking remote scheduled tasks using the following command: &amp;gt;&amp;gt; %LogFile%&lt;BR&gt;&amp;nbsp; echo Envoking remote scheduled tasks using the following command:&lt;BR&gt;&amp;nbsp; echo %cmd1% &amp;gt;&amp;gt; %LogFile%&lt;BR&gt;&amp;nbsp; echo %cmd1% 
&lt;P&gt;&amp;nbsp; %cmd1% &amp;gt;&amp;gt; %LogFile% 
&lt;P&gt;:// If error with command tell user and dump out of script 
&lt;P&gt;&amp;nbsp; if "%ERRORLEVEL%"=="0" goto :Oktogotoend&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; echo Error running the command: %cmd3%, please check log file located at %LogFile%. &amp;gt;&amp;gt; %LogFile%&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; echo Error running the command: %cmd3%, please check log file located at %LogFile%&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; goto :bigerror&lt;BR&gt;&amp;nbsp; :Oktogotoend 
&lt;P&gt;&amp;nbsp; echo.&lt;BR&gt;&amp;nbsp; echo.&lt;BR&gt;&amp;nbsp; echo +-----------------------------------------------------+&lt;BR&gt;&amp;nbsp; echo&amp;nbsp; Script is successful and did not return any errors &lt;BR&gt;&amp;nbsp; echo&amp;nbsp; Log File located at: %LogFile%&lt;BR&gt;&amp;nbsp; echo +-----------------------------------------------------+&lt;BR&gt;&amp;nbsp; echo&amp;nbsp; Please check log files for remote computers as status &lt;BR&gt;&amp;nbsp; echo&amp;nbsp; is not reported in this deployment script&lt;BR&gt;&amp;nbsp; echo +----------------------------------------------------+&lt;BR&gt;&amp;nbsp; echo.&lt;BR&gt;&amp;nbsp; echo Script is successful and did not return any errors &amp;gt;&amp;gt; %LogFile%&lt;BR&gt;&amp;nbsp; echo Please check log files for remote computers as status &amp;gt;&amp;gt; %LogFile%&lt;BR&gt;&amp;nbsp; echo is not reported in this deployment script &amp;gt;&amp;gt; %LogFile%&lt;BR&gt;&amp;nbsp; pause 
&lt;P&gt;&amp;nbsp; goto :end 
&lt;P&gt;:bigerror&lt;BR&gt;&amp;nbsp; echo !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! &amp;gt;&amp;gt; %LogFile%&lt;BR&gt;&amp;nbsp; echo. &amp;gt;&amp;gt; %LogFile%&lt;BR&gt;&amp;nbsp; echo A catastropic error has occured and the deployment can not continue, please check &amp;gt;&amp;gt; %LogFile%&lt;BR&gt;&amp;nbsp; echo error logs located at %LogFile% &amp;gt;&amp;gt; %LogFile%&lt;BR&gt;&amp;nbsp; echo The return status code was %RETSTS% %ERRORLEVEL% &amp;gt;&amp;gt; %LogFile%&lt;BR&gt;&amp;nbsp; echo. &amp;gt;&amp;gt; %LogFile%&lt;BR&gt;&amp;nbsp; echo !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! &amp;gt;&amp;gt; %LogFile%&lt;BR&gt;&amp;nbsp; echo.&lt;BR&gt;&amp;nbsp; echo.&lt;BR&gt;&amp;nbsp; echo.&lt;BR&gt;&amp;nbsp; echo !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!&lt;BR&gt;&amp;nbsp; echo.&lt;BR&gt;&amp;nbsp; echo A catastropic error has occured and the deployment can not continue, please check&lt;BR&gt;&amp;nbsp; echo error logs located at %LogFile%&lt;BR&gt;&amp;nbsp; echo The return status code was %RETSTS% %ERRORLEVEL%&lt;BR&gt;&amp;nbsp; echo.&lt;BR&gt;&amp;nbsp; echo !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!&lt;BR&gt;&amp;nbsp; echo.&lt;BR&gt;&amp;nbsp; echo.&lt;BR&gt;&amp;nbsp; pause&lt;BR&gt;&amp;nbsp; goto :end&lt;BR&gt;://////////////////////////////////////////////////&lt;BR&gt;://&lt;BR&gt;:// Script end.&lt;BR&gt;://&lt;BR&gt;:////////////////////////////////////////////////// 
&lt;P&gt;:end 
&lt;P&gt;&amp;nbsp; set LogFile=&lt;BR&gt;&amp;nbsp; set PathtoScripts=&lt;BR&gt;&amp;nbsp; set cmd1= 
&lt;H3&gt;WMICSolMachines.txt&lt;/H3&gt;
&lt;P&gt;webservername&lt;/P&gt;
&lt;H3&gt;Example of DeployWebPartsFeature Scheduled Task Command Line:&lt;/H3&gt;
&lt;P&gt;://////////////////////////////////////////////////&lt;BR&gt;:// Author: Marcus Hass (mhass@microsoft.com)&lt;BR&gt;:// Version: 2.0&lt;BR&gt;:// Date: 08.01.2007&lt;BR&gt;://&lt;BR&gt;:// Notes:&lt;BR&gt;://&lt;BR&gt;://&amp;nbsp;&amp;nbsp; Schedulede Task Name: DeploySolution&lt;BR&gt;://&amp;nbsp;&amp;nbsp; This is an example file that details what should be in the scheduled task on a remote box. &lt;BR&gt;://&lt;BR&gt;:// Inputs:&lt;BR&gt;://&lt;BR&gt;://&amp;nbsp;&amp;nbsp; LogFile(%1) - Path to centralized log file (i.e \\endor\deployscripts$\logs)&lt;BR&gt;://&amp;nbsp;&amp;nbsp; PathtoCode(%2) - UNC Path to Code repository (i.e. \\endor\code$\prod)&lt;BR&gt;://&amp;nbsp;&amp;nbsp; AppVer(%3) - version of software to deploy (i.e., current, 1.0.0.0)&lt;BR&gt;://&amp;nbsp;&amp;nbsp; WebSiteName(%4) - The name of the web site that will be deployed to (i.e. Intranet, ProdMOSSWeb1)&lt;BR&gt;://&amp;nbsp;&amp;nbsp; SiteDefName(%5) - Name of the feature that will be activated/deactivated, Filename and solution names should match (i.e. IntranetSiteDef)&lt;BR&gt;://&amp;nbsp;&amp;nbsp; PathToScripts(%6) - Path to where the scripts are located (i.e \\endor\deployscripts$)&lt;BR&gt;://&lt;BR&gt;:////////////////////////////////////////////////// 
&lt;P&gt;://Example of commandline: 
&lt;P&gt;\\deploymentserver\deployscripts$\dev\core\WebServerDeploySolutionWithFeature.cmd \\deploymentserver\deployscripts$\dev\logs \\deploymentserver\code$ dev\current mossdev WebPartsFeature \\deploymentserver\deployscripts$\dev 
&lt;H3&gt;WebServerDeploySolutionWithFeature.cmd&lt;/H3&gt;
&lt;P&gt;@echo off&lt;BR&gt;://////////////////////////////////////////////////&lt;BR&gt;:// Author: Marcus Hass (mhass@microsoft.com)&lt;BR&gt;:// Version: 2.0&lt;BR&gt;:// Date: 08.01.2007&lt;BR&gt;://&lt;BR&gt;:// Script File:&lt;BR&gt;://&lt;BR&gt;://&amp;nbsp;&amp;nbsp; WebServerDeploySolutionWithFeature.cmd&lt;BR&gt;://&lt;BR&gt;:// Notes:&lt;BR&gt;://&lt;BR&gt;://&amp;nbsp;&amp;nbsp; This script is called by a scheduled task on a MOSS web front end server&lt;BR&gt;://&amp;nbsp;&amp;nbsp; THIS SCRIPT MUST BE RUN FROM THE deployscripts DIRECTORY (assumes the \CORE is below current direcotry)&lt;BR&gt;://&amp;nbsp;&amp;nbsp; Assumes all necesary infrastructure exists for Sharepoint on all boxes&lt;BR&gt;://&lt;BR&gt;:// Inputs:&lt;BR&gt;://&lt;BR&gt;://&amp;nbsp;&amp;nbsp; LogFile(%1) - Path to centralized log file (i.e \\endor\deployscripts$\logs)&lt;BR&gt;://&amp;nbsp;&amp;nbsp; PathtoCode(%2) - UNC Path to Code repository (i.e. \\endor\code$\prod)&lt;BR&gt;://&amp;nbsp;&amp;nbsp; AppVer(%3) - version of software to deploy (i.e., current, 1.0.0.0)&lt;BR&gt;://&amp;nbsp;&amp;nbsp; WebSiteName(%4) - The name of the web site that will be deployed to (i.e. Intranet, ProdMOSSWeb1)&lt;BR&gt;://&amp;nbsp;&amp;nbsp; SiteDefName(%5) - Name of the feature that will be activated/deactivated, Filename and solution names should match (i.e. IntranetSiteDef)&lt;BR&gt;://&amp;nbsp;&amp;nbsp; PathToScripts(%6) - Path to where the scripts are located (i.e \\endor\deployscripts$)&lt;BR&gt;://&amp;nbsp;&amp;nbsp; &lt;BR&gt;:// Outputs:&lt;BR&gt;://&lt;BR&gt;://&amp;nbsp;&amp;nbsp; LogFile=%1\SolutionDeployFeature%computername%%WebSiteName%.txt&lt;BR&gt;://&lt;BR&gt;:// Environment variables referenced:&lt;BR&gt;://&lt;BR&gt;://&amp;nbsp;&amp;nbsp; ComputerName&lt;BR&gt;://&lt;BR&gt;:// Runs in:&lt;BR&gt;://&lt;BR&gt;://&amp;nbsp;&amp;nbsp; N32, N64&lt;BR&gt;://&lt;BR&gt;:////////////////////////////////////////////////// 
&lt;P&gt;:Main 
&lt;P&gt;:// Validate the input parameters to make sure they exist. 
&lt;P&gt;&amp;nbsp; if NOT "%1"=="" goto :LogFileOK&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; echo ERROR: Empty LogFile parameter. Aborting.&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; echo ERROR: Empty LogFile parameter. Aborting. &amp;gt;&amp;gt; c:\DeploySolution.txt&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; set RETSTS=1&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; goto :end&lt;BR&gt;&amp;nbsp; :LogFileOK 
&lt;P&gt;&amp;nbsp; if NOT "%6"=="" goto :BadParmsOK&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; echo ERROR: Not All Paramters have been supplied. Aborting.&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; echo ERROR: Not All Paramters have been supplied. Aborting. &amp;gt;&amp;gt; c:\DeploySolution.txt&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; set RETSTS=1&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; goto :end&lt;BR&gt;&amp;nbsp; :BadParmsOK 
&lt;P&gt;&amp;nbsp; set PathtoCode=%2&lt;BR&gt;&amp;nbsp; set AppVer=%3&lt;BR&gt;&amp;nbsp; set WebSiteName=%4&lt;BR&gt;&amp;nbsp; set SiteDefName=%5&lt;BR&gt;&amp;nbsp; set PathToScripts=%6&lt;BR&gt;&amp;nbsp; set DepFeatureName1=ITWebParts&lt;BR&gt;&amp;nbsp; set LogFile=%1\SolutionDeployFeature%computername%%WebSiteName%.txt 
&lt;P&gt;&amp;nbsp; set stsadmpath="C:\Program Files\Common Files\Microsoft Shared\web server extensions\12\BIN" 
&lt;P&gt;:// Sending script info to log file 
&lt;P&gt;&amp;nbsp; echo. &amp;gt;&amp;gt; %LogFile%&lt;BR&gt;&amp;nbsp; echo Running script WebServerDeploySolutionWithFeature &amp;gt;&amp;gt; %LogFile%&lt;BR&gt;&amp;nbsp; Date /T &amp;gt;&amp;gt; %LogFile%&lt;BR&gt;&amp;nbsp; Time /T &amp;gt;&amp;gt; %LogFile%&lt;BR&gt;&amp;nbsp; set username &amp;gt;&amp;gt; %LogFile% 
&lt;P&gt;:// need to retract the solution so it can be replaced 
&lt;P&gt;&amp;nbsp; set cmd2=%stsadmpath%\stsadm -o retractsolution -name %SiteDefName%.wsp -immediate 
&lt;P&gt;&amp;nbsp; echo Running the following command to retract the solution &amp;gt;&amp;gt; %LogFile%&lt;BR&gt;&amp;nbsp; echo Running the following command to retract the solution: &lt;BR&gt;&amp;nbsp; echo %cmd2%&amp;nbsp; &amp;gt;&amp;gt; %LogFile%&lt;BR&gt;&amp;nbsp; echo %cmd2% 
&lt;P&gt;&amp;nbsp; call %cmd2% &amp;gt;&amp;gt; %LogFile% 
&lt;P&gt;:// If error with command tell user but DONT dump out of script 
&lt;P&gt;&amp;nbsp; if "%ERRORLEVEL%"=="0" goto :retractok&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; echo Error running STSADM retract command, please check log file located at %LogFile%. &amp;gt;&amp;gt; %LogFile%&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; echo Error running STSADM retract command, please check log file located at %LogFile%.&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; set ERRORLEVEL=0&lt;BR&gt;&amp;nbsp; :retractok 
&lt;P&gt;:// Executing the commands across the farm, this done after most commands 
&lt;P&gt;&amp;nbsp; set cmd3=%stsadmpath%\stsadm -o execadmsvcjobs 
&lt;P&gt;&amp;nbsp; echo Executing the commands across the farm using the command: &amp;gt;&amp;gt; %LogFile%&lt;BR&gt;&amp;nbsp; echo Executing the commands across the farm using the command&lt;BR&gt;&amp;nbsp; echo %cmd3% &amp;gt;&amp;gt; %LogFile%&lt;BR&gt;&amp;nbsp; echo %cmd3% 
&lt;P&gt;&amp;nbsp; call %cmd3% &amp;gt;&amp;gt; %LogFile% 
&lt;P&gt;:// If error with command tell user and dump out of script 
&lt;P&gt;&amp;nbsp; if "%ERRORLEVEL%"=="0" goto :execute1ok&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; echo Error executing execadmsvcjobs1, please check log file located at %LogFile%. &amp;gt;&amp;gt; %LogFile%&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; echo Error executing execadmsvcjobs1, please check log file located at %LogFile%.&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; goto :bigerror&lt;BR&gt;&amp;nbsp; :execute1ok 
&lt;P&gt;:// need to delete the solution so it can be replaced 
&lt;P&gt;&amp;nbsp; set cmd4=%stsadmpath%\stsadm -o deletesolution -name %SiteDefName%.wsp -override 
&lt;P&gt;&amp;nbsp; echo Running the following command to delete the solution &amp;gt;&amp;gt; %LogFile%&lt;BR&gt;&amp;nbsp; echo Running the following command to delete the solution: &lt;BR&gt;&amp;nbsp; echo %cmd4%&amp;nbsp; &amp;gt;&amp;gt; %LogFile%&lt;BR&gt;&amp;nbsp; echo %cmd4% 
&lt;P&gt;&amp;nbsp; call %cmd4% &amp;gt;&amp;gt; %LogFile% 
&lt;P&gt;:// If error with command tell user but DONT dump out of script 
&lt;P&gt;&amp;nbsp; if "%ERRORLEVEL%"=="0" goto :deleteok&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; echo Error running STSADM deletesolution command, please check log file located at %LogFile%. &amp;gt;&amp;gt; %LogFile%&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; echo Error running STSADM deletesolution command, please check log file located at %LogFile%.&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; set ERRORLEVEL=0&lt;BR&gt;&amp;nbsp; :deleteok 
&lt;P&gt;:// Executing the commands across the farm, this done after most commands 
&lt;P&gt;&amp;nbsp; set cmd5=%stsadmpath%\stsadm -o execadmsvcjobs 
&lt;P&gt;&amp;nbsp; echo Executing the commands across the farm using the command: &amp;gt;&amp;gt; %LogFile%&lt;BR&gt;&amp;nbsp; echo Executing the commands across the farm using the command&lt;BR&gt;&amp;nbsp; echo %cmd5% &amp;gt;&amp;gt; %LogFile%&lt;BR&gt;&amp;nbsp; echo %cmd5% 
&lt;P&gt;&amp;nbsp; call %cmd5% &amp;gt;&amp;gt; %LogFile% 
&lt;P&gt;:// If error with command tell user and dump out of script 
&lt;P&gt;&amp;nbsp; if "%ERRORLEVEL%"=="0" goto :execute2ok&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; echo Error executing execadmsvcjobs2, please check log file located at %LogFile%. &amp;gt;&amp;gt; %LogFile%&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; echo Error executing execadmsvcjobs2, please check log file located at %LogFile%.&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; goto :bigerror&lt;BR&gt;&amp;nbsp; :execute2ok 
&lt;P&gt;:// need to add the solution to the repository 
&lt;P&gt;&amp;nbsp; set cmd6=%stsadmpath%\stsadm -o addsolution -filename %PathtoCode%\%AppVer%\%SiteDefName%.wsp 
&lt;P&gt;&amp;nbsp; echo Running the following command to add the solution &amp;gt;&amp;gt; %LogFile%&lt;BR&gt;&amp;nbsp; echo Running the following command to add the solution: &lt;BR&gt;&amp;nbsp; echo %cmd6%&amp;nbsp; &amp;gt;&amp;gt; %LogFile%&lt;BR&gt;&amp;nbsp; echo %cmd6% 
&lt;P&gt;&amp;nbsp; call %cmd6% &amp;gt;&amp;gt; %LogFile% 
&lt;P&gt;:// If error with command tell user and dump out of script 
&lt;P&gt;&amp;nbsp; if "%ERRORLEVEL%"=="0" goto :addsolutionok&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; echo Error running STSADM addsolution command, please check log file located at %LogFile%. &amp;gt;&amp;gt; %LogFile%&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; echo Error running STSADM addsolution command, please check log file located at %LogFile%.&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; goto :bigerror&lt;BR&gt;&amp;nbsp; :addsolutionok 
&lt;P&gt;:// Executing the commands across the farm, this done after most commands 
&lt;P&gt;&amp;nbsp; set cmd7=%stsadmpath%\stsadm -o execadmsvcjobs 
&lt;P&gt;&amp;nbsp; echo Executing the commands across the farm using the command: &amp;gt;&amp;gt; %LogFile%&lt;BR&gt;&amp;nbsp; echo Executing the commands across the farm using the command&lt;BR&gt;&amp;nbsp; echo %cmd7% &amp;gt;&amp;gt; %LogFile%&lt;BR&gt;&amp;nbsp; echo %cmd7% 
&lt;P&gt;&amp;nbsp; call %cmd7% &amp;gt;&amp;gt; %LogFile% 
&lt;P&gt;:// If error with command tell user and dump out of script 
&lt;P&gt;&amp;nbsp; if "%ERRORLEVEL%"=="0" goto :execute3ok&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; echo Error executing execadmsvcjobs3, please check log file located at %LogFile%. &amp;gt;&amp;gt; %LogFile%&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; echo Error executing execadmsvcjobs3, please check log file located at %LogFile%.&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; goto :bigerror&lt;BR&gt;&amp;nbsp; :execute3ok 
&lt;P&gt;:// need to deploy the solution from the repository 
&lt;P&gt;&amp;nbsp; set cmd8=%stsadmpath%\stsadm -o deploysolution -name %SiteDefName%.wsp -immediate -allowGacDeployment -allowCasPolicies -allcontenturls -force 
&lt;P&gt;&amp;nbsp; echo Running the following command to add the solution &amp;gt;&amp;gt; %LogFile%&lt;BR&gt;&amp;nbsp; echo Running the following command to add the solution: &lt;BR&gt;&amp;nbsp; echo %cmd8%&amp;nbsp; &amp;gt;&amp;gt; %LogFile%&lt;BR&gt;&amp;nbsp; echo %cmd8% 
&lt;P&gt;&amp;nbsp; call %cmd8% &amp;gt;&amp;gt; %LogFile% 
&lt;P&gt;:// If error with command tell user and dump out of script 
&lt;P&gt;&amp;nbsp; if "%ERRORLEVEL%"=="0" goto :deploysolutionok&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; echo Error running STSADM deploysolution command, please check log file located at %LogFile%. &amp;gt;&amp;gt; %LogFile%&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; echo Error running STSADM deploysolution command, please check log file located at %LogFile%.&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; goto :bigerror&lt;BR&gt;&amp;nbsp; :deploysolutionok 
&lt;P&gt;:// need to deactvate a feature before it can be updated 
&lt;P&gt;&amp;nbsp; set Depcmd1=%stsadmpath%\stsadm -o deactivatefeature -name %DepFeatureName1% -url &lt;A href="http://%WebSiteName%" mce_href="http://%WebSiteName%"&gt;http://%WebSiteName%&lt;/A&gt; -force 
&lt;P&gt;&amp;nbsp; echo Running the following command to unextend the &lt;A href="http://%WebSiteName%" mce_href="http://%WebSiteName%"&gt;http://%WebSiteName%&lt;/A&gt; Web Site: &amp;gt;&amp;gt; %LogFile%&lt;BR&gt;&amp;nbsp; echo Running the following command to unextend the &lt;A href="http://%WebSiteName%" mce_href="http://%WebSiteName%"&gt;http://%WebSiteName%&lt;/A&gt; Web Site: &lt;BR&gt;&amp;nbsp; echo %Depcmd1%&amp;nbsp; &amp;gt;&amp;gt; %LogFile%&lt;BR&gt;&amp;nbsp; echo %Depcmd1% 
&lt;P&gt;&amp;nbsp; call %Depcmd1% &amp;gt;&amp;gt; %LogFile% 
&lt;P&gt;:// If error with command tell user but DONT dump out of script 
&lt;P&gt;&amp;nbsp; if "%ERRORLEVEL%"=="0" goto :deactivateok&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; echo Error running STSADM deactivate command, please check log file located at %LogFile%. &amp;gt;&amp;gt; %LogFile%&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; echo Error running STSADM deactivate command, please check log file located at %LogFile%.&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; set ERRORLEVEL=0&lt;BR&gt;&amp;nbsp; :deactivateok 
&lt;P&gt;&amp;nbsp; set RETSTS=0 
&lt;P&gt;:// Activate the feature 
&lt;P&gt;&amp;nbsp; set Depcmd2=%stsadmpath%\stsadm -o activatefeature -name %DepFeatureName1% -url &lt;A href="http://%WebSiteName%" mce_href="http://%WebSiteName%"&gt;http://%WebSiteName%&lt;/A&gt; 
&lt;P&gt;&amp;nbsp; echo Running the following command to unextend the &lt;A href="http://%WebSiteName%" mce_href="http://%WebSiteName%"&gt;http://%WebSiteName%&lt;/A&gt; Web Site: &amp;gt;&amp;gt; %LogFile%&lt;BR&gt;&amp;nbsp; echo Running the following command to unextend the &lt;A href="http://%WebSiteName%" mce_href="http://%WebSiteName%"&gt;http://%WebSiteName%&lt;/A&gt; Web Site: &lt;BR&gt;&amp;nbsp; echo %Depcmd2%&amp;nbsp; &amp;gt;&amp;gt; %LogFile%&lt;BR&gt;&amp;nbsp; echo %Depcmd2% 
&lt;P&gt;&amp;nbsp; call %Depcmd2% &amp;gt;&amp;gt; %LogFile% 
&lt;P&gt;:// If error with command tell user but DONT dump out of script 
&lt;P&gt;&amp;nbsp; if "%ERRORLEVEL%"=="0" goto :deactivateok&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; echo Error running STSADM deactivate command, please check log file located at %LogFile%. &amp;gt;&amp;gt; %LogFile%&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; echo Error running STSADM deactivate command, please check log file located at %LogFile%.&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; set ERRORLEVEL=0&lt;BR&gt;&amp;nbsp; :deactivateok 
&lt;P&gt;:// Executing the commands across the farm, this done after most commands 
&lt;P&gt;&amp;nbsp; set cmd10=%stsadmpath%\stsadm -o execadmsvcjobs 
&lt;P&gt;&amp;nbsp; echo Executing the commands across the farm using the command: &amp;gt;&amp;gt; %LogFile%&lt;BR&gt;&amp;nbsp; echo Executing the commands across the farm using the command&lt;BR&gt;&amp;nbsp; echo %cmd10% &amp;gt;&amp;gt; %LogFile%&lt;BR&gt;&amp;nbsp; echo %cmd10% 
&lt;P&gt;&amp;nbsp; call %cmd10% &amp;gt;&amp;gt; %LogFile% 
&lt;P&gt;:// If error with command tell user and dump out of script 
&lt;P&gt;&amp;nbsp; if "%ERRORLEVEL%"=="0" goto :execute4ok&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; echo Error executing execadmsvcjobs4, please check log file located at %LogFile%. &amp;gt;&amp;gt; %LogFile%&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; echo Error executing execadmsvcjobs4, please check log file located at %LogFile%.&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; goto :bigerror&lt;BR&gt;&amp;nbsp; :execute4ok 
&lt;P&gt;://The finish line 
&lt;P&gt;&amp;nbsp; echo.&lt;BR&gt;&amp;nbsp; echo.&lt;BR&gt;&amp;nbsp; echo +----------------------------------------------------+&lt;BR&gt;&amp;nbsp; echo&amp;nbsp; Script is successful and did not return any errors &lt;BR&gt;&amp;nbsp; echo&amp;nbsp; Log File located at: %LogFile%&lt;BR&gt;&amp;nbsp; echo +----------------------------------------------------+&lt;BR&gt;&amp;nbsp; echo.&lt;BR&gt;&amp;nbsp; echo Script is successful and did not return any errors &amp;gt;&amp;gt; %LogFile%&lt;BR&gt;&amp;nbsp; echo SUCCESS SUCCESS SUCCESS SUCCESS &amp;gt;&amp;gt; %LogFile%&amp;nbsp; 
&lt;P&gt;&amp;nbsp; goto :end 
&lt;P&gt;:bigerror&lt;BR&gt;&amp;nbsp; echo !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! &amp;gt;&amp;gt; %LogFile%&lt;BR&gt;&amp;nbsp; echo. &amp;gt;&amp;gt; %LogFile%&lt;BR&gt;&amp;nbsp; echo ERROR ERROR ERROR ERROR &amp;gt;&amp;gt; %LogFile%&lt;BR&gt;&amp;nbsp; echo A catastropic error has occured and the deployment can not continue, please check &amp;gt;&amp;gt; %LogFile%&lt;BR&gt;&amp;nbsp; echo error logs located at %LogFile% &amp;gt;&amp;gt; %LogFile%&lt;BR&gt;&amp;nbsp; echo The return status code was %RETSTS% %ERRORLEVEL% &amp;gt;&amp;gt; %LogFile%&lt;BR&gt;&amp;nbsp; echo. &amp;gt;&amp;gt; %LogFile%&lt;BR&gt;&amp;nbsp; echo !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! &amp;gt;&amp;gt; %LogFile%&lt;BR&gt;&amp;nbsp; echo.&lt;BR&gt;&amp;nbsp; echo.&lt;BR&gt;&amp;nbsp; echo.&lt;BR&gt;&amp;nbsp; echo !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!&lt;BR&gt;&amp;nbsp; echo.&lt;BR&gt;&amp;nbsp; echo A catastropic error has occured and the deployment can not continue, please check&lt;BR&gt;&amp;nbsp; echo error logs located at %LogFile%&lt;BR&gt;&amp;nbsp; echo The return status code was %RETSTS% %ERRORLEVEL%&lt;BR&gt;&amp;nbsp; echo.&lt;BR&gt;&amp;nbsp; echo !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!&lt;BR&gt;&amp;nbsp; echo.&lt;BR&gt;&amp;nbsp; echo.&lt;BR&gt;&amp;nbsp; goto :end&lt;BR&gt;://////////////////////////////////////////////////&lt;BR&gt;://&lt;BR&gt;:// Script end.&lt;BR&gt;://&lt;BR&gt;:////////////////////////////////////////////////// 
&lt;P&gt;:end 
&lt;P&gt;&amp;nbsp; echo. &amp;gt;&amp;gt; %LogFile%&lt;BR&gt;&amp;nbsp; Date /T &amp;gt;&amp;gt; %LogFile%&lt;BR&gt;&amp;nbsp; Time /T &amp;gt;&amp;gt; %LogFile%&lt;BR&gt;&amp;nbsp; echo COMPLETED COMPLETED COMPLETED COMPLETED &amp;gt;&amp;gt; %LogFile%&lt;BR&gt;&amp;nbsp; echo. &amp;gt;&amp;gt; %LogFile%&lt;BR&gt;&amp;nbsp; echo. &amp;gt;&amp;gt; %LogFile% 
&lt;P&gt;&amp;nbsp; set LogFile=&lt;BR&gt;&amp;nbsp; set PathtoCode=&lt;BR&gt;&amp;nbsp; set AppVer=&lt;BR&gt;&amp;nbsp; set WebSiteName=&lt;BR&gt;&amp;nbsp; set SiteDefName=&lt;BR&gt;&amp;nbsp; set PathToScripts=&lt;BR&gt;&amp;nbsp; set cmd1=&lt;BR&gt;&amp;nbsp; set cmd2=&lt;BR&gt;&amp;nbsp; set cmd3=&lt;BR&gt;&amp;nbsp; set cmd4=&lt;BR&gt;&amp;nbsp; set cmd5=&lt;BR&gt;&amp;nbsp; set cmd6=&lt;BR&gt;&amp;nbsp; set cmd7=&lt;BR&gt;&amp;nbsp; set cmd8=&lt;BR&gt;&amp;nbsp; set cmd9=&lt;BR&gt;&amp;nbsp; set cmd10=&lt;BR&gt;&amp;nbsp; set RETSTS= &lt;/P&gt;&lt;img src="http://blogs.technet.com/aggbug.aspx?PostID=1791292" width="1" height="1"&gt;</description><category domain="http://blogs.technet.com/mhass/archive/tags/All+Posts+Mhass/default.aspx">All Posts Mhass</category><category domain="http://blogs.technet.com/mhass/archive/tags/SharePoint/default.aspx">SharePoint</category><category domain="http://blogs.technet.com/mhass/archive/tags/Development/default.aspx">Development</category></item><item><title>Inside WSS 3.0</title><link>http://blogs.technet.com/mhass/archive/2007/06/21/inside-wss-3-0.aspx</link><pubDate>Fri, 22 Jun 2007 00:30:00 GMT</pubDate><guid isPermaLink="false">d5e57398-b9ef-4490-9955-07cbb4e4a80d:1317449</guid><dc:creator>mhass</dc:creator><slash:comments>0</slash:comments><comments>http://blogs.technet.com/mhass/comments/1317449.aspx</comments><wfw:commentRss>http://blogs.technet.com/mhass/commentrss.aspx?PostID=1317449</wfw:commentRss><wfw:comment>http://blogs.technet.com/mhass/rsscomments.aspx?PostID=1317449</wfw:comment><description>&lt;P&gt;In a really weird coincidence today, I ran into a great book about WSS 3.0.&lt;/P&gt;
&lt;P&gt;I have been busy hacking away at some old scripts that push around templates, etc on the file system for WSS and MOSS.&amp;nbsp; The goal is to take a build from Team Foundation Server (TFS) and be able to deploy it to dev, test or production.&amp;nbsp; I knew that WSS 3.0 allows you to deploy solutions using STSADM, so my famous old WSS 2.0 scripts could be truncated to just invoke stsadm on the different site collections.&amp;nbsp;&lt;/P&gt;
&lt;P&gt;I started poking around MSDN and found some great articles:&lt;/P&gt;
&lt;P&gt;&lt;A href="http://msdn2.microsoft.com/en-us/library/bb530302.aspx" mce_href="http://msdn2.microsoft.com/en-us/library/bb530302.aspx"&gt;http://msdn2.microsoft.com/en-us/library/bb530302.aspx&lt;/A&gt;&lt;BR&gt;&lt;A href="http://msdn2.microsoft.com/en-us/library/bb530301.aspx" mce_href="http://msdn2.microsoft.com/en-us/library/bb530301.aspx"&gt;http://msdn2.microsoft.com/en-us/library/bb530301.aspx&lt;/A&gt;&lt;BR&gt;&lt;A href="http://msdn2.microsoft.com/en-us/library/aa544500.aspx" mce_href="http://msdn2.microsoft.com/en-us/library/aa544500.aspx"&gt;http://msdn2.microsoft.com/en-us/library/aa544500.aspx&lt;/A&gt; 
&lt;P&gt;At the bottom, some astute developer added some sample code, which was great news.&amp;nbsp; Who is this developer?&amp;nbsp; Low and behold, it is my friend Dan Larsen, whom I worked with on&amp;nbsp; several projects that included WSS/SPS 2.0 Internet facing sites for some really big telcos.&lt;/P&gt;
&lt;P&gt;&lt;IMG src="http://www.microsoft.com/MSPress/books/imgt/9692.gif" align=right mce_src="http://www.microsoft.com/MSPress/books/imgt/9692.gif"&gt;At the exact same time I was reading the MSDN stuff, one of our developers came to my desk to discuss some MOSS 2007 deployment stuff and mentioned this great book they had upstairs.&amp;nbsp; One of the authors of "&lt;B&gt;&lt;A href="http://www.microsoft.com/MSPress/books/9692.aspx" mce_href="http://www.microsoft.com/MSPress/books/9692.aspx"&gt;Inside Microsoft® Windows® SharePoint® Services 3.0&lt;/A&gt;" &lt;/B&gt;is none other that Dan Larsen.&amp;nbsp; Some weird planetary alignment all&amp;nbsp;pointed to Dan today.&amp;nbsp; The developers upstairs all were&amp;nbsp;raving over how in depth this book was, that just came out this month.&lt;/P&gt;
&lt;P&gt;Dan also has a great &lt;A href="http://www.codeplex.com/sharepointajax/Release/ProjectReleases.aspx?ReleaseId=3169" mce_href="http://www.codeplex.com/sharepointajax/Release/ProjectReleases.aspx?ReleaseId=3169"&gt;Visual Studio Template for deployment and Ajax Toolkit up on codeplex&lt;/A&gt; that allows you to create WSP packages.&lt;/P&gt;
&lt;P&gt;Congrats Dan, and thanks for the nod in the book!&lt;/P&gt;&lt;img src="http://blogs.technet.com/aggbug.aspx?PostID=1317449" width="1" height="1"&gt;</description><category domain="http://blogs.technet.com/mhass/archive/tags/All+Posts+Mhass/default.aspx">All Posts Mhass</category><category domain="http://blogs.technet.com/mhass/archive/tags/SharePoint/default.aspx">SharePoint</category><category domain="http://blogs.technet.com/mhass/archive/tags/Development/default.aspx">Development</category></item><item><title>Escape from yesterworld</title><link>http://blogs.technet.com/mhass/archive/2005/07/27/408271.aspx</link><pubDate>Wed, 27 Jul 2005 21:29:00 GMT</pubDate><guid isPermaLink="false">d5e57398-b9ef-4490-9955-07cbb4e4a80d:408271</guid><dc:creator>mhass</dc:creator><slash:comments>0</slash:comments><comments>http://blogs.technet.com/mhass/comments/408271.aspx</comments><wfw:commentRss>http://blogs.technet.com/mhass/commentrss.aspx?PostID=408271</wfw:commentRss><wfw:comment>http://blogs.technet.com/mhass/rsscomments.aspx?PostID=408271</wfw:comment><description>&lt;P&gt;This is a pretty funny marketing site for SQL 2005 and VS 2005.&lt;/P&gt;
&lt;P&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Arial"&gt;&lt;A title=http://www.escapeyesterworld.com/ href="http://www.escapeyesterworld.com/"&gt;http://www.escapeyesterworld.com/&lt;/A&gt;&lt;?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;&lt;img src="http://blogs.technet.com/aggbug.aspx?PostID=408271" width="1" height="1"&gt;</description><category domain="http://blogs.technet.com/mhass/archive/tags/All+Posts+Mhass/default.aspx">All Posts Mhass</category><category domain="http://blogs.technet.com/mhass/archive/tags/Development/default.aspx">Development</category><category domain="http://blogs.technet.com/mhass/archive/tags/SQL/default.aspx">SQL</category></item></channel></rss>