MSDeploy API Scenarios

Posted: Nov 03, 2009  6 comments  

Average Rating

Tags

This C# code given below will demonstrate how the MSDeploy API can accomplish some common scenarios that users may want to perform.

The following examples are documented below in no particular order:

I. Server Sync IIS6.0 to IIS6.0 with ‘whatif’,deleting allowed and no content

II. Sync with tracing ( verbose is demonstrated )

III. Skip directive usage

IV. Replace Rule + Skip Rule ( using skipAction ) usage

V. Sync a site from iis7 to Hostable web core ( iis7 )

VI. SetAcl on a directory ( setting provider settings )

If you would like other examples posted or have a request please post below and it could be submitted in the future.

I. Server Sync IIS6.0 to IIS6.0 with ‘whatif’,deleting allowed and no content –  Setup a server with no content, just the settings and configuration moving from one IIS6.0 box to another IIS6.0 box allowing deletion

 

msdeploy –verb:sync –source:metakey,computername=computer,username=user,password=password –whatif –disableLink:ContentExtension –disableRule:DoNotDeleteRule

using System;
using Microsoft.Web.Deployment;

namespace MSDeploy.Web.Deployment
{
    class Program
    {
        static void Main(string[] args)
        {
            DeploymentBaseOptions sourceBaseOptions = new DeploymentBaseOptions();
            DeploymentBaseOptions destBaseOptions = new DeploymentBaseOptions();
            DeploymentSyncOptions syncOptions = new DeploymentSyncOptions();

            // setup remote credential information to source machine
            sourceBaseOptions.ComputerName = "computer";
            sourceBaseOptions.UserName = @"user";
            sourceBaseOptions.Password = "password";

            // setup remote credential information to destination machine
            destBaseOptions.ComputerName = "computer";
            destBaseOptions.UserName  = @"user";
            destBaseOptions.Password = "password";

            // use whatif to avoid any operations from happening, but set delete destination to true to see how much
            // will be deleted if this sync operation occurred
            syncOptions.WhatIf = true;
            syncOptions.DeleteDestination = true;

            // remove these rules to allow deletions of destination
            syncOptions.Rules.Remove("BlockHarmfulDeleteOperations");
            syncOptions.Rules.Remove("BlockUnsupportedDeleteOperations");

            // disableLink:contentExtension, must be done for both source and destination base options
            foreach (DeploymentLinkExtension extension in sourceBaseOptions.LinkExtensions)
            {
                if (extension.Name == "ContentExtension")
                {
                    extension.Enabled = false;
                    break;
                }
            } 

            foreach (DeploymentLinkExtension extension in destBaseOptions.LinkExtensions)
            {
                if (extension.Name == "ContentExtension")
                {
                    extension.Enabled = false;
                    break;
                }
            }

            // perform a sync using webserver60 provider, if doing iis7 to iis7 this should be apphostconfig provider
            DeploymentObject deploymentObject = DeploymentManager.CreateObject("webserver60", "", sourceBaseOptions);

            // collect and report all the changes that would happen
            DeploymentChangeSummary changes = deploymentObject.SyncTo(destBaseOptions, syncOptions);

            Console.WriteLine("BytesCopied:       " + changes.BytesCopied.ToString());
            Console.WriteLine("Added:             " + changes.ObjectsAdded.ToString());
            Console.WriteLine("Updated:           " + changes.ObjectsUpdated.ToString());
            Console.WriteLine("Deleted:           " + changes.ObjectsDeleted.ToString());
            Console.WriteLine("Errors:            " + changes.Errors.ToString());
            Console.WriteLine("Warnings:          " + changes.Warnings.ToString());
            Console.WriteLine("ParametersChanged: " + changes.ParameterChanges.ToString());
            Console.WriteLine("TotalChanges:      " + changes.TotalChanges.ToString());
        }
    }
}
 

II. Sync with verbose tracing -  Enable tracing of verbose events during a sync operation by adding into their event handlers.  This may allow you to troubleshoot or simply confirm certain operations take place after a sync

 

