<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://blogs.iis.net/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/" xmlns:cs="http://blogs.iis.net/"><channel><title>JC Blogs</title><link>http://blogs.iis.net/jamescoo/default.aspx</link><description>Blogs by James</description><dc:language>en</dc:language><generator>CommunityServer 2007 SP1 (Debug Build: 20510.895)</generator><item><title>Web Deployment Tool Now Works With Credential Store</title><link>http://blogs.iis.net/jamescoo/archive/2010/02/07/webdeployment-tool-now-works-with-credential-store.aspx</link><pubDate>Sun, 07 Feb 2010 01:00:00 GMT</pubDate><guid isPermaLink="false">50bcf3b4-f6fe-4638-adff-0c150e922e99:3664845</guid><dc:creator>Jamescoo</dc:creator><slash:comments>1</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.iis.net/jamescoo/rsscomments.aspx?PostID=3664845</wfw:commentRss><comments>http://blogs.iis.net/jamescoo/archive/2010/02/07/webdeployment-tool-now-works-with-credential-store.aspx#comments</comments><description>&lt;P&gt;The Web&amp;nbsp;Deployment Tool will be releasing a brand new feature in the newest&amp;nbsp;version 1.1.&amp;nbsp; This new feature will allow users to store their passwords in Window’s credential store on command-line using Web Deploy and / or access credential stored password information via command-line.&amp;nbsp; This is very useful if you do not want to expose your password on command-line and keep it from showing up in&amp;nbsp;any of your log files that may capture command line input.&lt;/P&gt;
&lt;P&gt;The way to accomplish this&amp;nbsp;is two new switches ( straight from command-line help ):&lt;/P&gt;
&lt;P&gt;getCredentials=&amp;lt;target&amp;gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Target identifies the credentials (username &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; and password) in the Windows Credential &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Manager to be used when connecting to &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; remote computer.&lt;/P&gt;
&lt;P&gt;storeCredentials=&amp;lt;target&amp;gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Username and password will be stored in the &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Windows Credential Manager under the target &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; identifier.&lt;/P&gt;
&lt;P&gt;Example of “storeCredentials” is as follows:&lt;/P&gt;
&lt;BLOCKQUOTE&gt;
&lt;P&gt;msdeploy.exe –verb:dump –source:iisapp=”Default Web Site/”,computername=MachineName,username=User,password=Password,storeCredentials=UserCredential&lt;/P&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;Now to get the above credential back using the “getCredentials”.&lt;/P&gt;
&lt;BLOCKQUOTE&gt;
&lt;P&gt;msdeploy.exe –verb:dump –source:iisapp=”Default Web Site/”,computername=MachineName,getCredentials=UserCredential&lt;/P&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;In the above examples there is a few things to take note of starting with the “storeCredential” switch.&lt;/P&gt;
&lt;BLOCKQUOTE&gt;
&lt;P&gt;&amp;gt; Regardless of the output, the target credential will be stored if Web Deploy can interpret the command successfully.&lt;/P&gt;
&lt;P&gt;&amp;gt; “storeCredential” is very useful in XP environments as there is no UI for credential store in XP.&lt;/P&gt;
&lt;P&gt;&amp;gt; You can view credentials you store in non-XP operating systems in a UI like this one, ( 2008 example ) by navigating “User Accounts &amp;gt; Manage your network passwords”&lt;/P&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;&lt;A href="http://blogs.iis.net/blogs/jamescoo/image_04F245D7.png" mce_href="http://blogs.iis.net/blogs/jamescoo/image_04F245D7.png"&gt;&lt;IMG style="BORDER-RIGHT-WIDTH: 0px; DISPLAY: inline; BORDER-TOP-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px" title=image border=0 alt=image src="http://blogs.iis.net/blogs/jamescoo/image_thumb_2434ECAA.png" width=361 height=354 mce_src="http://blogs.iis.net/blogs/jamescoo/image_thumb_2434ECAA.png"&gt;&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;Some notes about “getCredentials”:&lt;/P&gt;
&lt;BLOCKQUOTE&gt;
&lt;P&gt;&amp;gt; You can only do a “getCredentials” on credentials that your user account stored, so if&amp;nbsp;any user stores credentials in the credential store, you will not be able to use this target under a different user who did not store the credentials.&amp;nbsp; And actually, Web Deploy will give no indication whether or not the target existed in the store.&lt;/P&gt;&lt;/BLOCKQUOTE&gt;
&lt;P mce_keep="true"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;gt; A downside to this is you will have to perform a storeCredentials on any targets you use when you switch to other user accounts.&lt;/P&gt;
&lt;BLOCKQUOTE&gt;
&lt;P mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;&lt;/BLOCKQUOTE&gt;&lt;img src="http://blogs.iis.net/aggbug.aspx?PostID=3664845" width="1" height="1"&gt;</description><category domain="http://blogs.iis.net/jamescoo/archive/tags/Credential/default.aspx">Credential</category><category domain="http://blogs.iis.net/jamescoo/archive/tags/New/default.aspx">New</category><category domain="http://blogs.iis.net/jamescoo/archive/tags/Refresh/default.aspx">Refresh</category><category domain="http://blogs.iis.net/jamescoo/archive/tags/WebDeploy/default.aspx">WebDeploy</category><category domain="http://blogs.iis.net/jamescoo/archive/tags/Feature/default.aspx">Feature</category></item><item><title>MSDeploy API Scenarios</title><link>http://blogs.iis.net/jamescoo/archive/2009/11/03/msdeploy-api-scenarios.aspx</link><pubDate>Tue, 03 Nov 2009 00:57:00 GMT</pubDate><guid isPermaLink="false">50bcf3b4-f6fe-4638-adff-0c150e922e99:3490355</guid><dc:creator>Jamescoo</dc:creator><slash:comments>4</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.iis.net/jamescoo/rsscomments.aspx?PostID=3490355</wfw:commentRss><comments>http://blogs.iis.net/jamescoo/archive/2009/11/03/msdeploy-api-scenarios.aspx#comments</comments><description>&lt;p&gt;This C# code given below will demonstrate how the MSDeploy API can accomplish some common scenarios that users may want to perform.&lt;/p&gt;  &lt;p&gt;The following examples are documented below in no particular order:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;strong&gt;&lt;font size="3"&gt;I. Server Sync IIS6.0 to IIS6.0 with ‘whatif’,deleting allowed and no content&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;    &lt;p&gt;&lt;strong&gt;&lt;font size="3"&gt;II. Sync with tracing ( verbose is demonstrated )&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;    &lt;p&gt;&lt;strong&gt;&lt;font size="3"&gt;III. Skip directive usage&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;    &lt;p&gt;&lt;strong&gt;&lt;font size="3"&gt;IV. Replace Rule + Skip Rule ( using skipAction ) usage&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;    &lt;p&gt;&lt;strong&gt;&lt;font size="3"&gt;V. Sync a site from iis7 to Hostable web core ( iis7 )&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;    &lt;p&gt;&lt;strong&gt;&lt;font size="3"&gt;VI. SetAcl on a directory ( setting provider settings )&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;If you would like other examples posted or have a request please post below and it could be submitted in the future.&lt;/p&gt;  &lt;p&gt;&lt;font size="4"&gt;&lt;strong&gt;I. Server Sync IIS6.0 to IIS6.0 with ‘whatif’,deleting allowed and no content –&amp;#160; Setup a server with no content, just the settings and configuration moving from one IIS6.0 box to another IIS6.0 box allowing deletion&lt;/strong&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font size="4"&gt;&lt;/font&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;font color="#400080"&gt;msdeploy –verb:sync –source:metakey,computername=computer,username=user,password=password –whatif –disableLink:ContentExtension –disableRule:DoNotDeleteRule&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; System;
&lt;span class="kwrd"&gt;using&lt;/span&gt; Microsoft.Web.Deployment;

&lt;span class="kwrd"&gt;namespace&lt;/span&gt; MSDeploy.Web.Deployment
{
    &lt;span class="kwrd"&gt;class&lt;/span&gt; Program
    {
        &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; Main(&lt;span class="kwrd"&gt;string&lt;/span&gt;[] args)
        {
            DeploymentBaseOptions sourceBaseOptions = &lt;span class="kwrd"&gt;new&lt;/span&gt; DeploymentBaseOptions();
            DeploymentBaseOptions destBaseOptions = &lt;span class="kwrd"&gt;new&lt;/span&gt; DeploymentBaseOptions();
            DeploymentSyncOptions syncOptions = &lt;span class="kwrd"&gt;new&lt;/span&gt; DeploymentSyncOptions();

            &lt;span class="rem"&gt;// setup remote credential information to source machine&lt;/span&gt;
            sourceBaseOptions.ComputerName = &lt;span class="str"&gt;&amp;quot;computer&amp;quot;&lt;/span&gt;;
            sourceBaseOptions.UserName = &lt;span class="str"&gt;@&amp;quot;user&amp;quot;&lt;/span&gt;;
            sourceBaseOptions.Password = &lt;span class="str"&gt;&amp;quot;password&amp;quot;&lt;/span&gt;;

            &lt;span class="rem"&gt;// setup remote credential information to destination machine&lt;/span&gt;
            destBaseOptions.ComputerName = &lt;span class="str"&gt;&amp;quot;computer&amp;quot;&lt;/span&gt;;
            destBaseOptions.UserName  = &lt;span class="str"&gt;@&amp;quot;user&amp;quot;&lt;/span&gt;;
            destBaseOptions.Password = &lt;span class="str"&gt;&amp;quot;password&amp;quot;&lt;/span&gt;;

            &lt;span class="rem"&gt;// use whatif to avoid any operations from happening, but set delete destination to true to see how much&lt;/span&gt;
            &lt;span class="rem"&gt;// will be deleted if this sync operation occurred&lt;/span&gt;
            syncOptions.WhatIf = &lt;span class="kwrd"&gt;true&lt;/span&gt;;
            syncOptions.DeleteDestination = &lt;span class="kwrd"&gt;true&lt;/span&gt;;

            &lt;span class="rem"&gt;// remove these rules to allow deletions of destination&lt;/span&gt;
            syncOptions.Rules.Remove(&lt;span class="str"&gt;&amp;quot;BlockHarmfulDeleteOperations&amp;quot;&lt;/span&gt;);
            syncOptions.Rules.Remove(&lt;span class="str"&gt;&amp;quot;BlockUnsupportedDeleteOperations&amp;quot;&lt;/span&gt;);

            &lt;span class="rem"&gt;// disableLink:contentExtension, must be done for both source and destination base options&lt;/span&gt;
            &lt;span class="kwrd"&gt;foreach&lt;/span&gt; (DeploymentLinkExtension extension &lt;span class="kwrd"&gt;in&lt;/span&gt; sourceBaseOptions.LinkExtensions)
            {
                &lt;span class="kwrd"&gt;if&lt;/span&gt; (extension.Name == &lt;span class="str"&gt;&amp;quot;ContentExtension&amp;quot;&lt;/span&gt;)
                {
                    extension.Enabled = &lt;span class="kwrd"&gt;false&lt;/span&gt;;
                    &lt;span class="kwrd"&gt;break&lt;/span&gt;;
                }
            } 

            &lt;span class="kwrd"&gt;foreach&lt;/span&gt; (DeploymentLinkExtension extension &lt;span class="kwrd"&gt;in&lt;/span&gt; destBaseOptions.LinkExtensions)
            {
                &lt;span class="kwrd"&gt;if&lt;/span&gt; (extension.Name == &lt;span class="str"&gt;&amp;quot;ContentExtension&amp;quot;&lt;/span&gt;)
                {
                    extension.Enabled = &lt;span class="kwrd"&gt;false&lt;/span&gt;;
                    &lt;span class="kwrd"&gt;break&lt;/span&gt;;
                }
            }

            &lt;span class="rem"&gt;// perform a sync using webserver60 provider, if doing iis7 to iis7 this should be apphostconfig provider&lt;/span&gt;
            DeploymentObject deploymentObject = DeploymentManager.CreateObject(&lt;span class="str"&gt;&amp;quot;webserver60&amp;quot;&lt;/span&gt;, &lt;span class="str"&gt;&amp;quot;&amp;quot;&lt;/span&gt;, sourceBaseOptions);

            &lt;span class="rem"&gt;// collect and report all the changes that would happen&lt;/span&gt;
            DeploymentChangeSummary changes = deploymentObject.SyncTo(destBaseOptions, syncOptions);

            Console.WriteLine(&lt;span class="str"&gt;&amp;quot;BytesCopied:       &amp;quot;&lt;/span&gt; + changes.BytesCopied.ToString());
            Console.WriteLine(&lt;span class="str"&gt;&amp;quot;Added:             &amp;quot;&lt;/span&gt; + changes.ObjectsAdded.ToString());
            Console.WriteLine(&lt;span class="str"&gt;&amp;quot;Updated:           &amp;quot;&lt;/span&gt; + changes.ObjectsUpdated.ToString());
            Console.WriteLine(&lt;span class="str"&gt;&amp;quot;Deleted:           &amp;quot;&lt;/span&gt; + changes.ObjectsDeleted.ToString());
            Console.WriteLine(&lt;span class="str"&gt;&amp;quot;Errors:            &amp;quot;&lt;/span&gt; + changes.Errors.ToString());
            Console.WriteLine(&lt;span class="str"&gt;&amp;quot;Warnings:          &amp;quot;&lt;/span&gt; + changes.Warnings.ToString());
            Console.WriteLine(&lt;span class="str"&gt;&amp;quot;ParametersChanged: &amp;quot;&lt;/span&gt; + changes.ParameterChanges.ToString());
            Console.WriteLine(&lt;span class="str"&gt;&amp;quot;TotalChanges:      &amp;quot;&lt;/span&gt; + changes.TotalChanges.ToString());
        }
    }
}&lt;/pre&gt;

