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..