msdeploy –verb:sync –source:metaKey=“Default Web Site”,computername=sourcemachine –dest:metaKey=”Default Web Site”,computername=destMachine –verbose –whatif

 

        static void Main(string[] args)
        {
            DeploymentBaseOptions sourceBaseOptions = new DeploymentBaseOptions();
            DeploymentBaseOptions destBaseOptions = new DeploymentBaseOptions();
            DeploymentSyncOptions syncOptions = new DeploymentSyncOptions();
    
            sourceBaseOptions.Trace += new EventHandler<DeploymentTraceEventArgs>(Source_Trace);
            sourceBaseOptions.TraceLevel = System.Diagnostics.TraceLevel.Verbose;
            sourceBaseOptions.ComputerName = "sourcemachine";

            destBaseOptions.Trace += new EventHandler<DeploymentTraceEventArgs>(Dest_Trace);
            destBaseOptions.TraceLevel = System.Diagnostics.TraceLevel.Verbose;
            destBaseOptions.ComputerName = "destmachine";

            syncOptions.WhatIf = true;

            using (DeploymentObject deploymentObject =
                   DeploymentManager.CreateObject(DeploymentWellKnownProvider.MetaKey, "Default Web Site", sourceBaseOptions))
            {
                deploymentObject.SyncTo(DeploymentWellKnownProvider.MetaKey, "AnotherDefaultSite3",
                              destBaseOptions, syncOptions);
            }
        }

        static void Dest_Trace(object sender, DeploymentTraceEventArgs e)
        {
            string name = System.Reflection.MethodInfo.GetCurrentMethod().Name;
            Console.WriteLine(name + ": " + e.Message);
        }

        static void Source_Trace(object sender, DeploymentTraceEventArgs e)
        {
            string name = System.Reflection.MethodInfo.GetCurrentMethod().Name;
            Console.WriteLine(name + ": " + e.Message);
        }
 

III. Skip machine and root configuration settings during a sync from IIS6 to IIS6

 

msdeploy –verb:sync –source:webserver60,computername=source,username=user,password=password –dest:webserver60,computername=dest,username=user,password=password –skip:objectName=machineConfig,attributes.path=”/” –skip:objectName=rootWebConfig,attributes.path=”/” –verbose

 

        static void Main(string[] args)
        {
            DeploymentBaseOptions sourceBaseOptions = new DeploymentBaseOptions();
            DeploymentBaseOptions destinationBaseOptions = new DeploymentBaseOptions();
            DeploymentSyncOptions syncOptions = new DeploymentSyncOptions();

            sourceBaseOptions.ComputerName = "source";
            sourceBaseOptions.UserName = "user";
            sourceBaseOptions.Password = "password";

            destinationBaseOptions.ComputerName = "dest";
            destinationBaseOptions.UserName = "user";
            destinationBaseOptions.Password = "password";

            using (DeploymentObject deploymentObject = 
                   DeploymentManager.CreateObject(DeploymentWellKnownProvider.WebServer60, "", sourceBaseOptions))
            {
                DeploymentSkipDirective skipMachineConfig = 
                   new DeploymentSkipDirective("skipMachineConfig",@"objectName=machineConfig,attributes.path=""/""",true);
                DeploymentSkipDirective skipRootWebConfig = 
                   new DeploymentSkipDirective("skipRootWebConfig",@"objectName=rootWebConfig,attributes.path=""/""",true);

                sourceBaseOptions.SkipDirectives.Add(skipMachineConfig);
                sourceBaseOptions.SkipDirectives.Add(skipRootWebConfig);

                destinationBaseOptions.SkipDirectives.Add(skipMachineConfig);
                destinationBaseOptions.SkipDirectives.Add(skipRootWebConfig);

                sourceBaseOptions.TraceLevel = System.Diagnostics.TraceLevel.Verbose;
                destinationBaseOptions.TraceLevel = System.Diagnostics.TraceLevel.Verbose;

                sourceBaseOptions.Trace += new EventHandler<DeploymentTraceEventArgs>(sourceBaseOptions_Trace);
                destinationBaseOptions.Trace += new EventHandler<DeploymentTraceEventArgs>(destinationBaseOptions_Trace);

                deploymentObject.SyncTo
                    (
                        DeploymentWellKnownProvider.WebServer60,
                        "",
                        destinationBaseOptions,
                        syncOptions
                    );
            }
        }

        static void destinationBaseOptions_Trace(object sender, DeploymentTraceEventArgs e)
        {
            Console.WriteLine("dest: " + e.Message);
        }

        static void sourceBaseOptions_Trace(object sender, DeploymentTraceEventArgs e)
        {
            Console.WriteLine("source: " + e.Message);
        }