&lt;pre class="csharpcode"&gt;&amp;#160;&lt;/pre&gt;
&lt;style type="text/css"&gt;


.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;

&lt;p&gt;&lt;font size="4"&gt;&lt;strong&gt;II. Sync with verbose tracing -&amp;#160; Enable tracing of verbose events during a sync operation by adding into their event handlers.&amp;#160; This may allow you to troubleshoot or simply confirm certain operations take place after a sync&lt;/strong&gt;&lt;/font&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;font size="4"&gt;&lt;/font&gt;&lt;/strong&gt;&amp;#160;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;font color="#400080"&gt;msdeploy –verb:sync –source:metaKey=“Default Web Site”,computername=sourcemachine –dest:metaKey=”Default Web Site”,computername=destMachine –verbose –whatif&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;font color="#400080"&gt;&lt;/font&gt;&lt;/strong&gt;&amp;#160;&lt;/p&gt;

&lt;pre class="csharpcode"&gt;        &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; Main(&lt;span class="kwrd"&gt;string&lt;/span&gt;[] args)
        {
            DeploymentBaseOptions sourceBaseOptions = &lt;span class="kwrd"&gt;new&lt;/span&gt; DeploymentBaseOptions();
            DeploymentBaseOptions destBaseOptions = &lt;span class="kwrd"&gt;new&lt;/span&gt; DeploymentBaseOptions();
            DeploymentSyncOptions syncOptions = &lt;span class="kwrd"&gt;new&lt;/span&gt; DeploymentSyncOptions();
    
            sourceBaseOptions.Trace += &lt;span class="kwrd"&gt;new&lt;/span&gt; EventHandler&amp;lt;DeploymentTraceEventArgs&amp;gt;(Source_Trace);
            sourceBaseOptions.TraceLevel = System.Diagnostics.TraceLevel.Verbose;
            sourceBaseOptions.ComputerName = &lt;span class="str"&gt;&amp;quot;sourcemachine&amp;quot;&lt;/span&gt;;

            destBaseOptions.Trace += &lt;span class="kwrd"&gt;new&lt;/span&gt; EventHandler&amp;lt;DeploymentTraceEventArgs&amp;gt;(Dest_Trace);
            destBaseOptions.TraceLevel = System.Diagnostics.TraceLevel.Verbose;
            destBaseOptions.ComputerName = &lt;span class="str"&gt;&amp;quot;destmachine&amp;quot;&lt;/span&gt;;

            syncOptions.WhatIf = &lt;span class="kwrd"&gt;true&lt;/span&gt;;

            &lt;span class="kwrd"&gt;using&lt;/span&gt; (DeploymentObject deploymentObject =&lt;/pre&gt;

&lt;pre class="csharpcode"&gt;                   DeploymentManager.CreateObject(DeploymentWellKnownProvider.MetaKey, &lt;span class="str"&gt;&amp;quot;Default Web Site&amp;quot;&lt;/span&gt;, sourceBaseOptions))
            {
                deploymentObject.SyncTo(DeploymentWellKnownProvider.MetaKey, &lt;span class="str"&gt;&amp;quot;AnotherDefaultSite3&amp;quot;&lt;/span&gt;,&lt;/pre&gt;

&lt;pre class="csharpcode"&gt;                              destBaseOptions, syncOptions);
            }
        }

        &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; Dest_Trace(&lt;span class="kwrd"&gt;object&lt;/span&gt; sender, DeploymentTraceEventArgs e)
        {
            &lt;span class="kwrd"&gt;string&lt;/span&gt; name = System.Reflection.MethodInfo.GetCurrentMethod().Name;
            Console.WriteLine(name + &lt;span class="str"&gt;&amp;quot;: &amp;quot;&lt;/span&gt; + e.Message);
        }

        &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; Source_Trace(&lt;span class="kwrd"&gt;object&lt;/span&gt; sender, DeploymentTraceEventArgs e)
        {
            &lt;span class="kwrd"&gt;string&lt;/span&gt; name = System.Reflection.MethodInfo.GetCurrentMethod().Name;
            Console.WriteLine(name + &lt;span class="str"&gt;&amp;quot;: &amp;quot;&lt;/span&gt; + e.Message);
        }&lt;/pre&gt;

&lt;pre class="csharpcode"&gt;&amp;#160;&lt;/pre&gt;
&lt;style type="text/css"&gt;


.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;

&lt;p&gt;&lt;strong&gt;&lt;font size="4"&gt;III. Skip machine and root configuration settings during a sync from IIS6 to IIS6&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;font size="4"&gt;&lt;/font&gt;&lt;/strong&gt;&amp;#160;&lt;/p&gt;

&lt;p&gt;&lt;font color="#400080"&gt;&lt;strong&gt;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&lt;/strong&gt;&lt;/font&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;font color="#400080"&gt;&lt;/font&gt;&lt;/strong&gt;&amp;#160;&lt;/p&gt;

&lt;pre class="csharpcode"&gt;        &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; Main(&lt;span class="kwrd"&gt;string&lt;/span&gt;[] args)
        {
            DeploymentBaseOptions sourceBaseOptions = &lt;span class="kwrd"&gt;new&lt;/span&gt; DeploymentBaseOptions();
            DeploymentBaseOptions destinationBaseOptions = &lt;span class="kwrd"&gt;new&lt;/span&gt; DeploymentBaseOptions();
            DeploymentSyncOptions syncOptions = &lt;span class="kwrd"&gt;new&lt;/span&gt; DeploymentSyncOptions();

            sourceBaseOptions.ComputerName = &lt;span class="str"&gt;&amp;quot;source&amp;quot;&lt;/span&gt;;
            sourceBaseOptions.UserName = &lt;span class="str"&gt;&amp;quot;user&amp;quot;&lt;/span&gt;;
            sourceBaseOptions.Password = &lt;span class="str"&gt;&amp;quot;password&amp;quot;&lt;/span&gt;;

            destinationBaseOptions.ComputerName = &lt;span class="str"&gt;&amp;quot;dest&amp;quot;&lt;/span&gt;;
            destinationBaseOptions.UserName = &lt;span class="str"&gt;&amp;quot;user&amp;quot;&lt;/span&gt;;
            destinationBaseOptions.Password = &lt;span class="str"&gt;&amp;quot;password&amp;quot;&lt;/span&gt;;

            &lt;span class="kwrd"&gt;using&lt;/span&gt; (DeploymentObject deploymentObject = &lt;/pre&gt;

&lt;pre class="csharpcode"&gt;                   DeploymentManager.CreateObject(DeploymentWellKnownProvider.WebServer60, &lt;span class="str"&gt;&amp;quot;&amp;quot;&lt;/span&gt;, sourceBaseOptions))
            {
                DeploymentSkipDirective skipMachineConfig = &lt;/pre&gt;

&lt;pre class="csharpcode"&gt;                   &lt;span class="kwrd"&gt;new&lt;/span&gt; DeploymentSkipDirective(&lt;span class="str"&gt;&amp;quot;skipMachineConfig&amp;quot;&lt;/span&gt;,&lt;span class="str"&gt;@&amp;quot;objectName=machineConfig,attributes.path=&amp;quot;&lt;/span&gt;&lt;span class="str"&gt;&amp;quot;/&amp;quot;&lt;/span&gt;&lt;span class="str"&gt;&amp;quot;&amp;quot;&lt;/span&gt;,&lt;span class="kwrd"&gt;true&lt;/span&gt;);&lt;/pre&gt;

&lt;pre class="csharpcode"&gt;                DeploymentSkipDirective skipRootWebConfig = &lt;/pre&gt;

&lt;pre class="csharpcode"&gt;                   &lt;span class="kwrd"&gt;new&lt;/span&gt; DeploymentSkipDirective(&lt;span class="str"&gt;&amp;quot;skipRootWebConfig&amp;quot;&lt;/span&gt;,&lt;span class="str"&gt;@&amp;quot;objectName=rootWebConfig,attributes.path=&amp;quot;&lt;/span&gt;&lt;span class="str"&gt;&amp;quot;/&amp;quot;&lt;/span&gt;&lt;span class="str"&gt;&amp;quot;&amp;quot;&lt;/span&gt;,&lt;span class="kwrd"&gt;true&lt;/span&gt;);

                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 += &lt;span class="kwrd"&gt;new&lt;/span&gt; EventHandler&amp;lt;DeploymentTraceEventArgs&amp;gt;(sourceBaseOptions_Trace);
                destinationBaseOptions.Trace += &lt;span class="kwrd"&gt;new&lt;/span&gt; EventHandler&amp;lt;DeploymentTraceEventArgs&amp;gt;(destinationBaseOptions_Trace);

                deploymentObject.SyncTo
                    (
                        DeploymentWellKnownProvider.WebServer60,
                        &lt;span class="str"&gt;&amp;quot;&amp;quot;&lt;/span&gt;,
                        destinationBaseOptions,
                        syncOptions
                    );
            }
        }

        &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; destinationBaseOptions_Trace(&lt;span class="kwrd"&gt;object&lt;/span&gt; sender, DeploymentTraceEventArgs e)
        {
            Console.WriteLine(&lt;span class="str"&gt;&amp;quot;dest: &amp;quot;&lt;/span&gt; + e.Message);
        }

        &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; sourceBaseOptions_Trace(&lt;span class="kwrd"&gt;object&lt;/span&gt; sender, DeploymentTraceEventArgs e)
        {
            Console.WriteLine(&lt;span class="str"&gt;&amp;quot;source: &amp;quot;&lt;/span&gt; + e.Message);
        }&lt;/pre&gt;
&lt;style type="text/css"&gt;


.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;

