<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>IIS Archives - Blog IT</title>
	<atom:link href="https://blogit.create.pt/category/web/iis/feed/" rel="self" type="application/rss+xml" />
	<link>https://blogit.create.pt/category/web/iis/</link>
	<description>Create IT blogger community</description>
	<lastBuildDate>Thu, 10 Jan 2019 14:18:17 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.9.1</generator>
	<item>
		<title>Aprovisionamento de sites no IIS6 usando uma aplicação ASP.NET</title>
		<link>https://blogit.create.pt/miguelisidoro/2006/11/06/aprovisionamento-de-sites-no-iis6-usando-uma-aplicao-asp-net/</link>
					<comments>https://blogit.create.pt/miguelisidoro/2006/11/06/aprovisionamento-de-sites-no-iis6-usando-uma-aplicao-asp-net/#respond</comments>
		
		<dc:creator><![CDATA[Miguel Isidoro]]></dc:creator>
		<pubDate>Mon, 06 Nov 2006 17:33:00 +0000</pubDate>
				<category><![CDATA[ASP.NET]]></category>
		<category><![CDATA[IIS]]></category>
		<category><![CDATA[.NET]]></category>
		<guid isPermaLink="false">http://blogcreate.azurewebsites.net/miguelisidoro/?p=1031</guid>

					<description><![CDATA[<p>O exemplo apresentado de seguida permite efectuar a cria&#231;&#227;o de um site no IIS6&#160;a partir de uma template. Esta solu&#231;&#227;o torna-se particularmente &#250;til para cen&#225;rios em que seja necess&#225;rio efectuar o aprovisionamento de v&#225;rios sites com a mesma estrutura, composta tipicamente por um conjunto de directorias virtuais. Para efectuar a cria&#231;&#227;o de uma template de [&#8230;]</p>
<p>The post <a href="https://blogit.create.pt/miguelisidoro/2006/11/06/aprovisionamento-de-sites-no-iis6-usando-uma-aplicao-asp-net/">Aprovisionamento de sites no IIS6 usando uma aplicação ASP.NET</a> appeared first on <a href="https://blogit.create.pt">Blog IT</a>.</p>
]]></description>
										<content:encoded><![CDATA[<div>O exemplo apresentado de seguida permite efectuar a cria&ccedil;&atilde;o de um site no IIS6&nbsp;a partir de uma template. Esta solu&ccedil;&atilde;o torna-se particularmente &uacute;til para cen&aacute;rios em que seja necess&aacute;rio efectuar o aprovisionamento de v&aacute;rios sites com a mesma estrutura, composta tipicamente por um conjunto de directorias virtuais. Para efectuar a cria&ccedil;&atilde;o de uma template de site &eacute; apenas necess&aacute;rio, na consola de administra&ccedil;&atilde;o do IIS, exportar a configura&ccedil;&atilde;o de um site com a estrutura pretendida para ficheiro (para mais detalhes sobre este processo, cliquem <a href="http://www.microsoft.com/technet/prodtechnol/WindowsServer2003/Library/IIS/85d69588-c6de-44aa-a75d-542529577cec.mspx?mfr=true" title="Creating a Web Site from a Template (IIS 6.0)" target="_blank">aqui</a>). A template obtida &eacute; um ficheiro xml, designado por ficheiro de metabase do site, contendo toda a configura&ccedil;&atilde;o de um site. Para mais detalhes sobre a metabase do IIS6, cliquem <a href="http://www.windowsdevcenter.com/pub/a/windows/2004/07/13/iis_metabase.html" title="Inside the XML Metabase of IIS 6" target="_blank">aqui</a>.</div>
<div></div>
<h4>A solu&ccedil;&atilde;o</h4>
<div>A solu&ccedil;&atilde;o apresentada de seguida pode ser decomposta nos seguintes passos:</div>
<ul>
<li>Cria&ccedil;&atilde;o do novo site</li>
<li>Gera&ccedil;&atilde;o da configura&ccedil;&atilde;o do novo site com base na configura&ccedil;&atilde;o do site base</li>
<li>Importa&ccedil;&atilde;o da configura&ccedil;&atilde;o do novo site</li>
</ul>
<div>As opera&ccedil;&otilde;es realizadas durante o processo de cria&ccedil;&atilde;o de um site fazem uso de dois scripts de base do IIS, localizados na directoria C:\Windows\System32:</div>
<ul>
<li><strong>Iisweb.vbs</strong>: permite efectuar todas as opera&ccedil;&otilde;es de gest&atilde;o de um site (cria&ccedil;&atilde;o, remo&ccedil;&atilde;o, etc). Para mais detalhes, cliquem <a href="http://support.microsoft.com/kb/816568" title="HOW TO Manage Web Sites and Web Virtual Directories by Using Command-Line Scripts in IIS 6.0" target="_blank">aqui</a>.</li>
<li><strong>iiscnfg.vbs</strong>: permite efectuar as opera&ccedil;&otilde;es de gest&atilde;o da configura&ccedil;&atilde;o de um site (exporta&ccedil;&atilde;o e importa&ccedil;&atilde;o de configura&ccedil;&atilde;o, etc). Para mais detalhes, cliquem <a href="http://technet2.microsoft.com/WindowsServer/en/library/46e15c9a-fd7c-4c1e-aaa6-0767ccd6fdd11033.mspx?mfr=true" title="Iiscnfg.vbs IIS configuration script" target="_blank">aqui</a>.</li>
</ul>
<h4>Cria&ccedil;&atilde;o do novo site</h4>
<div>Neste passo, &eacute; efectuada a cria&ccedil;&atilde;o do site no IIS. De referir que no processo de cria&ccedil;&atilde;o um site no IIS6, podem ser utilizados tr&ecirc;s modos de acesso:</div>
<ul>
<li><strong>Endere&ccedil;o IP</strong> &ndash; permite a defini&ccedil;&atilde;o de um endere&ccedil;o IP como modo de acesso do site. Deste modo, o porto 80 pode ser usado por mais do que um site desde que sejam usados endere&ccedil;os IP diferentes.</li>
<li><strong>Porto</strong> &ndash; permite a defini&ccedil;&atilde;o de um porto como modo de acesso do site. Deste modo, tem que ser usado um porto diferente para cada site mas permite o uso do mesmo endere&ccedil;o IP.</li>
<li><strong>Host Header</strong> &ndash; um host header, tal como o nome indica, &eacute; um cabe&ccedil;alho definido ao n&iacute;vel do site e permite que diversos sites utilizem o mesmo porto para o mesmo endere&ccedil;o IP. Exemplos de host headers s&atilde;o &ldquo;www.create.pt&rdquo; ou &ldquo;blogit.create.pt&rdquo; (o URL que se pretende para o acesso externo ao site sem &ldquo;http//&rdquo;). Um pedido HTTP chega ao servidor web e o utilizador &eacute; redireccionado para o site correcto com base no URL. Como nota final, de referir que usando host headers, &eacute; necess&aacute;rio criar uma entrada no DNS por cada site criado a apontar para o endere&ccedil;o IP externo do servidor web.</li>
</ul>
<div>Para mais detalhes sobre o processo de cria&ccedil;&atilde;o de um site no IIS6, cliquem <a href="http://www.simongibson.com/intranet/iis6/" title="Internet Information Services 6 Tutorial (Windows Server 2003)" target="_blank">aqui</a>. </p>
<p style="margin: 0px">&nbsp;</p>
</div>
<div></div>
<div></div>
<div>O seguinte m&eacute;todo &eacute; respons&aacute;vel pela cria&ccedil;&atilde;o do site. O site, nesta fase, n&atilde;o &eacute; iniciado, apenas o sendo no final. </p>
<p style="margin: 0px">&nbsp;</p>
</div>
<div></div>
<div></div>
<div>
<div style="font-size: 10pt;background: white;color: black;font-family: Courier New">
<p style="margin: 0px"><span style="color: green">//constantes usadas ao longo dos exemplos</span></p>
<p style="margin: 0px"><span style="color: blue">private</span> <span style="color: blue">const</span> <span style="color: blue">string</span> IIS_WEB_COMMAND = <span style="color: maroon">@&quot;C:\WINDOWS\system32\iisWeb.vbs&quot;</span>;</p>
<p style="margin: 0px"><span style="color: blue">private</span> <span style="color: blue">const</span> <span style="color: blue">string</span> IIS_CONFIG_COMMAND = <span style="color: maroon">@&quot;C:\WINDOWS\system32\iisCnfg.vbs&quot;</span>;</p>
<p style="margin: 0px"><span style="color: blue">private</span> <span style="color: blue">const</span> <span style="color: blue">string</span> WINDOWS_COMMAND = <span style="color: maroon">&quot;cmd&quot;</span>;</p>
<p style="margin: 0px"><span style="color: blue">private</span> <span style="color: blue">const</span> <span style="color: blue">string</span> SITEPATH_REGULAR_EXPRESSION = <span style="color: maroon">@&quot;W3SVC/\d*&quot;</span>;</p>
<p style="margin: 0px">&nbsp;</p>
</div>
</div>
<div></div>
<div>
<div style="font-size: 10pt;background: white;color: black;font-family: Courier New">
<p style="margin: 0px"><span style="color: blue">private</span> <span style="color: blue">int</span> CreateSite(<span style="color: blue">string</span> webSiteHomeDirectory, <span style="color: blue">string</span> siteName, <span style="color: blue">string</span> ip, <span style="color: blue">string</span> port, <span style="color: blue">string</span> hostHeader)</p>
<p style="margin: 0px">{</p>
<p style="margin: 0px">&nbsp;&nbsp;&nbsp; Process process = <span style="color: blue"><span style="color: blue">new</span><font color="#000000"> Process();</font></span></p>
<p style="margin: 0px">&nbsp;</p>
<p style="margin: 0px">&nbsp;&nbsp;&nbsp;&nbsp;process.EnableRaisingEvents = <span style="color: blue">false</span>;</p>
<p style="margin: 0px">&nbsp;</p>
<p style="margin: 0px">&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: green">//criar site mas n&atilde;o arranc&aacute;-lo</span></p>
<p style="margin: 0px">&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: green">//iisweb /create &lt;directoria&gt; &lt;nome&gt; /donstart</span></p>
<p style="margin: 0px">&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: teal">StringBuilder</span> commandArguments = <span style="color: blue">new</span> <span style="color: teal">StringBuilder</span>(<span style="color: teal">String</span>.Format(<span style="color: maroon">@&quot; /create {0} {1} /dontstart&quot;</span>, webSiteHomeDirectory, siteName));</p>
<p style="margin: 0px">&nbsp;</p>
<p style="margin: 0px">&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: green">//modo de acesso por endere&ccedil;o IP</span></p>
<p style="margin: 0px">&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: blue">if</span> (ip != <span style="color: blue">null</span> &amp;&amp; ip.Trim().Length &gt; 0)</p>
<p style="margin: 0px">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; commandArguments.Append(<span style="color: teal">String</span>.Format(<span style="color: maroon">&quot; /i {0}&quot;</span>, ip));</p>
<p style="margin: 0px">&nbsp;</p>
<p style="margin: 0px">&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: green">//modo de acesso por porto</span></p>
<p style="margin: 0px">&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: blue">if</span> (port != <span style="color: blue">null</span> &amp;&amp; port.Trim().Length &gt; 0)</p>
<p style="margin: 0px">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; commandArguments.Append(<span style="color: teal">String</span>.Format(<span style="color: maroon">&quot; /b {0}&quot;</span>, port));</p>
<p style="margin: 0px">&nbsp;</p>
<p style="margin: 0px">&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: green">//modo de acesso por host header</span></p>
<p style="margin: 0px">&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: blue">if</span> (hostHeader != <span style="color: blue">null</span> &amp;&amp; hostHeader.Trim().Length &gt; 0)</p>
<p style="margin: 0px">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; commandArguments.Append(<span style="color: teal">String</span>.Format(<span style="color: maroon">&quot; /d {0}&quot;</span>, hostHeader));</p>
<p style="margin: 0px">&nbsp;</p>
<p style="margin: 0px">&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: green">//assignar o script a correr</span></p>
<p style="margin: 0px">&nbsp;&nbsp;&nbsp;&nbsp;process.StartInfo.FileName = IIS_WEB_COMMAND;</p>
<p style="margin: 0px">&nbsp;&nbsp;&nbsp;&nbsp;process.StartInfo.Arguments = commandArguments.ToString();</p>
<p style="margin: 0px">&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: green">/iniciar o processo</span></p>
<p style="margin: 0px">&nbsp;&nbsp;&nbsp;&nbsp;process.Start();</p>
<p style="margin: 0px">&nbsp;&nbsp;&nbsp;&nbsp;process.WaitForExit();</p>
<p style="margin: 0px">&nbsp;</p>
<p style="margin: 0px">&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: green">//retornar c&oacute;digo de execu&ccedil;&atilde;o do processo. Retorna 0 se tudo correr bem.</span></p>
<p style="margin: 0px">&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: blue">return</span> process.ExitCode;</p>
<p style="margin: 0px">}</p>
</div>
</div>
<div></div>
<div></div>
<div></div>
<div></div>
<p style="margin: 0px">&nbsp;</p>
<p style="margin: 0px">Ao longo dos exemplos, &eacute; utilizada a classe System.Diagnostics.Process para efectuar a execu&ccedil;&atilde;o dos scripts do IIS. Para mais detalhes sobre esta classe, cliquem <a href="http://msdn2.microsoft.com/en-us/library/system.diagnostics.process(VS.80).aspx" title="Process Class (System.Diagnostics)" target="_blank">aqui</a>.</p>
<h4>Gera&ccedil;&atilde;o da configura&ccedil;&atilde;o do novo site com base na configura&ccedil;&atilde;o do site base</h4>
<p style="margin: 0px">Neste passo, &eacute; lida o ficheiro de metabase do site base e gerado a partir deste, o ficheiro de configura&ccedil;&atilde;o do novo site. As altera&ccedil;&otilde;es a efectuar &agrave; configura&ccedil;&atilde;o base s&atilde;o compostos tipicamente por:</p>
<ul>
<li>
<div style="margin: 0px">Altera&ccedil;&atilde;o do ID do site para o ID do novo site</div>
</li>
<li>
<div style="margin: 0px">Altera&ccedil;&atilde;o da directoria do site (e das directorias virtuais se existirem) para as do novo site</div>
</li>
<li>
<div style="margin: 0px">Alterar o nome do site para o do novo site</div>
</li>
<li>
<div style="margin: 0px">Alterar o host header para o do novo site</div>
</li>
</ul>
<div style="margin: 0px">O seguinte m&eacute;todo &eacute; respons&aacute;vel pela gera&ccedil;&atilde;o do ficheiro de metabase do novo site. Este ficheiro ser&aacute; posteriormente utilizado para importar a configura&ccedil;&atilde;o do novo site. De referir que tratando-se o ficheiro de metabase um ficheiro xml, foi utilizada a classe XmlDocument para efectuar a manipula&ccedil;&atilde;o do mesmo. </p>
<p style="margin: 0px">&nbsp;</p>
</div>
<div style="margin: 0px"></div>
<div style="margin: 0px">
<div style="font-size: 10pt;background: white;color: black;font-family: Courier New">
<p style="margin: 0px"><span style="color: blue">private</span> <span style="color: blue">string</span> CreateSiteTemplateXml(<span style="color: blue">string</span> xmlConfigPath, <span style="color: blue">string</span> masterWebID, <span style="color: blue">string</span> createdWebID, <span style="color: blue">string</span> siteName, <span style="color: blue">string</span> hostHeader)</p>
<p style="margin: 0px">{</p>
<p style="margin: 0px">&nbsp;&nbsp;&nbsp; XmlDocument xmlDocument = <span style="color: blue">new</span> XmlDocument();</p>
<p style="margin: 0px">&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: green">//ler ficheiro de metabase do site base</span></p>
<p style="margin: 0px">&nbsp;&nbsp;&nbsp;&nbsp;xmlDocument.Load(xmlConfigPath);</p>
<p style="margin: 0px">&nbsp;</p>
<p style="margin: 0px">&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: green">//seleccionar elemento xml IISWebServer da metabase</span></p>
<p style="margin: 0px">&nbsp;&nbsp;&nbsp;&nbsp;XmlNodeList xmlNodeList = xmlDocument.DocumentElement.SelectNodes(&ldquo;./MBProperty/IIsWebServer&rdquo;);</p>
<p style="margin: 0px">&nbsp;</p>
<p style="margin: 0px">&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: green">//substituir host header</span></p>
<p style="margin: 0px">&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: blue">foreach</span>(XmlNode xmlNode <span style="color: blue">in</span> xmlNodeList)</p>
<p style="margin: 0px">&nbsp;&nbsp;&nbsp;&nbsp;{</p>
<p style="margin: 0px">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; xmlAttribute = XmlHelper.GetAttribute(xmlNode.Attributes, &ldquo;ServerBindings&rdquo;);</p>
<p style="margin: 0px">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: blue">string</span> serverBinding = xmlAttribute.Value;</p>
<p style="margin: 0px">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: blue">string</span> [] serverBindings = serverBinding.Split(<span style="color: maroon">&#039;:&#039;</span>);</p>
<p style="margin: 0px">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: blue">string</span> oldHostHeader = serverBindings[serverBindings.Length &#8211; 1];</p>
<p style="margin: 0px">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;xmlAttribute.Value = xmlAttribute.Value.Replace(oldHostHeader, hostHeader);</p>
<p style="margin: 0px">&nbsp;&nbsp;&nbsp;&nbsp;}</p>
<p style="margin: 0px">&nbsp;</p>
<p style="margin: 0px">&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: green">//substituir nome site</span></p>
<p style="margin: 0px">&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: blue">foreach</span>(XmlNode xmlNode <span style="color: blue">in</span> xmlNodeList)</p>
<p style="margin: 0px">&nbsp;&nbsp;&nbsp;&nbsp;{</p>
<p style="margin: 0px">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; xmlAttribute = XmlHelper.GetAttribute(xmlNode.Attributes, &ldquo;ServerComment&rdquo;);</p>
<p style="margin: 0px">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;xmlAttribute.Value = xmlAttribute.Value.Replace(xmlAttribute.Value, siteName);</p>
<p style="margin: 0px">&nbsp;&nbsp;&nbsp;&nbsp;}</p>
<p style="margin: 0px">&nbsp;</p>
<p style="margin: 0px">&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: green">//seleccionar elemento xml IIsWebVirtualDir da metabase</span></p>
<p style="margin: 0px">&nbsp;&nbsp;&nbsp;&nbsp;xmlNodeList = xmlDocument.DocumentElement.SelectNodes(&ldquo;./MBProperty/IIsWebVirtualDir&rdquo;);</p>
<p style="margin: 0px">&nbsp;</p>
<p style="margin: 0px">&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: blue">foreach</span>(XmlNode xmlNode <span style="color: blue">in</span> xmlNodeList)</p>
<p style="margin: 0px">&nbsp;&nbsp;&nbsp;&nbsp;{</p>
<p style="margin: 0px">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: green">//substituir atributo AppRoot com o id do novo site</span></p>
<p style="margin: 0px">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;xmlAttribute = XmlHelper.GetAttribute(xmlNode.Attributes, &ldquo;AppRoot&rdquo;);</p>
<p style="margin: 0px">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;xmlAttribute.Value = xmlAttribute.Value.Replace(masterWebID, createdWebID);</p>
<p style="margin: 0px">&nbsp;&nbsp;&nbsp;&nbsp;}</p>
<p style="margin: 0px">&nbsp;</p>
<p style="margin: 0px">&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: green">//substituir directorias do site (existe um elemento IIsWebVirtualDir para a root e para cada directoria virtual). Este&nbsp;exemplo assume que os nomes das directorias do site ir&atilde;o conter o id do site no IIS, sendo substituido o id do site base pelo id do novo site. Ex: C:\inetpub\wwwroot\site&lt;idsitebase&gt; -&gt; C:\inetpub\wwwroot\site&lt;idsitenovo&gt;</span></p>
<p style="margin: 0px">&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: blue">foreach</span>(XmlNode xmlNode <span style="color: blue">in</span> xmlNodeList)</p>
<p style="margin: 0px">&nbsp;&nbsp;&nbsp;&nbsp;{</p>
<p style="margin: 0px">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; xmlAttribute = XmlHelper.GetAttribute(xmlNode.Attributes, &ldquo;<span style="color: teal">Path</span>&rdquo;);</p>
<p style="margin: 0px">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;xmlAttribute.Value = xmlAttribute.Value.Replace(masterWebID, createdWebID);</p>
<p style="margin: 0px">&nbsp;&nbsp;&nbsp;&nbsp;}</p>
<p style="margin: 0px">&nbsp;</p>
<p style="margin: 0px">&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: green">//gerar ficheiro metabase novo site</span></p>
<p style="margin: 0px">&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: blue">string</span> newPath = <span style="color: teal">String</span>.Format(<span style="color: maroon">&quot;{0}{1}.xml&quot;</span>, xmlConfigPath.Replace(<span style="color: maroon">&quot;.xml&quot;</span>, <span style="color: teal">String</span>.Empty), createdWebID.Replace(Constants.IISWebSiteIdentifierPrefix, <span style="color: teal">String</span>.Empty));</p>
<p style="margin: 0px">&nbsp;</p>
<p style="margin: 0px">&nbsp;&nbsp;&nbsp;&nbsp;xmlDocument.Save(newPath);</p>
<p style="margin: 0px">&nbsp;</p>
<p style="margin: 0px">&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: green">//retornar caminho para ficheiro metabase do novo site</span></p>
<p style="margin: 0px">&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: blue">return</span> newPath;</p>
<p style="margin: 0px">}</p>
</div>
<p><!--EndFragment--></div>
<h4>Importa&ccedil;&atilde;o da configura&ccedil;&atilde;o do novo site</h4>
<p style="margin: 0px">Neste passo, &eacute; efectuada a importa&ccedil;&atilde;o da configura&ccedil;&atilde;o criada no passo anterior. O seguinte m&eacute;todo e respons&aacute;vel por esta opera&ccedil;&atilde;o.</p>
<p style="margin: 0px">&nbsp;</p>
<div style="font-size: 10pt;background: white;color: black;font-family: Courier New">
<p style="margin: 0px"><span style="color: blue">private</span> <span style="color: blue">int</span> ImportSiteConfiguration(<span style="color: blue">string</span> xmlConfigPath, <span style="color: blue">string</span> masterWebID, <span style="color: blue">string</span> createdWebID)</p>
<p style="margin: 0px">{</p>
<p style="margin: 0px">&nbsp;&nbsp;&nbsp;&nbsp; Process process = <span style="color: blue">new</span> Process();</p>
<p style="margin: 0px">&nbsp;</p>
<p style="margin: 0px">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;process.EnableRaisingEvents=<span style="color: blue">false</span>;</p>
<p style="margin: 0px">&nbsp;</p>
<p style="margin: 0px">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: blue">string</span> commandArguments = <span style="color: teal">String</span>.Format(<span style="color: maroon">@&quot; /import /f &quot;&quot;{0}&quot;&quot; /sp /LM/{1}/root /dp /LM/{2}/root /children&quot;</span>, xmlConfigPath, masterWebID, createdWebID);</p>
<p style="margin: 0px">&nbsp;</p>
<p style="margin: 0px">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;process.StartInfo.FileName = IIS_CONFIG_COMMAND;</p>
<p style="margin: 0px">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;process.StartInfo.Arguments = commandArguments;</p>
<p style="margin: 0px">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;process.Start();</p>
<p style="margin: 0px">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;process.WaitForExit();</p>
<p style="margin: 0px">&nbsp;</p>
<p style="margin: 0px">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: blue">return</span> process.ExitCode;</p>
<p style="margin: 0px">}</p>
</div>
<h4>O processo de cria&ccedil;&atilde;o do site</h4>
<p style="margin: 0px">O m&eacute;todo seguinte&nbsp;efectua a chamada a cada uma dos m&eacute;todos anteriores e alguns m&eacute;todos auxiliares para efectuar o processo de cria&ccedil;&atilde;o do site.</p>
<p style="margin: 0px">&nbsp;</p>
<div style="font-size: 10pt;background: white;color: black;font-family: Courier New">
<p style="margin: 0px"><span style="color: blue">public</span> <span style="color: blue">void</span> CreateNewWebSite(<span style="color: blue">string</span> webSiteHomeDirectory, <span style="color: blue">string</span> webSiteBackOfficeFolder, <span style="color: blue">string</span> siteName, </p>
<p style="margin: 0px">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <span style="color: blue">string</span> ip, <span style="color: blue">string</span> port, <span style="color: blue">string</span> hostHeader)</p>
<p style="margin: 0px">{</p>
<p style="margin: 0px"><span style="color: green">&nbsp;&nbsp;&nbsp; //criar site</span></p>
<p style="margin: 0px">&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: blue">int</span> createSiteResult = CreateSite(webSiteHomeDirectory, siteName, <span style="color: blue">null</span>, <span style="color: blue">null</span>, hostHeader);</p>
<p style="margin: 0px">&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: blue">if</span> (createSiteResult == 0) <span style="color: green">//cria&ccedil;&atilde;o site ok</span></p>
<p style="margin: 0px">&nbsp;&nbsp;&nbsp;&nbsp;{</p>
<p style="margin: 0px">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: green">//obter id do novo site</span></p>
<p style="margin: 0px">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: blue">string</span> createdSiteID = GetSiteID(siteName);</p>
<p style="margin: 0px">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: green">//gerar ficheiro configura&ccedil;&atilde;o novo site</span></p>
<p style="margin: 0px">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: blue">string</span> xmlConfigPath = CreateSiteTemplateXml(webSiteHomeDirectory, webSiteBackOfficeFolder, Settings.MasterWebSiteXmlConfigurationPath, </p>
<p style="margin: 0px">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Settings.MasterWebSiteID, createdSiteID, siteName, hostHeader);</p>
<p style="margin: 0px">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: green">//importar configura&ccedil;ao novo site</span></p>
<p style="margin: 0px">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: blue">int</span> importSiteResult = ImportSiteConfiguration(xmlConfigPath, Settings.MasterWebSiteID, createdSiteID);</p>
<p style="margin: 0px">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: blue">if</span> (importSiteResult == 0) <span style="color: green">//importa&ccedil;&atilde;o ok</span></p>
<p style="margin: 0px">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; StartSite(siteName);</p>
<p style="margin: 0px">&nbsp;&nbsp;&nbsp;&nbsp;}</p>
<p style="margin: 0px">}</p>
</div>
<h4>Outros M&eacute;todos Utilizados</h4>
<p style="margin: 0px">Foram ainda utilizados os seguintes m&eacute;todos:</p>
<p style="margin: 0px">&nbsp;</p>
<p style="margin: 0px"><strong>GetSiteID</strong>: m&eacute;todo que obt&eacute;m o id do site a partir do nome.</p>
<p style="margin: 0px">&nbsp;</p>
<div style="font-size: 10pt;background: white;color: black;font-family: Courier New">
<p style="margin: 0px"><span style="color: blue">private</span> <span style="color: blue">string</span> GetSiteID(<span style="color: blue">string</span> siteName)</p>
<p style="margin: 0px">{</p>
<p style="margin: 0px"><span style="color: blue">&nbsp;&nbsp;&nbsp; </span><span style="color: blue">string</span> commandToExecute = <span style="color: teal">String</span>.Format(<span style="color: maroon">@&quot;{0} /query {1}&quot;</span>, IIS_WEB_COMMAND, siteName);</p>
<p style="margin: 0px">&nbsp;</p>
<p style="margin: 0px">&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: blue">string</span> commandResult = RunShellCommand(commandToExecute);</p>
<p style="margin: 0px">&nbsp;&nbsp;&nbsp;&nbsp;<font color="#0000ff">string</font> siteID = GetRegularExpressionResult(SITEPATH_REGULAR_EXPRESSION, commandResult);</p>
<p style="margin: 0px">&nbsp;</p>
<p style="margin: 0px">&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: blue">return</span> siteID;</p>
<p style="margin: 0px">}</p>
</div>
<p style="margin: 0px">&nbsp;</p>
<p style="margin: 0px"><strong>RunShellCommand</strong>: m&eacute;todo que executa um comando externo e obt&eacute;m o resultado da sua execu&ccedil;&atilde;o.</p>
<p style="margin: 0px">&nbsp;</p>
<div style="font-size: 10pt;background: white;color: black;font-family: Courier New">
<p style="margin: 0px"><span style="color: blue">private</span> <span style="color: blue">string</span> RunShellCommand(<span style="color: blue">string</span> shellCommandToExecute)</p>
<p style="margin: 0px">{</p>
<p style="margin: 0px">&nbsp;&nbsp;&nbsp; Process process = <span style="color: blue">new</span> Process();</p>
<p style="margin: 0px">&nbsp;</p>
<p style="margin: 0px">&nbsp;&nbsp;&nbsp;&nbsp;process.EnableRaisingEvents=<span style="color: blue">false</span>;</p>
<p style="margin: 0px">&nbsp;</p>
<p style="margin: 0px">&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: green">//obter nome ficheiro tempor&aacute;rio&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; </span></p>
<p style="margin: 0px">&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: blue">string</span> tempFileName = <span style="color: teal">String</span>.Format(<span style="color: maroon">@&quot;{0}\{1}.txt&quot;</span>, Settings.WebSiteCreationTempFolder, <span style="color: teal">DateTime</span>.Now.ToString(FILE_DATETIME_FORMAT));</p>
<p style="margin: 0px">&nbsp;</p>
<p style="margin: 0px">&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: green">//executar comando e escrever resultado para ficheiro</span></p>
<p style="margin: 0px">&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: blue">string</span> commandArguments = <span style="color: teal">String</span>.Format(<span style="color: maroon">@&quot; /c {0} &gt; {1}&quot;</span>, shellCommandToExecute, tempFileName);</p>
<p style="margin: 0px">&nbsp;</p>
<p style="margin: 0px">&nbsp;&nbsp;&nbsp;&nbsp;process.StartInfo.FileName = WINDOWS_COMMAND;</p>
<p style="margin: 0px">&nbsp;&nbsp;&nbsp;&nbsp;process.StartInfo.Arguments = commandArguments;</p>
<p style="margin: 0px">&nbsp;&nbsp;&nbsp;&nbsp;process.Start();</p>
<p style="margin: 0px">&nbsp;&nbsp;&nbsp;&nbsp;process.WaitForExit();</p>
<p style="margin: 0px">&nbsp;</p>
<p style="margin: 0px">&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: green">//ler resultados de ficheiro tempor&aacute;rio</span></p>
<p style="margin: 0px">&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: teal">StreamReader</span> streamReader = <span style="color: blue">new</span> <span style="color: teal">StreamReader</span>(tempFileName);</p>
<p style="margin: 0px">&nbsp;&nbsp;&nbsp;&nbsp;s<span style="color: blue">tring</span> commandResults = streamReader.ReadToEnd();</p>
<p style="margin: 0px">&nbsp;</p>
<p style="margin: 0px">&nbsp;&nbsp;&nbsp;&nbsp;streamReader.Close();</p>
<p style="margin: 0px">&nbsp;</p>
<p style="margin: 0px">&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: green">//apagar ficheiro tempor&aacute;rio</span></p>
<p style="margin: 0px">&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: teal">File</span>.Delete(tempFileName);</p>
<p style="margin: 0px">&nbsp;</p>
<p style="margin: 0px">&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: green">//devolver resultado</span></p>
<p style="margin: 0px">&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: blue">return</span> commandResults;</p>
<p style="margin: 0px">}</p>
</div>
<p style="margin: 0px">&nbsp;</p>
<p style="margin: 0px"><strong>GetRegularExpressionResult</strong>: m&eacute;todo que aplica uma express&atilde;o regular a uma string.</p>
<p style="margin: 0px">&nbsp;</p>
<div style="font-size: 10pt;background: white;color: black;font-family: Courier New">
<p style="margin: 0px"><span style="color: blue">private</span> <span style="color: blue">string</span> GetRegularExpressionResult(<span style="color: blue">string</span> pattern, <span style="color: blue">string</span> inputString)</p>
<p style="margin: 0px">{</p>
<p style="margin: 0px">&nbsp;&nbsp;&nbsp; Regex regex = <span style="color: blue">new</span> Regex(pattern, RegexOptions.IgnoreCase);</p>
<p style="margin: 0px">&nbsp;&nbsp;&nbsp;&nbsp;MatchCollection matches = regex.Matches(inputString);</p>
<p style="margin: 0px">&nbsp;</p>
<p style="margin: 0px">&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: blue">return</span> matches.Count == 1 ? matches[0].Value : <span style="color: teal">String</span>.Empty;</p>
<p style="margin: 0px">}</p>
</div>
<p style="margin: 0px">&nbsp;</p>
<p style="margin: 0px"><strong>StartSite</strong>: m&eacute;todo que inicia o site.</p>
<p style="margin: 0px">&nbsp;</p>
<div style="font-size: 10pt;background: white;color: black;font-family: Courier New">
<p style="margin: 0px"><span style="color: blue">public</span> <span style="color: blue">void</span> StartSite(<span style="color: blue">string</span> siteName)</p>
<p style="margin: 0px">{</p>
<p style="margin: 0px">&nbsp;&nbsp;&nbsp; Process <span style="color: blue">new</span> Process();</p>
<p style="margin: 0px">&nbsp;</p>
<p style="margin: 0px">&nbsp;&nbsp;&nbsp;&nbsp;process.EnableRaisingEvents=<span style="color: blue">false</span>;</p>
<p style="margin: 0px">&nbsp;</p>
<p style="margin: 0px">&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: blue">string</span> commandArguments = <span style="color: teal">String</span>.Format(<span style="color: maroon">@&quot; /start {0} &quot;</span>, siteName);</p>
<p style="margin: 0px">&nbsp;</p>
<p style="margin: 0px">&nbsp;&nbsp;&nbsp;&nbsp;process.StartInfo.FileName = IIS_WEB_COMMAND;</p>
<p style="margin: 0px">&nbsp;&nbsp;&nbsp;&nbsp;process.StartInfo.Arguments = commandArguments;</p>
<p style="margin: 0px">&nbsp;&nbsp;&nbsp;&nbsp;process.Start();</p>
<p style="margin: 0px">&nbsp;&nbsp;&nbsp;&nbsp;process.WaitForExit();</p>
<p style="margin: 0px">}</p>
</div>
<h4>Seguran&ccedil;a</h4>
<p style="margin: 0px">Existem quest&otilde;es de seguran&ccedil;a associadas &agrave; cria&ccedil;&atilde;o de sites no IIS6 a partir de uma aplica&ccedil;&atilde;o ASP.NET. Por omiss&atilde;o, uma aplica&ccedil;&atilde;o ASP.NET a correr sobre IIS6, &eacute; executada usando uma conta de servi&ccedil;o com permiss&otilde;es muito restritas (conta &ldquo;Network Service&rdquo;). Para se criar um site no IIS, &eacute; necess&aacute;rio ter permiss&otilde;es de administra&ccedil;&atilde;o. Qualquer solu&ccedil;&atilde;o para resolver este problema implica riscos em termos de seguran&ccedil;a, sendo o objectivo encontrar uma solu&ccedil;&atilde;o que mitigue estes riscos. Uma solu&ccedil;&atilde;o poss&iacute;vel &eacute; a cria&ccedil;&atilde;o de um web service que fica respons&aacute;vel pela cria&ccedil;&atilde;o de sites. Este web service seria colocado no IIS numa segunda Web Application a correr numa Application Pool executada com uma conta de servi&ccedil;o com permiss&otilde;es de administra&ccedil;&atilde;o. Desta forma, a aplica&ccedil;&atilde;o ASP.NET continuaria a correr com a conta de servi&ccedil;o de permiss&otilde;es restritas, sendo a cria&ccedil;&atilde;o de sites a &uacute;nica opera&ccedil;&atilde;o a correr com permiss&otilde;es de administra&ccedil;&atilde;o. Outras medidas de seguran&ccedil;a podem ser implementadas, encontrando-se entre elas efectuar a restri&ccedil;&atilde;o do acesso ao web service, de forma a que possa ser chamado apenas a partir da m&aacute;quina onde se encontra a aplica&ccedil;&atilde;o ASP.NET.</p>
<h4>Resumo</h4>
<p style="margin: 0px">A solu&ccedil;&atilde;o aqui apresentada permite efectuar a cria&ccedil;&atilde;o de sites no IIS6 a partir de uma template de site usando uma aplica&ccedil;&atilde;o ASP.NET. &Eacute; uma solu&ccedil;&atilde;o bastante flex&iacute;vel, na medida em que pode ser usada para efectuar o aprovisionamento de sites a partir de qualquer template. Para tal, basta criar um ficheiro xml de metabase de um site, resultado da exporta&ccedil;&atilde;o da configura&ccedil;&atilde;o de um site para ficheiro.</p>
<p><!--EndFragment--></p>
<p>The post <a href="https://blogit.create.pt/miguelisidoro/2006/11/06/aprovisionamento-de-sites-no-iis6-usando-uma-aplicao-asp-net/">Aprovisionamento de sites no IIS6 usando uma aplicação ASP.NET</a> appeared first on <a href="https://blogit.create.pt">Blog IT</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://blogit.create.pt/miguelisidoro/2006/11/06/aprovisionamento-de-sites-no-iis6-usando-uma-aplicao-asp-net/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