IV. Replace the name of DefaultAppPool with NewDefaultAppPool when performing a sync with AppPoolConfig provider from IIS7 to IIS7 and skip deleting the destination’s DefaultAppPool by applying a skip rule to ignore Delete operations

 

msdeploy –verb:sync –source:appPoolConfig,computername=computer,username=user,password=password –dest:appPoolConfig,computername=computer,username=user,password=password –replace:objectName=add,targetAttributeName=name,match=DefaultAppPool,replace=NewDefaultAppPool –skip:skipAction=Delete,objectname=add

 

        static void Main(string[] args)
        {
            DeploymentBaseOptions sourceBaseOptions = new DeploymentBaseOptions();
            DeploymentBaseOptions destinationBaseOptions = new DeploymentBaseOptions();
            DeploymentSyncOptions syncOptions = new DeploymentSyncOptions();

            sourceBaseOptions.ComputerName = "computer";
            sourceBaseOptions.UserName = "user";
            sourceBaseOptions.Password = "password";

            destinationBaseOptions.ComputerName = "computer";
            destinationBaseOptions.UserName = "user";
            destinationBaseOptions.Password = "password";

            using (DeploymentObject deploymentObject = 
                   DeploymentManager.CreateObject(DeploymentWellKnownProvider.AppPoolConfig, "", sourceBaseOptions))
            {
                DeploymentReplaceRule replaceAppPoolName = 
                   new DeploymentReplaceRule("replaceDefaultAppPool",
                                             "add",
                                             null,
                                             null,
                                             "name",
                                             "DefaultAppPool",
                                             "NewDefaultAppPool");
                DeploymentSkipRule skipDelete = new DeploymentSkipRule("skipDeleteOnDestination", "Delete", "add",null,null);
                syncOptions.Rules.Add(replaceAppPoolName);
                syncOptions.Rules.Add(skipDelete);
                deploymentObject.SyncTo(destinationBaseOptions,syncOptions);
            }
        }
 

V. Sync from a live server to Hostable Web Core

       static void Main(string[] args)
        {
            DeploymentBaseOptions sourceBaseOptions = new DeploymentBaseOptions();
            DeploymentBaseOptions destinationBaseOptions = new DeploymentBaseOptions();
            DeploymentSyncOptions syncOptions = new DeploymentSyncOptions();
            sourceBaseOptions.ComputerName = "computer";
            sourceBaseOptions.UserName = @"user";
            sourceBaseOptions.Password = "password";

            // core modules      
            destinationBaseOptions.WebServerConfiguration.WebServerDirectory = @"C:\windows\system32\inetsrv";      
            
            // new configuration for webcore
            destinationBaseOptions.WebServerConfiguration.ConfigurationDirectory = @"F:\myconfigpath"; 
            destinationBaseOptions.ComputerName = "computer";
            destinationBaseOptions.UserName = @"user";
            destinationBaseOptions.Password = "password";

            using (DeploymentObject deploymentObject =
                   DeploymentManager.CreateObject(
                       DeploymentWellKnownProvider.AppHostConfig,
                       "Default Web Site",
                       sourceBaseOptions))
            {
                deploymentObject.SyncTo(destinationBaseOptions,syncOptions);
            }
        } 
VI. Set ACLs on a directory for an application

 

msdeploy –verb:sync –source:setacl –dest:setacl=”C:\inetpub\wwwroot2”,setAclUser=”user”,setAclAccess=”Read”,setAclResourceType=”Directory”

 

        static void Main(string[] args)
        {

            DeploymentBaseOptions destination = new DeploymentBaseOptions();
            DeploymentSyncOptions syncOptions = new DeploymentSyncOptions();

            destination.AddDefaultProviderSetting("setAcl", "setAclUser", "user");
            destination.AddDefaultProviderSetting("setAcl", "setAclAccess", "Read");
            destination.AddDefaultProviderSetting("setAcl", "setAclresourceType", "Directory");

            using (DeploymentObject deploymentObject = DeploymentManager.CreateObject("setAcl",@"c:\inetpub\wwwroot2"))
            {
                deploymentObject.SyncTo(destination, syncOptions);
            }
        }
 

More to come in the future..

Comments

Submit a Comment

Microsoft Communities