&lt;p&gt;&lt;font size="4"&gt;&lt;strong&gt;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&lt;/strong&gt;&lt;/font&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;font size="4"&gt;&lt;/font&gt;&lt;/strong&gt;&amp;#160;&lt;/p&gt;

&lt;p&gt;&lt;font color="#400080"&gt;&lt;strong&gt;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&lt;/strong&gt;&lt;/font&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;font color="#400080"&gt;&lt;/font&gt;&lt;/strong&gt;&amp;#160;&lt;/p&gt;

&lt;pre class="csharpcode"&gt;        &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; Main(&lt;span class="kwrd"&gt;string&lt;/span&gt;[] args)
        {
            DeploymentBaseOptions sourceBaseOptions = &lt;span class="kwrd"&gt;new&lt;/span&gt; DeploymentBaseOptions();
            DeploymentBaseOptions destinationBaseOptions = &lt;span class="kwrd"&gt;new&lt;/span&gt; DeploymentBaseOptions();
            DeploymentSyncOptions syncOptions = &lt;span class="kwrd"&gt;new&lt;/span&gt; DeploymentSyncOptions();

            sourceBaseOptions.ComputerName = &lt;span class="str"&gt;&amp;quot;computer&amp;quot;&lt;/span&gt;;
            sourceBaseOptions.UserName = &lt;span class="str"&gt;&amp;quot;user&amp;quot;&lt;/span&gt;;
            sourceBaseOptions.Password = &lt;span class="str"&gt;&amp;quot;password&amp;quot;&lt;/span&gt;;

            destinationBaseOptions.ComputerName = &lt;span class="str"&gt;&amp;quot;computer&amp;quot;&lt;/span&gt;;
            destinationBaseOptions.UserName = &lt;span class="str"&gt;&amp;quot;user&amp;quot;&lt;/span&gt;;
            destinationBaseOptions.Password = &lt;span class="str"&gt;&amp;quot;password&amp;quot;&lt;/span&gt;;

            &lt;span class="kwrd"&gt;using&lt;/span&gt; (DeploymentObject deploymentObject = &lt;/pre&gt;

&lt;pre class="csharpcode"&gt;                   DeploymentManager.CreateObject(DeploymentWellKnownProvider.AppPoolConfig, &lt;span class="str"&gt;&amp;quot;&amp;quot;&lt;/span&gt;, sourceBaseOptions))
            {
                DeploymentReplaceRule replaceAppPoolName = &lt;/pre&gt;

&lt;pre class="csharpcode"&gt;                   &lt;span class="kwrd"&gt;new&lt;/span&gt; DeploymentReplaceRule(&lt;span class="str"&gt;&amp;quot;replaceDefaultAppPool&amp;quot;&lt;/span&gt;,&lt;/pre&gt;

&lt;pre class="csharpcode"&gt;                                             &lt;span class="str"&gt;&amp;quot;add&amp;quot;&lt;/span&gt;,&lt;/pre&gt;

&lt;pre class="csharpcode"&gt;                                             &lt;span class="kwrd"&gt;null&lt;/span&gt;,&lt;/pre&gt;

&lt;pre class="csharpcode"&gt;                                             &lt;span class="kwrd"&gt;null&lt;/span&gt;,&lt;/pre&gt;

&lt;pre class="csharpcode"&gt;                                             &lt;span class="str"&gt;&amp;quot;name&amp;quot;&lt;/span&gt;,&lt;/pre&gt;

&lt;pre class="csharpcode"&gt;                                             &lt;span class="str"&gt;&amp;quot;DefaultAppPool&amp;quot;&lt;/span&gt;,&lt;/pre&gt;

&lt;pre class="csharpcode"&gt;                                             &lt;span class="str"&gt;&amp;quot;NewDefaultAppPool&amp;quot;&lt;/span&gt;);&lt;/pre&gt;

&lt;pre class="csharpcode"&gt;
                DeploymentSkipRule skipDelete = &lt;span class="kwrd"&gt;new&lt;/span&gt; DeploymentSkipRule(&lt;span class="str"&gt;&amp;quot;skipDeleteOnDestination&amp;quot;&lt;/span&gt;, &lt;span class="str"&gt;&amp;quot;Delete&amp;quot;&lt;/span&gt;, &lt;span class="str"&gt;&amp;quot;add&amp;quot;&lt;/span&gt;,&lt;span class="kwrd"&gt;null&lt;/span&gt;,&lt;span class="kwrd"&gt;null&lt;/span&gt;);
                syncOptions.Rules.Add(replaceAppPoolName);
                syncOptions.Rules.Add(skipDelete);
                deploymentObject.SyncTo(destinationBaseOptions,syncOptions);
            }
        }&lt;/pre&gt;

&lt;pre class="csharpcode"&gt;&amp;#160;&lt;/pre&gt;
&lt;style type="text/css"&gt;


.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;

&lt;p&gt;&lt;font size="4"&gt;&lt;strong&gt;V. Sync from a live server to Hostable Web Core &lt;/strong&gt;&lt;/font&gt;&lt;/p&gt;

&lt;pre class="csharpcode"&gt;       &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; Main(&lt;span class="kwrd"&gt;string&lt;/span&gt;[] args)
        {
            DeploymentBaseOptions sourceBaseOptions = &lt;span class="kwrd"&gt;new&lt;/span&gt; DeploymentBaseOptions();
            DeploymentBaseOptions destinationBaseOptions = &lt;span class="kwrd"&gt;new&lt;/span&gt; DeploymentBaseOptions();
            DeploymentSyncOptions syncOptions = &lt;span class="kwrd"&gt;new&lt;/span&gt; DeploymentSyncOptions();
            sourceBaseOptions.ComputerName = &lt;span class="str"&gt;&amp;quot;computer&amp;quot;&lt;/span&gt;;
            sourceBaseOptions.UserName = &lt;span class="str"&gt;@&amp;quot;user&amp;quot;&lt;/span&gt;;
            sourceBaseOptions.Password = &lt;span class="str"&gt;&amp;quot;password&amp;quot;&lt;/span&gt;;

            &lt;span class="rem"&gt;// core modules      &lt;/span&gt;
            destinationBaseOptions.WebServerConfiguration.WebServerDirectory = &lt;span class="str"&gt;@&amp;quot;C:\windows\system32\inetsrv&amp;quot;&lt;/span&gt;;      
            
            &lt;span class="rem"&gt;// new configuration for webcore&lt;/span&gt;
            destinationBaseOptions.WebServerConfiguration.ConfigurationDirectory = &lt;span class="str"&gt;@&amp;quot;F:\myconfigpath&amp;quot;&lt;/span&gt;; &lt;/pre&gt;

&lt;pre class="csharpcode"&gt;            destinationBaseOptions.ComputerName = &lt;span class="str"&gt;&amp;quot;computer&amp;quot;&lt;/span&gt;;
            destinationBaseOptions.UserName = &lt;span class="str"&gt;@&amp;quot;user&amp;quot;&lt;/span&gt;;
            destinationBaseOptions.Password = &lt;span class="str"&gt;&amp;quot;password&amp;quot;&lt;/span&gt;;

            &lt;span class="kwrd"&gt;using&lt;/span&gt; (DeploymentObject deploymentObject =&lt;/pre&gt;

&lt;pre class="csharpcode"&gt;                   DeploymentManager.CreateObject(&lt;/pre&gt;

&lt;pre class="csharpcode"&gt;                       DeploymentWellKnownProvider.AppHostConfig,&lt;/pre&gt;

&lt;pre class="csharpcode"&gt;                       &lt;span class="str"&gt;&amp;quot;Default Web Site&amp;quot;&lt;/span&gt;,&lt;/pre&gt;

&lt;pre class="csharpcode"&gt;                       sourceBaseOptions))
            {
                deploymentObject.SyncTo(destinationBaseOptions,syncOptions);
            }
        } &lt;/pre&gt;
&lt;style type="text/css"&gt;

.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;

&lt;pre class="csharpcode"&gt;&lt;strong&gt;&lt;font size="4"&gt;VI. Set ACLs on a directory for an application&lt;/font&gt;&lt;/strong&gt;&lt;/pre&gt;

&lt;p&gt;&lt;strong&gt;&lt;font size="4"&gt;&lt;/font&gt;&lt;/strong&gt;&amp;#160;&lt;/p&gt;

&lt;p&gt;&lt;font color="#400080"&gt;&lt;strong&gt;msdeploy –verb:sync –source:setacl –dest:setacl=”C:\inetpub\wwwroot2”,setAclUser=”user”,setAclAccess=”Read”,setAclResourceType=”Directory”&lt;/strong&gt;&lt;/font&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;font color="#400080"&gt;&lt;/font&gt;&lt;/strong&gt;&amp;#160;&lt;/p&gt;

&lt;pre class="csharpcode"&gt;        &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; Main(&lt;span class="kwrd"&gt;string&lt;/span&gt;[] args)
        {

            DeploymentBaseOptions destination = &lt;span class="kwrd"&gt;new&lt;/span&gt; DeploymentBaseOptions();
            DeploymentSyncOptions syncOptions = &lt;span class="kwrd"&gt;new&lt;/span&gt; DeploymentSyncOptions();

            destination.AddDefaultProviderSetting(&lt;span class="str"&gt;&amp;quot;setAcl&amp;quot;&lt;/span&gt;, &lt;span class="str"&gt;&amp;quot;setAclUser&amp;quot;&lt;/span&gt;, &lt;span class="str"&gt;&amp;quot;user&amp;quot;&lt;/span&gt;);
            destination.AddDefaultProviderSetting(&lt;span class="str"&gt;&amp;quot;setAcl&amp;quot;&lt;/span&gt;, &lt;span class="str"&gt;&amp;quot;setAclAccess&amp;quot;&lt;/span&gt;, &lt;span class="str"&gt;&amp;quot;Read&amp;quot;&lt;/span&gt;);
            destination.AddDefaultProviderSetting(&lt;span class="str"&gt;&amp;quot;setAcl&amp;quot;&lt;/span&gt;, &lt;span class="str"&gt;&amp;quot;setAclresourceType&amp;quot;&lt;/span&gt;, &lt;span class="str"&gt;&amp;quot;Directory&amp;quot;&lt;/span&gt;);

            &lt;span class="kwrd"&gt;using&lt;/span&gt; (DeploymentObject deploymentObject = DeploymentManager.CreateObject(&lt;span class="str"&gt;&amp;quot;setAcl&amp;quot;&lt;/span&gt;,&lt;span class="str"&gt;@&amp;quot;c:\inetpub\wwwroot2&amp;quot;&lt;/span&gt;))
            {
                deploymentObject.SyncTo(destination, syncOptions);
            }
        }&lt;/pre&gt;

&lt;pre class="csharpcode"&gt;&amp;#160;&lt;/pre&gt;

&lt;p&gt;&lt;strong&gt;More to come in the future.. &lt;/strong&gt;&lt;/p&gt;&lt;img src="http://blogs.iis.net/aggbug.aspx?PostID=3490355" width="1" height="1"&gt;</description></item><item><title>MSDeploy Powershell Scripts Part II – Exceptions And Remote Server Syncs</title><link>http://blogs.iis.net/jamescoo/archive/2009/10/24/msdeploy-powershell-scripts-part-ii-exceptions-and-remote-server-syncs.aspx</link><pubDate>Sat, 24 Oct 2009 22:30:00 GMT</pubDate><guid isPermaLink="false">50bcf3b4-f6fe-4638-adff-0c150e922e99:3475458</guid><dc:creator>Jamescoo</dc:creator><slash:comments>1</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.iis.net/jamescoo/rsscomments.aspx?PostID=3475458</wfw:commentRss><comments>http://blogs.iis.net/jamescoo/archive/2009/10/24/msdeploy-powershell-scripts-part-ii-exceptions-and-remote-server-syncs.aspx#comments</comments><description>&lt;p mce_keep="true"&gt;&amp;#160;&lt;/p&gt;  &lt;div align="left" mce_keep="true"&gt;   &lt;p&gt;In this blog I will show how to script syncing remote servers and add some useful exception handling.&amp;#160; This blog assumes you have read or are familiar with part I at:&lt;/p&gt;    &lt;p&gt;&lt;a title="http://blogs.iis.net/jamescoo/archive/2009/09/09/cool-msdeploy-powershell-scripts.aspx" href="http://blogs.iis.net/jamescoo/archive/2009/09/09/cool-msdeploy-powershell-scripts.aspx" mce_href="http://blogs.iis.net/jamescoo/archive/2009/09/09/cool-msdeploy-powershell-scripts.aspx"&gt;&lt;font color="#004000"&gt;http://blogs.iis.net/jamescoo/archive/2009/09/09/cool-msdeploy-powershell-scripts.aspx&lt;/font&gt;&lt;/a&gt;&lt;/p&gt;    &lt;p&gt;For MSDeploy API examples visit here:&lt;/p&gt;    &lt;p&gt;&lt;a title="http://blogs.iis.net/jamescoo/archive/2009/11/03/msdeploy-api-scenarios.aspx" href="http://blogs.iis.net/jamescoo/archive/2009/11/03/msdeploy-api-scenarios.aspx"&gt;http://blogs.iis.net/jamescoo/archive/2009/11/03/msdeploy-api-scenarios.aspx&lt;/a&gt;&lt;/p&gt;    &lt;p&gt;First a borrowed function that will help implement a try catch block in the script-let logic from part I.&amp;#160; This will allow for MSDeploy exceptions to be caught and reported making life a bit easier when you get an error.&amp;#160; The code is from:&lt;/p&gt;    &lt;p&gt;&lt;a title="http://weblogs.asp.net/adweigert/archive/2007/10/10/powershell-try-catch-finally-comes-to-life.aspx" href="http://weblogs.asp.net/adweigert/archive/2007/10/10/powershell-try-catch-finally-comes-to-life.aspx" mce_href="http://weblogs.asp.net/adweigert/archive/2007/10/10/powershell-try-catch-finally-comes-to-life.aspx"&gt;&lt;font color="#004000"&gt;http://weblogs.asp.net/adweigert/archive/2007/10/10/powershell-try-catch-finally-comes-to-life.aspx&lt;/font&gt;&lt;/a&gt;&lt;/p&gt;    &lt;p&gt;Simply paste this into the Powershell session ( or start all these functions in your profile ) and you are ready to use try catch blocks:&lt;/p&gt;    &lt;p&gt;&lt;font color="#0000ff" face="Courier New"&gt;function Try        &lt;br /&gt;{         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; param         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; (         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; [ScriptBlock]$Command = $(&lt;span class="kwrd"&gt;throw&lt;/span&gt; &lt;span class="str"&gt;&amp;quot;The parameter -Command is required.&amp;quot;&lt;/span&gt;),         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; [ScriptBlock]$Catch&amp;#160;&amp;#160; = { &lt;span class="kwrd"&gt;throw&lt;/span&gt; $_ },         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; [ScriptBlock]$Finally = {}         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; )         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;amp; {         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; $local:ErrorActionPreference = &lt;span class="str"&gt;&amp;quot;SilentlyContinue&amp;quot;&lt;/span&gt;         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; trap         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; trap         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;amp; {         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; trap { &lt;span class="kwrd"&gt;throw&lt;/span&gt; $_ }         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;amp;$Finally         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span class="kwrd"&gt;throw&lt;/span&gt; $_         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; $_ | &amp;amp; { &amp;amp;$Catch }         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;amp;$Command         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; }         &lt;br /&gt;        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;amp; {         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; trap { &lt;span class="kwrd"&gt;throw&lt;/span&gt; $_ }         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;amp;$Finally         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; }         &lt;br /&gt;}&lt;/font&gt;&lt;/p&gt;    &lt;p&gt;Visiting back to part I, the most versatile script-let was the Sync-Provider so next is to add exception handling to this script-let.&amp;#160; Of course, not to forget to load the assembly first (hopefully this is now part of your Powershell profile ). &lt;/p&gt;    &lt;pre class="csharpcode"&gt;&lt;font color="#0000ff"&gt;[System.Reflection.Assembly]::LoadWithPartialName(&lt;span class="str"&gt;&amp;quot;Microsoft.Web.Deployment&amp;quot;&lt;/span&gt;)
function Sync-Provider($provider, $sourceLocation, $destLocation) 
{ 
    $destBaseOptions   = &lt;span class="kwrd"&gt;new&lt;/span&gt;-&lt;span class="kwrd"&gt;object&lt;/span&gt; Microsoft.Web.Deployment.DeploymentBaseOptions 
    $syncOptions       = &lt;span class="kwrd"&gt;new&lt;/span&gt;-&lt;span class="kwrd"&gt;object&lt;/span&gt; Microsoft.Web.Deployment.DeploymentSyncOptions 
    Try
    {
      $deploymentObject = [Microsoft.Web.Deployment.DeploymentManager]::CreateObject($provider, $sourceLocation) 
      $deploymentObject.SyncTo($provider,$destLocation,$destBaseOptions,$syncOptions)
    }
    Catch
    {
      echo &lt;span class="str"&gt;&amp;quot;EXCEPTION THROWN::[ $_ ] &amp;quot;&lt;/span&gt;
      #&lt;span class="kwrd"&gt;throw&lt;/span&gt; $_
    }
} &lt;/font&gt;&lt;/pre&gt;

  &lt;p mce_keep="true"&gt;&amp;#160;&lt;/p&gt;

  &lt;p&gt;Now that you have better exception handling you can get messages like this ( in this case you cannot sync a site to a directory with apphostconfig provider ):&lt;/p&gt;

  &lt;p&gt;&amp;gt;&amp;#160; &lt;strong&gt;&lt;em&gt;Sync-Provider apphostconfig &amp;quot;Default Web Site&amp;quot; c:\mysite 
        &lt;br /&gt;&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;

  &lt;p&gt;EXCEPTION THROWN::[ Exception calling &amp;quot;SyncTo&amp;quot; with &amp;quot;4&amp;quot; argument(s): &amp;quot;Invalid site name 
    &lt;br /&gt;&amp;quot; ]&lt;/p&gt;

  &lt;p&gt;In order to perform remote server syncs, credentials will have to be included with the name of the machines that you want to sync.&amp;#160; To do this I decided to go with the below functions to help store remote machine information.&amp;#160; ‘Create-Server’ will make a new file that will be saved on the local system drive ( feel free to change where you are storing these but you must also change Sync-Server respectively ) with the same name as the computer name being stored.&amp;#160; The credentials will be saved and the password will be converted to a secure and then encrypted into the same file.&lt;/p&gt;

  &lt;p&gt;#load and run this function for each server you would like to perform a remote sync operation on&lt;/p&gt;

  &lt;p&gt;&lt;font color="#0000ff" face="Courier New"&gt;function Create-Server() 
      &lt;br /&gt;{ 

      &lt;br /&gt;&amp;#160; Try 

      &lt;br /&gt;&amp;#160; { 

      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; $machine = &lt;span class="str"&gt;&amp;quot;&amp;quot;&lt;/span&gt; | select ComputerName,UserName,Password 

      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; $machine.ComputerName = Read-host -prompt &lt;span class="str"&gt;&amp;quot;Machine name&amp;quot;&lt;/span&gt; 

      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; $fileName = $machine.ComputerName 

      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; $machine.UserName&amp;#160;&amp;#160;&amp;#160; = Read-host -prompt &lt;span class="str"&gt;&amp;quot;User name&amp;quot;&lt;/span&gt; 

      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; $machine.Password = Read-host -prompt Password -assecurestring | convertfrom-securestring 

      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; $machine | Export-Csv $Env:SystemDrive\$fileName.txt 

      &lt;br /&gt;&amp;#160; } Catch { 

      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; echo &lt;span class="str"&gt;&amp;quot;EXCEPTION THROWN::[ $_ ] &amp;quot;&lt;/span&gt; 

      &lt;br /&gt;&amp;#160; }&amp;#160;&amp;#160; &lt;br /&gt;}&amp;#160;&amp;#160; &lt;br /&gt;&lt;/font&gt;&lt;/p&gt;

  &lt;p mce_keep="true"&gt;&amp;#160;&lt;/p&gt;

  &lt;p mce_keep="true"&gt;&amp;#160;&lt;/p&gt;

  &lt;p mce_keep="true"&gt;&amp;#160;&lt;/p&gt;

  &lt;p&gt;The next function will help us later when converting the secure string to plain text, this snippet is from a forum reply at:&lt;/p&gt;

  &lt;p&gt;&lt;a title="http://www.vistax64.com/powershell/159190-read-host-assecurestring-problem.html" href="http://www.vistax64.com/powershell/159190-read-host-assecurestring-problem.html" mce_href="http://www.vistax64.com/powershell/159190-read-host-assecurestring-problem.html"&gt;&lt;font color="#004000"&gt;http://www.vistax64.com/powershell/159190-read-host-assecurestring-problem.html&lt;/font&gt;&lt;/a&gt;&lt;/p&gt;

  &lt;p&gt;&lt;font color="#0000ff" face="Courier New"&gt;Function ConvertTo-PlainText( [&lt;/font&gt;&lt;a href="http://www.vistax64.com/#" mce_href="http://www.vistax64.com/#"&gt;&lt;font color="#0000ff" face="Courier New"&gt;security&lt;/font&gt;&lt;/a&gt;&lt;font color="#0000ff" face="Courier New"&gt;.securestring]$secure )&lt;/font&gt;&lt;/p&gt;

  &lt;p&gt;&lt;font color="#0000ff" face="Courier New"&gt;{ 
      &lt;br /&gt;&amp;#160;&amp;#160; $marshal = [Runtime.InteropServices.Marshal] 

      &lt;br /&gt;&amp;#160;&amp;#160; $marshal::PtrToStringAuto( $marshal::SecureStringToBSTR($&lt;/font&gt;&lt;a href="http://www.vistax64.com/#" mce_href="http://www.vistax64.com/#"&gt;&lt;font color="#0000ff" face="Courier New"&gt;secure&lt;/font&gt;&lt;/a&gt;&lt;font color="#0000ff" face="Courier New"&gt;) ) 
      &lt;br /&gt;}&lt;/font&gt;&lt;/p&gt;

  &lt;p&gt;The next function Sync-Server will take a provider as a string, then the name of two machines that you want to sync.&amp;#160; It will then match the names of the machines to corresponding files on the local box and import the original objects that are exported in “Create-Server”, then convert the encrypted password so it can be used by msdeploy.&amp;#160; Examples of usage are farther down:&lt;/p&gt;

  &lt;p&gt;&lt;font color="#0000ff" face="Courier New"&gt;function Sync-Server($provider, $source, $dest) 
      &lt;br /&gt;{ 

      &lt;br /&gt;&amp;#160; Try 

      &lt;br /&gt;&amp;#160; { 

      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; #read from files 

      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; $sourceMachine = Import-Csv $Env:SystemDrive\$source.txt 

      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; $destMachine = Import-Csv $Env:SystemDrive\$dest.txt 

      &lt;br /&gt;&amp;#160; } 

      &lt;br /&gt;&amp;#160; Catch 

      &lt;br /&gt;&amp;#160; { 

      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; echo &amp;quot;EXCEPTION THROWN::[ $_&amp;#160; ] &amp;quot; 

      &lt;br /&gt;&amp;#160; } 

      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; $destBaseOptions&amp;#160;&amp;#160; = new-object Microsoft.Web.Deployment.DeploymentBaseOptions 

      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; $sourceBaseOptions&amp;#160;&amp;#160; = new-object Microsoft.Web.Deployment.DeploymentBaseOptions 

      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; $syncOptions = new-object Microsoft.Web.Deployment.DeploymentSyncOptions &lt;/font&gt;&lt;/p&gt;

  &lt;p&gt;&lt;font color="#0000ff" face="Courier New"&gt;&amp;#160;&amp;#160;&amp;#160; #fill in remoting information for source machine 
      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; $sourceBaseOptions.ComputerName = $sourceMachine.ComputerName 

      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; $sourceBaseOptions.UserName = $sourceMachine.UserName; 

      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; $password = ConvertTo-SecureString $sourceMachine.Password 

      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; $password = ConvertTo-PlainText $password 

      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; $sourceBaseOptions.Password = $password &lt;/font&gt;&lt;/p&gt;

  &lt;p&gt;&lt;font color="#0000ff" face="Courier New"&gt;&amp;#160;&amp;#160;&amp;#160; #fill in remoting information for destination machine 
      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; $destBaseOptions.ComputerName = $destMachine.ComputerName 

      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; $destBaseOptions.UserName = $destMachine.UserName; 

      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; $password = ConvertTo-SecureString $destMachine.Password 

      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; $password = ConvertTo-PlainText $password 

      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; $destBaseOptions.Password = $password &lt;/font&gt;&lt;/p&gt;

  &lt;p&gt;&lt;font color="#0000ff" face="Courier New"&gt;&amp;#160; Try 
      &lt;br /&gt;&amp;#160; { 

      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; $providerOptions = new-object Microsoft.Web.Deployment.DeploymentProviderOptions($provider) 

      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; $deploymentObject = [Microsoft.Web.Deployment.DeploymentManager]::CreateObject($providerOptions, $sourceBaseOptions) 

      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; $deploymentObject.SyncTo($destBaseOptions,$syncOptions) 

      &lt;br /&gt;&amp;#160; } 

      &lt;br /&gt;&amp;#160; Catch 

      &lt;br /&gt;&amp;#160; { 

      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; echo &amp;quot;EXCEPTION THROWN::[ $_&amp;#160; ] &amp;quot; 

      &lt;br /&gt;&amp;#160; } 

      &lt;br /&gt;} &lt;/font&gt;&lt;/p&gt;
&lt;/div&gt;

&lt;p&gt;Assuming you have all of the above code snippets now loaded into a Powershell session here is an example of the use of these methods to accomplish a server sync:&lt;/p&gt;

&lt;p&gt;PS &amp;gt; &lt;strong&gt;&lt;em&gt;Create-Server 
      &lt;br /&gt;&lt;/em&gt;&lt;/strong&gt;Machine name: &amp;lt;machineName1&amp;gt; 

  &lt;br /&gt;User name: &amp;lt;userName&amp;gt; 

  &lt;br /&gt;Password: ******** 

  &lt;br /&gt;PS &amp;gt; &lt;strong&gt;&lt;em&gt;Create-Server 
      &lt;br /&gt;&lt;/em&gt;&lt;/strong&gt;Machine name: &amp;lt;machineName2&amp;gt; 

  &lt;br /&gt;User name: &amp;lt;userName&amp;gt; 

  &lt;br /&gt;Password: ********&lt;/p&gt;

&lt;p&gt;PS &amp;gt; &lt;strong&gt;&lt;em&gt;Sync-Server metakey &amp;lt;machineName1&amp;gt; &amp;lt;machineName2&amp;gt;&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Errors&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; : 0 
  &lt;br /&gt;Warnings&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; : 0 

  &lt;br /&gt;BytesCopied&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; : 0 

  &lt;br /&gt;ObjectsDeleted&amp;#160;&amp;#160; : 0 

  &lt;br /&gt;ObjectsUpdated&amp;#160;&amp;#160; : 0 

  &lt;br /&gt;ObjectsAdded&amp;#160;&amp;#160;&amp;#160;&amp;#160; : 0 

  &lt;br /&gt;TotalChanges&amp;#160;&amp;#160;&amp;#160;&amp;#160; : 0 

  &lt;br /&gt;ParameterChanges : 0&lt;/p&gt;

&lt;p&gt;Sometimes it takes a little while for the sync to occur, and in the above example I had installed MSDeploy and started the service on my remote machines.&amp;#160; Also, you can modify the $sourceBaseOptions and $destBaseOptions by changing the “TempAgent” property to true.&amp;#160; This can help you run remotely when you have not installed MSDeploy on your source or destination.&amp;#160; TempAgent is very useful for this type of syncing.&amp;#160; &lt;/p&gt;

&lt;p&gt;Another note is that if you want to take this one step farther, you can make a couple of changes and sync a provider path across both machines, I will just paste the new function farther down and you can use it like this:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;Sync-ServerPath apphostconfig “Default Web Site” &amp;lt;machine1&amp;gt; &amp;lt;machine2&amp;gt;&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;font color="#0000ff" face="Courier New"&gt;function Sync-ServerPath($provider,$path, $source, $dest) 
    &lt;br /&gt;{ 

    &lt;br /&gt;&amp;#160; Try 

    &lt;br /&gt;&amp;#160; { 

    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; #read from files 

    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; $sourceMachine = Import-Csv $Env:SystemDrive\$source.txt 

    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; $destMachine = Import-Csv $Env:SystemDrive\$dest.txt 

    &lt;br /&gt;&amp;#160; } 

    &lt;br /&gt;&amp;#160; Catch 

    &lt;br /&gt;&amp;#160; { 

    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; echo &amp;quot;EXCEPTION THROWN::[ $_&amp;#160; ] &amp;quot; 

    &lt;br /&gt;&amp;#160; } 

    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; $destBaseOptions&amp;#160;&amp;#160; = new-object Microsoft.Web.Deployment.DeploymentBaseOptions 

    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; $sourceBaseOptions&amp;#160;&amp;#160; = new-object Microsoft.Web.Deployment.DeploymentBaseOptions 

    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; $syncOptions = new-object Microsoft.Web.Deployment.DeploymentSyncOptions &lt;/font&gt;&lt;/p&gt;

&lt;p&gt;&lt;font color="#0000ff" face="Courier New"&gt;&amp;#160;&amp;#160;&amp;#160; #fill in remoting information for source machine 
    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; $sourceBaseOptions.ComputerName = $sourceMachine.ComputerName 

    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; $sourceBaseOptions.UserName = $sourceMachine.UserName; 

    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; $password = ConvertTo-SecureString $sourceMachine.Password 

    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; $password = ConvertTo-PlainText $password 

    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; $sourceBaseOptions.Password = $password &lt;/font&gt;&lt;/p&gt;

&lt;p&gt;&lt;font color="#0000ff" face="Courier New"&gt;&amp;#160;&amp;#160;&amp;#160; #fill in remoting information for destination machine 
    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; $destBaseOptions.ComputerName = $destMachine.ComputerName 

    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; $destBaseOptions.UserName = $destMachine.UserName; 

    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; $password = ConvertTo-SecureString $destMachine.Password 

    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; $password = ConvertTo-PlainText $password 

    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; $destBaseOptions.Password = $password &lt;/font&gt;&lt;/p&gt;

&lt;p&gt;&lt;font color="#0000ff" face="Courier New"&gt;&amp;#160; Try 
    &lt;br /&gt;&amp;#160; { 

    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; $deploymentObject = [Microsoft.Web.Deployment.DeploymentManager]::CreateObject($provider,$path, $sourceBaseOptions) 

    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; $deploymentObject.SyncTo($provider,$path,$destBaseOptions,$syncOptions) 

    &lt;br /&gt;&amp;#160; } 

    &lt;br /&gt;&amp;#160; Catch 

    &lt;br /&gt;&amp;#160; { 

    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; echo &amp;quot;EXCEPTION THROWN::[ $_&amp;#160; ] &amp;quot; 

    &lt;br /&gt;&amp;#160; } 

    &lt;br /&gt;} &lt;/font&gt;&lt;/p&gt;

&lt;p&gt;Thanks for reading and hope this is useful.&amp;#160; Please leave replies for any request / corrections or comments.&amp;#160; In part III, I will try to go into things like using Credentials Manager, dumps or other verbs like getdependencies or getsysteminfo.&lt;/p&gt;&lt;img src="http://blogs.iis.net/aggbug.aspx?PostID=3475458" width="1" height="1"&gt;</description></item><item><title>MSDeploy Powershell Scripts Part I – Local Functions Only</title><link>http://blogs.iis.net/jamescoo/archive/2009/09/09/cool-msdeploy-powershell-scripts.aspx</link><pubDate>Wed, 09 Sep 2009 21:54:00 GMT</pubDate><guid isPermaLink="false">50bcf3b4-f6fe-4638-adff-0c150e922e99:3396448</guid><dc:creator>Jamescoo</dc:creator><slash:comments>1</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.iis.net/jamescoo/rsscomments.aspx?PostID=3396448</wfw:commentRss><comments>http://blogs.iis.net/jamescoo/archive/2009/09/09/cool-msdeploy-powershell-scripts.aspx#comments</comments><description>&lt;p mce_keep="true"&gt;Part II now posted -&lt;font color="#004000"&gt; &lt;/font&gt;&lt;a title="http://blogs.iis.net/jamescoo/archive/2009/10/24/msdeploy-powershell-scripts-part-ii-exceptions-and-remote-server-syncs.aspx" href="http://blogs.iis.net/jamescoo/archive/2009/10/24/msdeploy-powershell-scripts-part-ii-exceptions-and-remote-server-syncs.aspx"&gt;&lt;font color="#004000"&gt;http://blogs.iis.net/jamescoo/archive/2009/10/24/msdeploy-powershell-scripts-part-ii-exceptions-and-remote-server-syncs.aspx&lt;/font&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p mce_keep="true"&gt;For MSDeploy API examples visit: &lt;a title="http://blogs.iis.net/jamescoo/archive/2009/11/03/msdeploy-api-scenarios.aspx" href="http://blogs.iis.net/jamescoo/archive/2009/11/03/msdeploy-api-scenarios.aspx"&gt;http://blogs.iis.net/jamescoo/archive/2009/11/03/msdeploy-api-scenarios.aspx&lt;/a&gt;&lt;/p&gt;  &lt;p mce_keep="true"&gt;In this blog I would like to show how to create MSDeploy Powershell scripts that you can customize and export to your Powershell console.&lt;/p&gt;  &lt;p mce_keep="true"&gt;There is a new API coming out with MSDeploy that will allow a lot of new programmatic functionality around syncing and gathering information about the content and settings of web servers.&amp;#160; Now that it is finalized and the Powershell support in RTM V1 has been officially removed for this release I wanted to pursue some simple light weight script-lets that would allow folks who want some kind of Powershell option to get something to work for them.&amp;#160; This also gives some introduction to the API of MSDeploy in C#.&lt;/p&gt;  &lt;p mce_keep="true"&gt;To give a high level view, whenever you want to sync content from one location to another you will generally have to create a DeploymentObject with source information and call the SyncTo method which will actually synchronize the content as if you were calling these from command-line MSDeploy.&amp;#160; These objects live inside the ‘Microsoft.Web.Deployment’ assembly which is installed with MSDeploy.&amp;#160; The source and destination will also have to define their DeploymentBaseOptions which are basically switches that can represent things like including ACLS of a source during a sync or using temp agent.&amp;#160; The DeploymentSyncOptions can help apply rules such as skip and replace during a sync.&amp;#160; &lt;/p&gt;  &lt;p mce_keep="true"&gt;The examples below do not start with any support for remote cases as I wanted to start with very light weight examples.&amp;#160; I chose Powershell for another reason which is that it is very simple to experiment; not requiring rebuilds when you want to try out some customizations.&lt;/p&gt;  &lt;p mce_keep="true"&gt;Step 1 – Get some representative C# API code that will sync two locations ( must add Microsoft.Web.Deployment as a reference in the MSDeploy install directory ):&lt;/p&gt;  &lt;div class="csharpcode"&gt;//need using Microsoft.Web.Deployment;&lt;/div&gt;  &lt;div class="csharpcode"&gt;&amp;#160;&lt;/div&gt;  &lt;div class="csharpcode"&gt;   &lt;pre class="alt"&gt;DeploymentBaseOptions _sourceBaseOptions = &lt;span class="kwrd"&gt;new&lt;/span&gt; DeploymentBaseOptions(); &lt;/pre&gt;

  &lt;pre&gt;DeploymentBaseOptions _destinationBaseOptions = &lt;span class="kwrd"&gt;new&lt;/span&gt; DeploymentBaseOptions(); &lt;/pre&gt;

  &lt;pre class="alt"&gt;DeploymentSyncOptions _syncOptions = &lt;span class="kwrd"&gt;new&lt;/span&gt; DeploymentSyncOptions();&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="rem"&gt;// double quotes don’t copy and paste well so you might have to redo them&lt;/span&gt;&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; (DeploymentObject deploymentObject = DeploymentManager.CreateObject(“contentPath”, &lt;span class="str"&gt;@&amp;quot;c:\inetpub\wwwroot&amp;quot;&lt;/span&gt;)) &lt;/pre&gt;

  &lt;pre&gt;{&lt;/pre&gt;

  &lt;pre class="alt"&gt;    deploymentObject.SyncTo( “contentPath”, &lt;span class="str"&gt;&amp;quot;c:\temp1&amp;quot;&lt;/span&gt;, _destinationBaseOptions,_syncOptions); &lt;/pre&gt;

  &lt;pre&gt;}&lt;/pre&gt;

  &lt;pre class="alt"&gt;&amp;#160;&lt;/pre&gt;
&lt;/div&gt;
&lt;style type="text/css"&gt;





.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;

&lt;p mce_keep="true"&gt;&amp;#160;&lt;/p&gt;
&lt;font size="2"&gt;
  &lt;p&gt;Step 2 – Translate the C# code into an equivalent Powershell script:&lt;/p&gt;

  &lt;p mce_keep="true"&gt;&amp;#160;&lt;/p&gt;
  &lt;font size="2"&gt;In the above example, it looks simple enough to sync using contentPath provider so I will break it down into steps which follow line by line of the above example.&lt;/font&gt;&lt;/font&gt; 

&lt;p&gt;&lt;font size="2"&gt;&lt;strong&gt;1. Make sure the assembly is loaded into the Powershell session&lt;/strong&gt;&lt;/font&gt;&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;&lt;font size="2"&gt;[System.Reflection.Assembly]::LoadWithPartialName(&amp;quot;Microsoft.Web.Deployment&amp;quot;)&lt;/font&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;font size="2"&gt;&lt;strong&gt;2. Create the simple objects needed as parameters.&amp;#160; I hope to elaborate on these objects in future blogs.&lt;/strong&gt;&lt;/font&gt;&lt;/p&gt;
&lt;font size="2"&gt;
  &lt;blockquote&gt;
    &lt;p&gt;$sourceBaseOptions = new-object Microsoft.Web.Deployment.DeploymentBaseOptions 
      &lt;br /&gt;$destBaseOptions&amp;#160;&amp;#160; = new-object Microsoft.Web.Deployment.DeploymentBaseOptions 

      &lt;br /&gt;$syncOptions&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; = new-object Microsoft.Web.Deployment.DeploymentSyncOptions&lt;/p&gt;
  &lt;/blockquote&gt;

  &lt;p&gt;&lt;strong&gt;3. Call CreateObject to create the deployment object from the DeploymentManager.&lt;/strong&gt;&lt;/p&gt;

  &lt;blockquote&gt;
    &lt;p&gt;Below there is an assumption that the CreateObject function will take two parameters: $sourceContent and $destinationContent.&amp;#160; However, there are several overloads for CreateObject.&amp;#160; &lt;/p&gt;
    &lt;font size="2"&gt;It turns out that DeploymentObject does not have an appropriate constructor to simply create a new object which makes sense because in the code above DeploymentManager is used to create an object of type DeploymentObject.&amp;#160; The DeploymentManager is actually a static class that you can use to call CreateObject as in the example below.&amp;#160; Just remove new-object and directly call CreateObject with the correct parameters: provider and $sourceDirectory ( both strings ).&lt;/font&gt;&lt;/blockquote&gt;

  &lt;blockquote&gt;
    &lt;p mce_keep="true"&gt;$deploymentObject = [Microsoft.Web.Deployment.DeploymentManager]::CreateObject(“contentPath”,$sourceDirectory)&lt;/p&gt;
  &lt;/blockquote&gt;

  &lt;p mce_keep="true"&gt;&lt;strong&gt;4. Define the destination information.&lt;/strong&gt;&lt;/p&gt;

  &lt;blockquote&gt;
    &lt;p mce_keep="true"&gt;This is a lot similar to setting up the source data with the exception that you have to call SyncTo and pass a couple of extra parameters ( these extra parameters won’t have any configuration for this example ).&lt;/p&gt;

    &lt;p mce_keep="true"&gt;$deploymentObject.SyncTo(&amp;quot;contentPath&amp;quot;,$destinationDirectory,$destBaseOptions,$syncOptions);&lt;/p&gt;
  &lt;/blockquote&gt;

  &lt;p mce_keep="true"&gt;With all of this complete there is only the task of putting it together in a nice little function and pasting into a Powershell window or adding it to a ps1 script upon Powershell session start.&amp;#160; The completed code is below.&amp;#160; And of course you must have MSDeploy installed so the assembly is available.&lt;/p&gt;

  &lt;p&gt;&lt;font color="#0000ff"&gt;&lt;/font&gt;&lt;/p&gt;

  &lt;p&gt;&lt;font color="#0000ff"&gt;function Sync-Content($sourceContent,$destinationContent) 
      &lt;br /&gt;{ 

      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; [System.Reflection.Assembly]::LoadWithPartialName(&amp;quot;Microsoft.Web.Deployment&amp;quot;) 

      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; $destBaseOptions&amp;#160;&amp;#160; = new-object Microsoft.Web.Deployment.DeploymentBaseOptions 

      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; $syncOptions&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; = new-object Microsoft.Web.Deployment.DeploymentSyncOptions 

      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; $deploymentObject = [Microsoft.Web.Deployment.DeploymentManager]::CreateObject(“contentPath”,$sourceContent) 

      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; $deploymentObject.SyncTo(&amp;quot;contentPath&amp;quot;,$destinationContent,$destBaseOptions,$syncOptions); 

      &lt;br /&gt;}&lt;/font&gt; &lt;/p&gt;

  &lt;p mce_keep="true"&gt;&amp;#160;&lt;/p&gt;

  &lt;p mce_keep="true"&gt;There is the first script-let and a powerful one!&amp;#160; ContentPath is a very useful provider that can sync by the name of a site or a directory location and can sync to remote UNCs that you have access.&amp;#160; It can also sync from a directory to a site or from a site to a directory, but it does not create new sites while it will create new directories.&lt;/p&gt;

  &lt;p mce_keep="true"&gt;&amp;#160;&lt;/p&gt;

  &lt;p mce_keep="true"&gt;This first script-let is a good template for a few more, by plugging in “apphostconfig” or “metakey” in place of “contentPath” and changing the script name ( maybe parameters for clarity ) you get easy to reuse code.&amp;#160; I will remove the LoadWithPartialName line since it will be assumed this is loaded before hand ( a one time call per session ).&lt;/p&gt;

  &lt;p mce_keep="true"&gt;&amp;#160;&lt;/p&gt;

  &lt;p&gt;&lt;font color="#0000ff"&gt;function Sync-Site7to7($sourceSite,$destSite) 
      &lt;br /&gt;{ 

      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; $destBaseOptions&amp;#160;&amp;#160; = new-object Microsoft.Web.Deployment.DeploymentBaseOptions 

      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; $syncOptions&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; = new-object Microsoft.Web.Deployment.DeploymentSyncOptions 

      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; $deploymentObject = [Microsoft.Web.Deployment.DeploymentManager]::CreateObject(“apphostConfig”,$sourceSite) 

      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; $deploymentObject.SyncTo(&amp;quot;apphostConfig&amp;quot;,$destSite,$destBaseOptions,$syncOptions); 

      &lt;br /&gt;}&lt;/font&gt; &lt;/p&gt;

  &lt;p mce_keep="true"&gt;&lt;font color="#0000ff"&gt;&lt;/font&gt;&lt;/p&gt;

  &lt;p&gt;&lt;font color="#0000ff"&gt;function Sync-Site6to6($sourceMetakey,$destMetakey) 
      &lt;br /&gt;{ 

      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; $destBaseOptions&amp;#160;&amp;#160; = new-object Microsoft.Web.Deployment.DeploymentBaseOptions 

      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; $syncOptions&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; = new-object Microsoft.Web.Deployment.DeploymentSyncOptions 

      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; $deploymentObject = [Microsoft.Web.Deployment.DeploymentManager]::CreateObject(“metaKey”,$sourceMetakey) 

      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; $deploymentObject.SyncTo(&amp;quot;metaKey&amp;quot;,$destMetakey,$destBaseOptions,$syncOptions); 

      &lt;br /&gt;} &lt;/font&gt;&lt;/p&gt;

  &lt;p mce_keep="true"&gt;&lt;font color="#0000ff"&gt;function Sync-Site6to7($sourceMetakey,$destMetakey) 
      &lt;br /&gt;&lt;/font&gt;&lt;/p&gt;
  &lt;font color="#0000ff"&gt;{ 
    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; $destBaseOptions&amp;#160;&amp;#160; = new-object Microsoft.Web.Deployment.DeploymentBaseOptions 

    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; $syncOptions&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; = new-object Microsoft.Web.Deployment.DeploymentSyncOptions 

    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; $deploymentObject = [Microsoft.Web.Deployment.DeploymentManager]::CreateObject(“metaKey”,$sourceMetakey) 

    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; $deploymentObject.SyncTo(&amp;quot;metaKey”,$destMetakey,$destBaseOptions,$syncOptions); 

    &lt;br /&gt;} &lt;/font&gt;

  &lt;p mce_keep="true"&gt;&amp;#160;&lt;/p&gt;

  &lt;p mce_keep="true"&gt;Again very useful providers for server administrators and for these examples you have to fill in values for the path, but in the future when remote syncs are added no path will sync the whole server!&amp;#160; If you notice the pattern already, we can probably consolidate these above functions into one function that brings it all together if you want something a little more versatile.&amp;#160; Of course you pay the price of having to remember the order of three parameters but no problem now that we are getting use to it.&lt;/p&gt;

  &lt;p&gt;&lt;font color="#0000ff"&gt;&lt;/font&gt;&lt;/p&gt;

  &lt;p&gt;&lt;font color="#0000ff"&gt;&lt;/font&gt;&lt;/p&gt;

  &lt;p&gt;&lt;font color="#0000ff"&gt;function Sync-Provider($provider, $sourceLocation, $destLocation) 
      &lt;br /&gt;{ 

      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; $destBaseOptions&amp;#160;&amp;#160; = new-object Microsoft.Web.Deployment.DeploymentBaseOptions 

      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; $syncOptions&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; = new-object Microsoft.Web.Deployment.DeploymentSyncOptions 

      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; $deploymentObject = [Microsoft.Web.Deployment.DeploymentManager]::CreateObject($provider, $sourceLocation) 

      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; $deploymentObject.SyncTo($provider,$destLocation,$destBaseOptions,$syncOptions); 

      &lt;br /&gt;} &lt;/font&gt;&lt;/p&gt;

  &lt;p&gt;That is it for Part I.&amp;#160; In part II, it would be nice to explore adding remote functionality and coming up with some creative approaches to saving credentials for remote server syncs.&amp;#160; Also, I hope to cover some other MSDeploy operations like GetSystemInfo or GetDependencies.&amp;#160; Please let me know if there are request for certain functions as well.&lt;/p&gt;

  &lt;p&gt;&lt;font color="#0000ff"&gt;&lt;/font&gt;&lt;/p&gt;
&lt;/font&gt;&lt;img src="http://blogs.iis.net/aggbug.aspx?PostID=3396448" width="1" height="1"&gt;</description></item><item><title>isEmptyElementVisible And isPresent Metadata Introduction</title><link>http://blogs.iis.net/jamescoo/archive/2009/07/29/isemptyelementvisible.aspx</link><pubDate>Wed, 29 Jul 2009 18:24:00 GMT</pubDate><guid isPermaLink="false">50bcf3b4-f6fe-4638-adff-0c150e922e99:3321990</guid><dc:creator>Jamescoo</dc:creator><slash:comments>1</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.iis.net/jamescoo/rsscomments.aspx?PostID=3321990</wfw:commentRss><comments>http://blogs.iis.net/jamescoo/archive/2009/07/29/isemptyelementvisible.aspx#comments</comments><description>&lt;P mce_keep="true"&gt;One of the latest additions in IIS configuration is new set of metadata properties that are available&amp;nbsp;as a&amp;nbsp;hotfix&amp;nbsp;in IIS 7.0.&amp;nbsp; &lt;/P&gt;
&lt;P mce_keep="true"&gt;&lt;STRONG&gt;"IsEmptyElementVisible"&lt;/STRONG&gt; -&amp;nbsp; This property can be set to true or false and only applies to custom schema in which you have an attributeless element that is not part of a collection and is not defining a collection.&amp;nbsp; This metadata property allows a user to force configuration of this kind to be visible in applicationHost.config.&amp;nbsp; &lt;/P&gt;
&lt;P mce_keep="true"&gt;&lt;STRONG&gt;"isPresent"&lt;/STRONG&gt; -&amp;nbsp;This compliments the above metadata by providing a bool value which will inform&amp;nbsp;a user that&amp;nbsp;a particular configuration element as described above will&amp;nbsp;be physically present in the applicationHost.config file.&amp;nbsp;&lt;/P&gt;
&lt;P mce_keep="true"&gt;Below is some example schema&amp;nbsp;where 'myElement' is the particular element that I would like to use with these two metadata properties.&amp;nbsp;&lt;/P&gt;
&lt;P mce_keep="true"&gt;&amp;lt;configSchema&amp;gt;&lt;BR&gt;&amp;nbsp; &amp;lt;sectionSchema name="system.webServer/customSchema"&amp;gt;&lt;BR&gt;&lt;STRONG&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;element name="myElement"&amp;gt;&lt;/STRONG&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;attribute name="isTimed" type="bool" defaultValue="false" /&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;attribute name="isShort" type="bool" defaultValue="true" /&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;collection addElement="add" clearElement="clear" removeElement="remove"&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;attribute name="value" type="string" required="true" isUniqueKey="true" /&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/collection&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/element&amp;gt;&lt;BR&gt;&amp;nbsp; &amp;lt;/sectionSchema&amp;gt;&lt;BR&gt;&amp;lt;/configSchema&amp;gt;&lt;/P&gt;
&lt;P mce_keep="true"&gt;Given this&amp;nbsp;schema, the below code will help make use of these new metadata properties.&amp;nbsp; In this example, I am using C# wrapper code for the AHADMIN library.&lt;/P&gt;&lt;FONT size=2&gt;&lt;/FONT&gt;&lt;FONT color=#2b91af size=2&gt;&lt;FONT color=#2b91af size=2&gt;AppHostWritableAdminManager&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt; writableManager = &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;&lt;FONT color=#0000ff size=2&gt;new&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt; &lt;/FONT&gt;&lt;FONT color=#2b91af size=2&gt;&lt;FONT color=#2b91af size=2&gt;AppHostWritableAdminManager&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;();&lt;/FONT&gt;&lt;FONT size=2&gt; 
&lt;P&gt;&lt;/FONT&gt;&lt;FONT color=#2b91af size=2&gt;&lt;FONT color=#2b91af size=2&gt;IAppHostElement&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt; element = writableManager.GetAdminSection(&lt;/FONT&gt;&lt;FONT color=#a31515 size=2&gt;&lt;FONT color=#a31515 size=2&gt;"system.webServer/customSchema"&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;, &lt;/FONT&gt;&lt;FONT color=#a31515 size=2&gt;&lt;FONT color=#a31515 size=2&gt;"MACHINE/WEBROOT/APPHOST"&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;);&lt;/P&gt;&lt;/FONT&gt;&lt;FONT color=#2b91af size=2&gt;&lt;FONT color=#2b91af size=2&gt;IAppHostElement&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt; myElement = element.GetElementByName(&lt;/FONT&gt;&lt;FONT color=#a31515 size=2&gt;&lt;FONT color=#a31515 size=2&gt;"myElement"&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;);&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt; 
&lt;P&gt;myElement.SetMetadata(&lt;/FONT&gt;&lt;FONT color=#a31515 size=2&gt;&lt;FONT color=#a31515 size=2&gt;"isEmptyElementVisible"&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;, &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;&lt;FONT color=#0000ff size=2&gt;true&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;);&lt;/P&gt;writableManager.CommitPath = &lt;/FONT&gt;&lt;FONT color=#a31515 size=2&gt;&lt;FONT color=#a31515 size=2&gt;"MACHINE/WEBROOT/APPHOST"&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;;&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt; 
&lt;P&gt;writableManager.CommitChanges();&lt;/P&gt;
&lt;P&gt;// at this point 'myElement' should have been&amp;nbsp;made present in applicationHost.config, this can be checked with "isPresent" below&amp;nbsp;&lt;/P&gt;&lt;/FONT&gt;
&lt;P mce_keep="true"&gt;&lt;FONT color=#2b91af size=2&gt;&lt;FONT color=#2b91af size=2&gt;AppHostAdminManager&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt; readableManager = &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;&lt;FONT color=#0000ff size=2&gt;new&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt; &lt;/FONT&gt;&lt;FONT color=#2b91af size=2&gt;&lt;FONT color=#2b91af size=2&gt;AppHostAdminManager&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;();&lt;/FONT&gt;&lt;/P&gt;&lt;FONT color=#2b91af size=2&gt;&lt;FONT color=#2b91af size=2&gt;IAppHostElement&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt; element = readableManager.GetAdminSection(&lt;/FONT&gt;&lt;FONT color=#a31515 size=2&gt;&lt;FONT color=#a31515 size=2&gt;"system.webServer/customSchema"&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;,&lt;/FONT&gt;&lt;FONT color=#a31515 size=2&gt;&lt;FONT color=#a31515 size=2&gt;"MACHINE/WEBROOT/APPHOST"&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;);&lt;/FONT&gt;&lt;FONT size=2&gt; 
&lt;P&gt;&lt;/FONT&gt;&lt;FONT color=#2b91af size=2&gt;&lt;FONT color=#2b91af size=2&gt;IAppHostElement&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt; myElement = element.GetElementByName("myElement"&lt;/FONT&gt;&lt;FONT size=2&gt;);&lt;/P&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;&lt;FONT color=#0000ff size=2&gt;object&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt; metadata = myElement.GetMetadata(&lt;/FONT&gt;&lt;FONT color=#a31515 size=2&gt;&lt;FONT color=#a31515 size=2&gt;"isPresent"&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;);&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt; 
&lt;P&gt;&lt;/FONT&gt;&lt;FONT color=#2b91af size=2&gt;&lt;FONT color=#2b91af size=2&gt;Console&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;.WriteLine(metadata.ToString().ToLower());&lt;/FONT&gt;&lt;/P&gt;
&lt;P mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;FONT size=2&gt;If this solves a&amp;nbsp;problem&amp;nbsp;for you, more information can be&amp;nbsp;found&amp;nbsp;about this hotfix as well as how to download it below.&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;A href="http://support.microsoft.com/kb/970773" mce_href="http://support.microsoft.com/kb/970773"&gt;http://support.microsoft.com/kb/970773&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT size=2&gt;&lt;/FONT&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;FONT size=2&gt;&amp;nbsp;&lt;/P&gt;&lt;/FONT&gt;&lt;img src="http://blogs.iis.net/aggbug.aspx?PostID=3321990" width="1" height="1"&gt;</description><category domain="http://blogs.iis.net/jamescoo/archive/tags/Hotfix/default.aspx">Hotfix</category><category domain="http://blogs.iis.net/jamescoo/archive/tags/Metadata/default.aspx">Metadata</category><category domain="http://blogs.iis.net/jamescoo/archive/tags/isEmptyElementVisible/default.aspx">isEmptyElementVisible</category><category domain="http://blogs.iis.net/jamescoo/archive/tags/isPresent/default.aspx">isPresent</category></item><item><title>Using MSDeploy In Powershell for Beta</title><link>http://blogs.iis.net/jamescoo/archive/2008/08/21/using-msdeploy-in-powershell.aspx</link><pubDate>Thu, 21 Aug 2008 00:21:00 GMT</pubDate><guid isPermaLink="false">50bcf3b4-f6fe-4638-adff-0c150e922e99:2570454</guid><dc:creator>Jamescoo</dc:creator><slash:comments>7</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.iis.net/jamescoo/rsscomments.aspx?PostID=2570454</wfw:commentRss><comments>http://blogs.iis.net/jamescoo/archive/2008/08/21/using-msdeploy-in-powershell.aspx#comments</comments><description>&lt;P&gt;Hello, my names is James and for my first blog I would like to answer some of the common questions I have seen when using MSDeploy in Powershell for the first time.&amp;nbsp; Also, I will try to introduce some tricks to help gather information about your server using the MSDeploy Powershell environment.&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Q. What is the name of the Powershell snap-in, how do I see if it installed ?&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;A.&amp;nbsp; &lt;/STRONG&gt;The name of the snap-in is "MSDeploysnapin".&amp;nbsp; At the PS command prompt you can use the &lt;EM&gt;Get-pssnapin -registered &lt;/EM&gt;cmdlet to verify the snap-in is installed.&amp;nbsp; You can use &lt;EM&gt;add-pssnapin MSDeploysnapin&lt;/EM&gt; at the PS command prompt to include the snap-in.&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Q. MSDeploy installed on the machine and then I installed Powershell, but I don't see the snap-in as being installed?&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;A.&amp;nbsp; &lt;/STRONG&gt;You have to install MS Deploy after you have installed Powershell on your server, the snap-in cannot be installed into the registry properly until Powershell is installed so it has to be done in this order.&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Q.&amp;nbsp; What cmdlets are available in the MSDeploysnapin?&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;A.&amp;nbsp; &lt;/STRONG&gt;The cmdlets have been finalized to &lt;EM&gt;Get-deploymentObject&lt;/EM&gt; and &lt;EM&gt;Update-deploymentObject&lt;/EM&gt;.&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Q.&amp;nbsp; Are there any shortcuts I can use when typing cmdlets?&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;A.&amp;nbsp; &lt;/STRONG&gt;If you use &lt;EM&gt;Get-help Get-deploymentObject&lt;/EM&gt; &lt;EM&gt;-full&lt;/EM&gt; or &lt;EM&gt;Get-help Update-deploymentObject -full&lt;/EM&gt; you can see that the certain parameters have assigned default positions.&amp;nbsp; This allows shortcuts for the following two scenarios.&lt;/P&gt;
&lt;P&gt;&lt;EM&gt;Get-deploymentObject -provider apphostconfig -path "Default Web Site"&lt;/EM&gt;&lt;/P&gt;
&lt;P&gt;to&lt;/P&gt;
&lt;P&gt;&lt;EM&gt;Get-deploymentObject apphostconfig "Default Web Site"&lt;/EM&gt;&lt;/P&gt;
&lt;P&gt;&lt;EM&gt;And&lt;/EM&gt;&lt;/P&gt;
&lt;P&gt;&lt;EM&gt;(** The following has been updated as of 3/4/09)&amp;nbsp;&lt;/EM&gt;&lt;/P&gt;
&lt;P&gt;&lt;EM&gt;Update-deploymentObject&amp;nbsp;$source &amp;lt;destinationProvider&amp;gt; &amp;lt;destinationPath&amp;gt;&lt;/EM&gt;&lt;/P&gt;
&lt;P&gt;&lt;EM&gt;&lt;/EM&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Q.&amp;nbsp; I want to perform an Update but it isn't working, what's wrong?&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;&lt;EM&gt;(** The following has been updated as of 3/4/09)&lt;/EM&gt;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;A.&lt;/STRONG&gt;&amp;nbsp; A common mistake here is to use dashes before the $source and $dest variables since this is how MSDeploy works on command-line.&lt;/P&gt;
&lt;P&gt;&lt;EM&gt;Update-deploymentObject -$source&amp;nbsp;&amp;lt;destinationProvider&amp;gt; &amp;lt;destinationPath&amp;gt;&amp;nbsp; &lt;/EM&gt;( incorrect use )&lt;/P&gt;
&lt;P&gt;You can remove these dashes as they are incorrect syntax.&lt;/P&gt;
&lt;P&gt;&lt;EM&gt;Update-deploymentObject&amp;nbsp;$source &amp;lt;destinationProvider&amp;gt; &amp;lt;destinationPath&amp;gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/EM&gt;( correct use )&lt;/P&gt;
&lt;P&gt;Another technique to troubleshoot these situations is to check your $source data first for validity and then perform the update again ( this can be done just by removing the &lt;EM&gt;$source =&lt;/EM&gt;&amp;nbsp; and verifying an object is returned first ) .&amp;nbsp; In some scenarios checking the $dest object will only show an invalid object since it is null initially but MSDeploy allows this since it is necessary for updates.&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Q.&amp;nbsp; Do I need to use the -migrate switch when migrating my server from IIS6 to IIS7?&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;A.&amp;nbsp; &lt;/STRONG&gt;Short answer is no, you do not.&amp;nbsp; The migrate switch adds some additional rules that may be useful in a migration but it is not required.&amp;nbsp; Unlike the command line tool, you do not need to distinguish between migrations and sync when using Update-deploymentObject.&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Q.&amp;nbsp; Do I need to install Powershell on every web server to use cmdlets on multiple servers remotely ?&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;A.&amp;nbsp; &lt;/STRONG&gt;You only need to have the MS Deploy agent service called "msdepsvc" started on all other web servers.&amp;nbsp; Powershell and the MSDeploysnapin need only be installed on the operator machine.&amp;nbsp; &lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Q.&amp;nbsp; How can I get dependencies of my web server in a Powershell session ?&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;A.&amp;nbsp; &lt;/STRONG&gt;A quick one-line for this would be:&lt;/P&gt;
&lt;P&gt;&lt;EM&gt;( Get-deploymentObject apphostconfig ).Invoke("GetDependencies").Dependencies&lt;/EM&gt;&lt;/P&gt;
&lt;P&gt;Replace apphostconfig provider with webserver60 provider as needed for IIS6 servers.&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Q.&amp;nbsp; How can I get general system information about my web server ?&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;A.&amp;nbsp; &lt;/STRONG&gt;Another one-line for this would be: &lt;/P&gt;
&lt;P&gt;&lt;EM&gt;( Get-DeploymentObject apphostconfig ).Invoke("GetSystemInfo").OuterXml&lt;/EM&gt;&lt;/P&gt;
&lt;P&gt;Replace apphostconfig provider with webserver60 provider as needed for IIS6 servers.&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Q.&lt;/STRONG&gt;&lt;EM&gt;&lt;B&gt; &lt;/B&gt;&lt;/EM&gt;&lt;STRONG&gt;Is there a way to get a list of application pools on a web server?&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;A&lt;/STRONG&gt;&lt;EM&gt;&lt;B&gt;.&lt;/B&gt;&lt;/EM&gt;&lt;STRONG&gt; &lt;/STRONG&gt;This is less obvious but there is a way.&lt;/P&gt;
&lt;P&gt;&lt;EM&gt;( Get-deploymentObject apphostconfig ).Invoke("GetDependencies").AppPools&lt;/EM&gt;&lt;/P&gt;
&lt;P&gt;Replace apphostconfig provider with webserver60 provider as needed for IIS6 servers.&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Q.&amp;nbsp; How do I send credentials to remote machines in Powershell? &lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;A.&amp;nbsp; &lt;/STRONG&gt;Credentials in Powershell use the -credential switch ( the direct input for this switch can be a credentials object or just the username ) and there is a way to pass both the username and password remotely by creating a credential object first and passing it as a parameter.&amp;nbsp; If your credential object only contains a username you will be prompted for a password.&amp;nbsp; The following example creates a deployment object from an IIS7 web-server remotely and stores it in the $server variable.&amp;nbsp; In this example, you would be prompted for a password directly after executing this cmdlet.&lt;/P&gt;
&lt;P&gt;&lt;EM&gt;$server = Get-deploymentObject apphostconfig -computername &amp;lt;computername&amp;gt; -credential &amp;lt;domain\username&amp;gt; &lt;/EM&gt;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Q.&amp;nbsp; I want to create a credential object with my password included, is there anyway to do this?&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;A.&amp;nbsp; &lt;/STRONG&gt;The first step is to store your password to file, and typically you want to encrypt your password at the same time.&amp;nbsp; The easy way is at the Powershell command prompt use the following cmdlet.&lt;/P&gt;
&lt;P&gt;&lt;EM&gt;Read-host -prompt password -assecurestring | convertfrom-securestring | out-file c:\encryptedpassword.txt&lt;/EM&gt;&lt;/P&gt;
&lt;P&gt;You will then be prompted with a "password:" prompt that you can enter your password.&amp;nbsp; This creates the file c:\encryptedpassword.txt.&amp;nbsp; Whenever you want to script your password and avoid prompts just have this file handy on the server submitting the credentials.&amp;nbsp; The next step is to create a secure string object with your password using the newly created file.&lt;/P&gt;
&lt;P&gt;&lt;EM&gt;$secureStringObject = Get-content c:\encryptedpassword.txt | convertto-securestring&lt;/EM&gt;&lt;/P&gt;
&lt;P&gt;Finally, create the credentials object that you can use for the remainder of your Powershell session.&lt;/P&gt;
&lt;P&gt;&lt;EM&gt;$credentials = new-object -typename System.Management.Automation.PSCredential -argumentlist "&amp;lt;username&amp;gt;",$secureStringObject&lt;/EM&gt;&lt;/P&gt;
&lt;P&gt;Now use this credential object in your Get-deploymentObject and &lt;EM&gt;voila, &lt;/EM&gt;you no longer have to type out your password to do remote operations&lt;EM&gt;.&amp;nbsp; &lt;/EM&gt;Simply use the $credentials object as the parameter for credential switch.&lt;/P&gt;
&lt;P&gt;&lt;EM&gt;Get-deploymentObject apphostconfig -computername &amp;lt;computer&amp;gt; -credential $credentials&lt;/EM&gt;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Q.&amp;nbsp; The command line tool for MSDeploy has a configuration file which I can add and configure rules I use for my web server, how can I do this in Powershell?&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;A.&amp;nbsp; &lt;/STRONG&gt;While it is possible to create rules on the PS command prompt, there is currently no configuration file used in Powershell sessions.&amp;nbsp; This can be worked around by scripting common operations to script files and placing the rules there.&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Q.&amp;nbsp; I stored my web server to a deployment object ($server = Get-deploymentObject apphostconfig ) and then made changes to my web server.&amp;nbsp; Why are my changes not showing up in deployment object?&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;&lt;EM&gt;(** The following has been updated as of 3/4/09)&lt;/EM&gt;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;A.&amp;nbsp; &lt;/STRONG&gt;This has changed slightly from previous versions.&amp;nbsp; Your $server object will be more of a placeholder until it is used.&amp;nbsp; That is to say until an operation is performed such as an Update, GetDependencies or GetSystemInfo it is a hollow object.&amp;nbsp; Upon making the previously mentioned calls the object will then be created and validated at that time.&amp;nbsp; To force this validation simply do something like $server.Invoke("GetSystemInfo").OuterXml, if you get system information back then the object is valid in this case.&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Q.&amp;nbsp; Is there a way I don't have to add the MSDeploysnapin manually to every Powershell session?&amp;nbsp; &lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;A.&amp;nbsp; &lt;/STRONG&gt;You can do this by starting a Powershell session and adding the MSDeploysnapin.&amp;nbsp; Then, export your console with the following cmdlet ( this works for Vista Powershell version 1.0 ).&lt;/P&gt;
&lt;P&gt;&lt;EM&gt;Export-Console -path &amp;lt;directory\filename&amp;gt;&lt;/EM&gt;&lt;/P&gt;
&lt;P&gt;This will create a file with a psc1 extension ( might be different for other Powershell versions ).&amp;nbsp; Whatever shortcut you use to start Powershell, now add the following switch and argument. &lt;/P&gt;
&lt;P&gt;Powershell.exe &lt;STRONG&gt;&lt;I&gt;-PSConsoleFile c:\&amp;lt;filename&amp;gt;.psc1&lt;/I&gt;&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;This will load the MSDeploysnapin automatically and start your Powershell session.&amp;nbsp; You can also create the psc1 file manually if you only want the MSDeploysnapin by saving the below xml to a psc1 file. &lt;/P&gt;
&lt;P&gt;&amp;lt;?xml version="1.0" encoding="utf-8"?&amp;gt; &lt;BR&gt;&amp;lt;PSConsoleFile ConsoleSchemaVersion="1.0"&amp;gt; &lt;BR&gt;&amp;nbsp; &amp;lt;PSVersion&amp;gt;1.0&amp;lt;/PSVersion&amp;gt; &lt;BR&gt;&amp;nbsp; &amp;lt;PSSnapIns&amp;gt; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;PSSnapIn Name="msdeploysnapin" /&amp;gt; &lt;BR&gt;&amp;nbsp; &amp;lt;/PSSnapIns&amp;gt; &lt;BR&gt;&amp;lt;/PSConsoleFile&amp;gt; &lt;/P&gt;
&lt;P&gt;That's it for my first Powershell FAQ of MSDeploy.&amp;nbsp; If there is anything else you would like to see in this blog, feel free to respond below and let me know.&amp;nbsp; In the future, I hope to provide a deeper look into deployment objects and the MSDeploysnapin cmdlets.&lt;/P&gt;
&lt;P mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;&lt;img src="http://blogs.iis.net/aggbug.aspx?PostID=2570454" width="1" height="1"&gt;</description><category domain="http://blogs.iis.net/jamescoo/archive/tags/MSDeploy/default.aspx">MSDeploy</category><category domain="http://blogs.iis.net/jamescoo/archive/tags/Snapin/default.aspx">Snapin</category><category domain="http://blogs.iis.net/jamescoo/archive/tags/Powershell/default.aspx">Powershell</category></item></channel></rss>