<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://blogs.msdn.com/utility/FeedStylesheets/atom.xsl" media="screen"?><feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en-US"><title type="html">Web Dev &amp;amp; Infra: qual o seu lado?</title><subtitle type="html">Paulo Teixeira escreve sobre Web/IIS para ajudar a desenvolvedores escreverem aplicações mais eficientes e performáticas. Também fala sobre técnicas para identificação e resolução de problemas em aplicações e otimização de infra-estrutura Web.</subtitle><id>http://blogs.msdn.com/b/teixeira/atom.aspx</id><link rel="alternate" type="text/html" href="http://blogs.msdn.com/b/teixeira/" /><link rel="self" type="application/atom+xml" href="http://blogs.msdn.com/b/teixeira/atom.aspx" /><generator uri="http://telligent.com" version="5.6.50428.7875">Telligent Evolution Platform Developer Build (Build: 5.6.50428.7875)</generator><updated>2011-05-28T18:45:19Z</updated><entry><title>Verificando assemblies em modo debug, v2.0 by Rafael &amp; Henrique</title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/b/teixeira/archive/2013/05/22/verificando-assemblies-em-modo-debug-v2-0-by-rafael-amp-henrique.aspx" /><id>http://blogs.msdn.com/b/teixeira/archive/2013/05/22/verificando-assemblies-em-modo-debug-v2-0-by-rafael-amp-henrique.aspx</id><published>2013-05-22T20:48:45Z</published><updated>2013-05-22T20:48:45Z</updated><content type="html">&lt;p&gt;Conversando com dois colegas, o Rafael Marrara e o Henrique da Silva (ambos PFEs de IIS aqui comigo na Microsoft), eles comentaram que fizeram um script muito similar ao que eu havia publicado a algum tempo atrás para identificar aplicações em modo debug. &lt;/p&gt;  &lt;p&gt;O interessante é que eles criaram esse script para resolver um pequeno “side effect” da versão inicial que eu havia escrito: o meu script carregava a DLL via powershell, e por consequência ela ficava bloqueada (durante o tempo de execução do script) não podendo sofrer nenhuma alteração. &lt;/p&gt;  &lt;p&gt;Com isso, se a aplicação fosse recompilada naquele período de tempo, isso poderia gerar um erro. Além disso, a forma de verificar se os assemplies estão compilados em modo debug foi aperfeiçoada e dados adicionais são exibidos. O resultado final ficou muito bom e por isso eu pedi a autorização deles para publicar o script aqui no blog. &lt;/p&gt;  &lt;p&gt;Segue: &lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New"&gt;##&lt;/font&gt;&lt;/p&gt; &lt;font face="Courier New"&gt;&lt;/font&gt;  &lt;p&gt;&lt;font face="Courier New"&gt;if ($args[0] -eq $null) {     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; $path = $(Split-Path $MyInvocation.InvocationName)      &lt;br /&gt; } else {      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; if (Test-Path($args[0])) {      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; $path = $args[0]      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; } else {       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; write-host &amp;quot;O diretório&amp;quot; $args[0] &amp;quot;não existe!&amp;quot;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Break      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; }      &lt;br /&gt; }&lt;/font&gt;&lt;/p&gt; &lt;font face="Courier New"&gt;&lt;/font&gt;  &lt;p&gt;&lt;font face="Courier New"&gt;##&lt;/font&gt;&lt;/p&gt; &lt;font face="Courier New"&gt;&lt;/font&gt;  &lt;p&gt;   &lt;br /&gt;&lt;font face="Courier New"&gt;function Get-DotNetDebuggableAttribute     &lt;br /&gt; {      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; [CmdletBinding()]      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; Param(      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; [Parameter(      &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; Mandatory=$True,      &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; ValueFromPipeline=$True      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; )] [string[]]$files      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; )&lt;/font&gt;&lt;/p&gt; &lt;font face="Courier New"&gt;&lt;/font&gt;  &lt;p&gt;&lt;font face="Courier New"&gt;&amp;#160;&amp;#160;&amp;#160; Begin     &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; $list = @()      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; }&lt;/font&gt;&lt;/p&gt; &lt;font face="Courier New"&gt;&lt;/font&gt;  &lt;p&gt;&lt;font face="Courier New"&gt;&amp;#160;&amp;#160;&amp;#160; Process     &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; foreach ( $filename in $files )      &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; if ( Test-Path $filename )      &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; $file = Get-Item $filename      &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; if ( $file.Extension -eq '.dll' )      &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;&amp;#160;&amp;#160;&amp;#160;&amp;#160; try      &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; {      &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;#160;&amp;#160;&amp;#160;&amp;#160; $assembly = [System.Reflection.Assembly]::Load([System.IO.File]::ReadAllBytes($file.FullName))      &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;#160;&amp;#160;&amp;#160;&amp;#160; $file | Add-Member NoteProperty ImageRuntimeVersion $assembly.ImageRuntimeVersion      &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;#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;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; $modules = $assembly.GetModules($false)      &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;#160;&amp;#160;&amp;#160;&amp;#160; if ($modules.Length -gt 0) {      &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;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; $portableExecutableKinds = New-Object System.Reflection.portableExecutableKinds      &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;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; $imageFileMachine = New-Object System.Reflection.imageFileMachine      &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;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; $modules[0].GetPEKind([ref]$portableExecutableKinds, [ref]$imageFileMachine)&lt;/font&gt;&lt;/p&gt; &lt;font face="Courier New"&gt;&lt;/font&gt;  &lt;p&gt;&lt;font face="Courier New"&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;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; $file | Add-Member NoteProperty PortableExecutableKinds $portableExecutableKinds     &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;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; $file | Add-Member NoteProperty ImageFileMachine $imageFileMachine&lt;/font&gt;&lt;/p&gt; &lt;font face="Courier New"&gt;&lt;/font&gt;  &lt;p&gt;&lt;font face="Courier New"&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;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Switch($portableExecutableKinds.ToString().Split(',').Trim()){     &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;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;quot;Required32Bit&amp;quot; {$platformTarget = &amp;quot;x86&amp;quot;}      &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;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;quot;PE32Plus&amp;quot; {$platformTarget = &amp;quot;x64&amp;quot;}      &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;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;quot;ILOnly&amp;quot; {$platformTarget = &amp;quot;Any CPU&amp;quot;}      &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;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; default {$platformTarget = &amp;quot;Unknown&amp;quot;}      &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;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/font&gt;&lt;/p&gt; &lt;font face="Courier New"&gt;&lt;/font&gt;  &lt;p&gt;&lt;font face="Courier New"&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;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; $file | Add-Member NoteProperty PlatformTarget $platformTarget&lt;/font&gt;&lt;/p&gt; &lt;font face="Courier New"&gt;&lt;/font&gt;  &lt;p&gt;&lt;font face="Courier New"&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;#160;&amp;#160;&amp;#160;&amp;#160; } else {     &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;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; $file | Add-Member NoteProperty PortableExecutableKinds $null      &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;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; $file | Add-Member NoteProperty ImageFileMachine $null      &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;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; $file | Add-Member NoteProperty PlatformTarget $null      &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;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/font&gt;&lt;/p&gt; &lt;font face="Courier New"&gt;&lt;/font&gt;  &lt;p&gt;&lt;font face="Courier New"&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;#160;&amp;#160;&amp;#160;&amp;#160; $attrs = $assembly.GetCustomAttributes([System.Type]::GetType(&amp;quot;System.Diagnostics.DebuggableAttribute&amp;quot;), 0)     &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;#160;&amp;#160;&amp;#160;&amp;#160; if ($attrs.Count -eq 1) {       &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;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; $attr = $attrs[0]      &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;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; $file | Add-Member NoteProperty IsJITTrackingEnabled $attr.IsJITTrackingEnabled      &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;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; $file | Add-Member NoteProperty IsJITOptimizerDisabled $attr.IsJITOptimizerDisabled      &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;#160;&amp;#160;&amp;#160;&amp;#160; } else {      &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;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; $file | Add-Member NoteProperty IsJITTrackingEnabled $null      &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;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; $file | Add-Member NoteProperty IsJITOptimizerDisabled $null      &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;#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;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; $list += $file      &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; }      &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; catch      &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; {      &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;#160;&amp;#160;&amp;#160;&amp;#160; Write-Debug &amp;quot;Error trying to access the file using System.Reflection.Assembly&amp;quot;      &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;#160;&amp;#160;&amp;#160;&amp;#160; Write-Debug &amp;quot;Error: $_&amp;quot;      &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; }      &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; }      &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; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; }&lt;/font&gt;&lt;/p&gt; &lt;font face="Courier New"&gt;&lt;/font&gt;  &lt;p&gt;&lt;font face="Courier New"&gt;&amp;#160;&amp;#160;&amp;#160; End     &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; if ( $list.Count -gt 0 )      &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; #Write-Output $list | Format-Table Mode, LastWriteTime, Length, Name, IsJITOptimizerDisabled, IsJITTrackingEnabled -AutoSize      &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; return $list      &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; }      &lt;br /&gt; }&lt;/font&gt;&lt;/p&gt; &lt;font face="Courier New"&gt;&lt;/font&gt;  &lt;p&gt;&lt;font face="Courier New"&gt;get-childitem $path -Recurse -include *.dll | Get-DotNetDebuggableAttribute | Format-Table LastWriteTime, Name, ImageRuntimeVersion, PlatformTarget, IsJITOptimizerDisabled -AutoSize&lt;/font&gt;    &lt;br /&gt;&lt;/p&gt;  &lt;p&gt;Lembrando que este script não é suportado de forma alguma pela Microsoft, use por sua conta e risco. &lt;/p&gt;  &lt;p&gt;PS: ele não faz nenhuma alteração no seu ambiente, e portanto, não deveria causar problemas. De qualquer forma, eu recomendo utilizado em ambientes de teste, homologação ou pré-produção.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;abraços,&lt;/p&gt;  &lt;p&gt;Paulo.&amp;#160; &lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10420714" width="1" height="1"&gt;</content><author><name>Paulo Teixeira - MSFT</name><uri>http://blogs.msdn.com/paulo_5F00_teixeira/ProfileUrlRedirect.ashx</uri></author></entry><entry><title>Como resolver o erro “Request is not available in this context”</title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/b/teixeira/archive/2013/02/20/como-resolver-o-erro-request-is-not-available-in-this-context.aspx" /><id>http://blogs.msdn.com/b/teixeira/archive/2013/02/20/como-resolver-o-erro-request-is-not-available-in-this-context.aspx</id><published>2013-02-20T17:42:00Z</published><updated>2013-02-20T17:42:00Z</updated><content type="html">&lt;table style="width: 560px;" border="0" cellspacing="0" cellpadding="2"&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td valign="top" width="560"&gt;
&lt;h4&gt;&lt;em&gt;&lt;/em&gt;&amp;nbsp;&lt;/h4&gt;
&lt;p&gt;Voc&amp;ecirc; est&amp;aacute; trabalhando para migrar uma aplica&amp;ccedil;&amp;atilde;o .NET do IIS6 para o IIS 7.x/8 e ap&amp;oacute;s fazer toda a configura&amp;ccedil;&amp;atilde;o imediatamente no primeiro acesso j&amp;aacute; recebe a seguinte mensagem de erro:&lt;/p&gt;
&lt;blockquote&gt;
&lt;h4&gt;&lt;em&gt;Request is not available in this context&lt;/em&gt;&lt;/h4&gt;
&lt;p&gt;&lt;strong&gt;Description: &lt;/strong&gt;An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Exception Details: &lt;/strong&gt;System.Web.HttpException: Request is not available in this context&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Logo abaixo voc&amp;ecirc; poder&amp;aacute; encontrar detalhes adicionais (linha onde ocorreu o erro) al&amp;eacute;m de uma pilha similar ao seguinte:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;[HttpException (0x80004005): Request is not available in this context]&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;System.Web.HttpContext.get_Request() +3467061&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="background-color: #ffff00;"&gt;ASP.global_asax.Application_Start&lt;/span&gt;(Object source, &lt;br /&gt;EventArgs e) in c:\inetpub\wwwroot\global.asax:5&lt;/p&gt;
&lt;p&gt;[HttpException (0x80004005): Request is not available in this context]&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;System.Web.HttpApplicationFactory.EnsureAppStartCalledForIntegratedMode(&amp;hellip;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;span style="font-family: Segoe UI;"&gt;Como podemos observar, o erro foi gerado no m&amp;oacute;dulo/m&amp;eacute;todo ASP.global_asax.Application_Start da aplica&amp;ccedil;&amp;atilde;o. Este &amp;eacute; um problema conhecido quando se faz a migra&amp;ccedil;&amp;atilde;o de aplica&amp;ccedil;&amp;otilde;es ASP.NET do IIS6 para vers&amp;otilde;es superiores, e est&amp;aacute; descrito no seguinte blog: &lt;a title="http://mvolo.com/iis7-integrated-mode-request-is-not-available-in-this-context-exception-in-applicationstart" href="http://mvolo.com/iis7-integrated-mode-request-is-not-available-in-this-context-exception-in-applicationstart"&gt;http://mvolo.com/iis7-integrated-mode-request-is-not-available-in-this-context-exception-in-applicationstart&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Para resolver o problema voc&amp;ecirc; precisar&amp;aacute; solicitar ao desenvolvedor que abra o arquivo GLOBAL.ASAX.CS (ou .VB) da aplica&amp;ccedil;&amp;atilde;o e localize, dentro do m&amp;eacute;todo ApplicationStart() qualquer uso do objeto HttpContext.Current.Request. Em geral voc&amp;ecirc; encontrar&amp;aacute; algo como:&lt;/p&gt;
&lt;p&gt;str = HttpContext.Current.Request.QueryString["key"];&lt;/p&gt;
&lt;p&gt;Ser&amp;aacute; necess&amp;aacute;rio remover este c&amp;oacute;digo substituindo-o por algum outro mecanismo. A explica&amp;ccedil;&amp;atilde;o para este erro &amp;eacute; bem simples: no IIS7 o novo pipeline integrado ir&amp;aacute; executar o m&amp;eacute;todo Application_Start() antes que qualquer request chegue ao servidor, e portanto, o objeto Request n&amp;atilde;o est&amp;aacute; dispon&amp;iacute;vel.&lt;/p&gt;
&lt;p&gt;Um abra&amp;ccedil;o e at&amp;eacute; a pr&amp;oacute;xima,&lt;/p&gt;
&lt;p&gt;PT&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10392322" width="1" height="1"&gt;</content><author><name>Paulo Teixeira - MSFT</name><uri>http://blogs.msdn.com/paulo_5F00_teixeira/ProfileUrlRedirect.ashx</uri></author></entry><entry><title>Tracing de aplicações ASP.NET no IIS 7.x/8</title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/b/teixeira/archive/2013/02/18/tracing-de-aplica-231-245-es-asp-net-no-iis-7-x-8.aspx" /><id>http://blogs.msdn.com/b/teixeira/archive/2013/02/18/tracing-de-aplica-231-245-es-asp-net-no-iis-7-x-8.aspx</id><published>2013-02-18T11:25:00Z</published><updated>2013-02-18T11:25:00Z</updated><content type="html">&lt;table style="width: 560px;" cellspacing="0" cellpadding="0" border="0"&gt;&lt;tbody&gt;     &lt;tr&gt;       &lt;td&gt;         &lt;p&gt;Olá pessoal!&lt;/p&gt;          &lt;p&gt;Poucos desenvolvedores fazem uso de um dos recursos mais interessantes disponíveis para aplicações ASP.NET, a capacidade de criar &lt;em&gt;traces &lt;/em&gt;diretamente a partir do seu código e usá-los para resolver problemas durante a etapa de desenvolvimento.&lt;/p&gt;          &lt;p&gt;O uso de &amp;quot;técnicas para criação de traces&amp;quot; é algo muito comum: lembra-se de ter escrito um bom e velho &amp;quot;Response.Write&amp;quot; em aplicações ASP Clássico para validar se os dados em uma determinada rotina está conforme o esperado? Pois é... era assim no ASP Clássico, em C, C++, etc&lt;/p&gt;          &lt;p&gt;Nas aplicações ASP.NET este processo é realmente muito simples: basta habilitar o registro de entradas de trace no arquivo web.config, adicionando a seguinte tag:&lt;/p&gt;          &lt;p style="padding-left: 30px;"&gt;&lt;span style="font-family: courier new,courier;"&gt;&amp;lt;trace enabled=&amp;quot;true&amp;quot; localOnly=&amp;quot;false&amp;quot; pageOutput=&amp;quot;false&amp;quot; /&amp;gt;&lt;/span&gt;&lt;/p&gt;          &lt;p&gt;Maiores detalhes sobre a diretiva &amp;lt;trace&amp;gt; do arquivo web.config pode ser obtida em: &lt;a href="http://msdn.microsoft.com/en-us/library/6915t83k(v=vs.80).aspx"&gt;http://msdn.microsoft.com/en-us/library/6915t83k(v=vs.80).aspx&lt;/a&gt;&lt;/p&gt;          &lt;p&gt;Com a diretiva trace configurada no seu arquivo web.config agora basta adicionar as diretivas de trace em sua aplicação. O desenvolvedor deverá adicionar algumas linhas de código na sua aplicação, para &lt;em&gt;imprimir &lt;/em&gt;os valores que precisam ser validados. Para isso, em cada modulo que se deseja utilizer o trace, deve-se adicionar o namespace System.Web. Um exemplo simples do uso de trace em uma página ASP.NET (em C# e .NET Framework 4.5) é mostrado a seguir:&lt;/p&gt;          &lt;p&gt;&lt;span style="font-family: courier new,courier; font-size: small;"&gt;using System;&lt;/span&gt;            &lt;br /&gt;&lt;span style="font-family: courier new,courier; font-size: small;"&gt;using System.Collections.Generic;&lt;/span&gt;            &lt;br /&gt;&lt;span style="font-family: courier new,courier; font-size: small;"&gt;using System.Web;&lt;/span&gt;            &lt;br /&gt;&lt;span style="font-family: courier new,courier; font-size: small;"&gt;using System.Web.UI;&lt;/span&gt;            &lt;br /&gt;&lt;span style="font-family: courier new,courier; font-size: small;"&gt;using System.Web.UI.WebControls;&lt;/span&gt;&lt;/p&gt;          &lt;p&gt;&lt;font face="Courier New"&gt;&lt;/font&gt;&lt;/p&gt;          &lt;p&gt;&lt;span style="font-family: courier new,courier; font-size: small;"&gt;namespace TraceSample&lt;/span&gt;            &lt;br /&gt;&lt;span style="font-family: courier new,courier; font-size: small;"&gt;{&lt;/span&gt;            &lt;br /&gt;&lt;span style="font-family: courier new,courier; font-size: small;"&gt;&amp;#160; public partial class LongRunningPage : System.Web.UI.Page&lt;/span&gt;            &lt;br /&gt;&lt;span style="font-family: courier new,courier; font-size: small;"&gt;&amp;#160; {&lt;/span&gt;            &lt;br /&gt;&lt;span style="font-family: courier new,courier; font-size: small;"&gt;&amp;#160;&amp;#160;&amp;#160; protected void Page_Load(object sender, EventArgs e)&lt;/span&gt;            &lt;br /&gt;&lt;span style="font-family: courier new,courier; font-size: small;"&gt;&amp;#160;&amp;#160;&amp;#160; {&lt;/span&gt;            &lt;br /&gt;&lt;span style="font-family: courier new,courier; font-size: small;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; //&lt;/span&gt;            &lt;br /&gt;&lt;span style="font-family: courier new,courier; font-size: small;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; // This is just a page where any GET requests will take... &lt;/span&gt;            &lt;br /&gt;&lt;span style="font-family: courier new,courier; font-size: small;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; // well, very long&lt;/span&gt;&lt;/p&gt;          &lt;p&gt;&lt;font face="Courier New"&gt;&lt;/font&gt;&lt;/p&gt;          &lt;p&gt;&lt;span style="font-family: courier new,courier; font-size: small;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;font color="#ff0000"&gt;Trace.Warn(&amp;quot;Warning! Entering in the PAGE_LOAD event&amp;quot;);&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;          &lt;p&gt;&lt;font face="Courier New"&gt;&lt;/font&gt;&lt;/p&gt;          &lt;p&gt;&lt;span style="font-family: courier new,courier; font-size: small;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; DateTime start = DateTime.Now;&lt;/span&gt;            &lt;br /&gt;&lt;span style="font-family: courier new,courier; font-size: small;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; int delay = new Random().Next(5000, 15000);&lt;/span&gt;            &lt;br /&gt;&lt;span style="font-family: courier new,courier; font-size: small;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Thread.Sleep(delay);&lt;/span&gt;&lt;/p&gt;          &lt;p&gt;&lt;font face="Courier New"&gt;&lt;/font&gt;&lt;/p&gt;          &lt;p&gt;&lt;span style="font-family: courier new,courier; font-size: small;"&gt; DateTime end = DateTime.Now;&lt;/span&gt;            &lt;br /&gt;&lt;span style="font-family: courier new,courier; font-size: small;"&gt; myLabel.Text = String.Format(&amp;quot;Total page exec took:{0} ms&amp;quot;, (end - start).TotalMilliseconds);&lt;/span&gt;&lt;/p&gt;          &lt;p&gt;&lt;font face="Courier New"&gt;&lt;/font&gt;&lt;/p&gt;          &lt;p&gt;&lt;span style="font-family: courier new,courier; font-size: small;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;font color="#ff0000"&gt;Trace.Write(&amp;quot;PAGE_LOAD event finished&amp;quot;);&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;          &lt;p&gt;&lt;font face="Courier New"&gt;&lt;/font&gt;&lt;/p&gt;          &lt;p&gt;&lt;span style="font-family: courier new,courier; font-size: small;"&gt;&amp;#160;&amp;#160;&amp;#160; }&lt;/span&gt;            &lt;br /&gt;&lt;span style="font-family: courier new,courier; font-size: small;"&gt;&amp;#160; }&lt;/span&gt;            &lt;br /&gt;&lt;span style="font-family: courier new,courier; font-size: small;"&gt;}&lt;/span&gt;&lt;/p&gt;          &lt;p&gt;No código acima você encontra duas diretivas: Trace.Warn e Trace.Write ... existem poucas diferenças entre elas, a mais visível é que a primeira irá produzir uma entrada em vermelho na saída do trace. &lt;/p&gt;          &lt;p&gt;Uma vez que o código da aplicação tenha sido ajustado para criar a saída necessária, você poderá acessar a página e testar a sua aplicação. Após ter executado a página, você poderá visualizar o resultado do trace através do handler TRACE.AXD. Por exemplo, se a página chama-se LongRunning.aspx., você deve primeiro chamar: &lt;/p&gt;          &lt;p&gt;&lt;a href="http://meusite/LongRunning.aspx"&gt;http://meusite/LongRunning.aspx&lt;/a&gt; &lt;/p&gt;          &lt;p&gt;e depois:&lt;/p&gt;          &lt;p&gt;&lt;a href="http://meusite/trace.axd"&gt;http://meusite/trace.axd&lt;/a&gt; &lt;/p&gt;          &lt;p&gt;Com isso, uma página de trace similar ao seguinte sera exibida: &lt;/p&gt;          &lt;p&gt;&amp;#160;&lt;/p&gt;          &lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-40-37-metablogapi/1856.image_5F00_10B42851.png"&gt;&lt;img title="image" style="border: 0px currentcolor; display: inline; background-image: none;" border="0" alt="image" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-40-37-metablogapi/5756.image_5F00_thumb_5F00_6EE84FBF.png" width="512" height="143" /&gt;&lt;/a&gt;&lt;/p&gt;          &lt;p&gt;Ao se clicar em uma das entradas você poderá observer detalhes do trace daquela página, algo similar ao seguinte:&lt;/p&gt;          &lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-40-37-metablogapi/0451.image_5F00_5AEEBD29.png"&gt;&lt;img title="image" style="border: 0px currentcolor; display: inline; background-image: none;" border="0" alt="image" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-40-37-metablogapi/3666.image_5F00_thumb_5F00_7F9FD4A0.png" width="509" height="363" /&gt;&lt;/a&gt;&lt;/p&gt;          &lt;p&gt;Acima podemos ver o resultado das diretivas de trace que foram adicionadas no código da aplicação. Voilá! &lt;/p&gt;          &lt;p&gt;Agora, o mais um ponto: É possível visualizar o resultado das diretivas Trace.Warn nos logs FREB (ou Failed Request Tracing) do IIS. Basta configurar o seu servidor para gerar este tipo de log (conforme as regras que você estabelecer) e ao visualizá-lo você encontrará as saídas geradas pelo seu aplicativo.&amp;#160; Esta é a outra diferença entre as duas diretivas: Trace.Write não irá aparecer nos logs do IIS, e portanto, se precisar usar este recurso de uma forma regular, use somente o Trace.Warn.&lt;/p&gt;          &lt;p&gt;E finalmente, aquela dica de sempre: não deixe as diretivas de trace habilitadas em servidores de produção! Sempre podem existir questões relacionadas à segurança de sua aplicação e não custa descuidar! &lt;/p&gt;          &lt;p&gt;É isso ai! Não perca tempo e aproveite para usar este recurso durante o processo de desenvolvimento da sua aplicação. &lt;/p&gt;          &lt;p&gt;&amp;#160;&lt;/p&gt;          &lt;p&gt;Abraços, &lt;/p&gt;          &lt;p&gt;PT&lt;/p&gt;       &lt;/td&gt;     &lt;/tr&gt;   &lt;/tbody&gt;&lt;/table&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10392301" width="1" height="1"&gt;</content><author><name>Paulo Teixeira - MSFT</name><uri>http://blogs.msdn.com/paulo_5F00_teixeira/ProfileUrlRedirect.ashx</uri></author><category term="ASP.NET" scheme="http://blogs.msdn.com/b/teixeira/archive/tags/ASP-NET/" /><category term=".NET" scheme="http://blogs.msdn.com/b/teixeira/archive/tags/-NET/" /><category term="IIS" scheme="http://blogs.msdn.com/b/teixeira/archive/tags/IIS/" /></entry><entry><title>Qual a diferença entre Web Site Project e Web Application Project no Visual Studio?</title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/b/teixeira/archive/2013/02/12/qual-a-diferen-231-a-entre-web-site-project-e-web-application-project-no-visual-studio.aspx" /><id>http://blogs.msdn.com/b/teixeira/archive/2013/02/12/qual-a-diferen-231-a-entre-web-site-project-e-web-application-project-no-visual-studio.aspx</id><published>2013-02-12T23:50:00Z</published><updated>2013-02-12T23:50:00Z</updated><content type="html">&lt;table style="width: 560px;" cellspacing="0" cellpadding="0" border="0"&gt;&lt;tbody&gt;     &lt;tr&gt;       &lt;td&gt;         &lt;p&gt;Faz um tempo um cliente me perguntou a diferença entre Web Site e Web Application.De início eu nem tinha entendido direito a pergunta, mas depois ficou claro a dúvida: a questão estava relacionada aos tipos de projeto disponíveis no Visual Studio.&lt;/p&gt;          &lt;p&gt;No Visual Studio, você pode escolher entre dois tipos de projetos Web: &lt;em&gt;Web Site Project (WSP)&lt;/em&gt; ou o &lt;em&gt;Web Application Project (WAP)&lt;/em&gt;.&lt;/p&gt;          &lt;p&gt;A grande diferença entre estes dois tipos de projeto é a forma que ocorre o &lt;em&gt;deployment &lt;/em&gt;da aplicação. Em um Web Site Project o Visual Studio irá fazer a publicação de todos os arquivos do projeto (incluíndo o código-fonte da sua aplicação). Já em um Web Application Project somente será publicado o código HTML (markup) e o código &lt;strong&gt;compilado &lt;/strong&gt;da sua aplicação. &lt;/p&gt;          &lt;p&gt;Em outras palavras, em um Web Application Project o Visual Studio irá se encarregar de compilar a sua aplicação, gerando vários binarios dentro da pasta /BIN. Ao se fazer a publicação somente estes arquivos serão colocados no servidor Web.&amp;#160; &lt;/p&gt;          &lt;p&gt;Existem prós e contras para cada um dos tipos de projeto, mas eu pessoalmente sou muito mais a favor do uso de Web Application Projects, por um fator muito simples: você evita que o código-fonte fique visível no servidor Web (ponto para a questão de segurança), e também evita que o servidor Web fique responsável pela compilação da aplicação durante o primeiro acesso (uma outra hora faço&amp;#160; um post com mais detalhes sobre isso).&lt;/p&gt;          &lt;p&gt;Uma comparação mais detalhada entre estes dois tipos de projeto pode ser encontrada em&amp;#160; &lt;a href="http://msdn.microsoft.com/en-us/library/aa730880%28VS.80%29.aspx#wapp_topic5"&gt;http://msdn.microsoft.com/en-us/library/aa730880(VS.80).aspx#wapp_topic5&lt;/a&gt; (em inglês)&lt;/p&gt;          &lt;p&gt;[]s           &lt;br /&gt;PT &lt;/p&gt;       &lt;/td&gt;     &lt;/tr&gt;   &lt;/tbody&gt;&lt;/table&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10392400" width="1" height="1"&gt;</content><author><name>Paulo Teixeira - MSFT</name><uri>http://blogs.msdn.com/paulo_5F00_teixeira/ProfileUrlRedirect.ashx</uri></author><category term="ASP.NET" scheme="http://blogs.msdn.com/b/teixeira/archive/tags/ASP-NET/" /><category term="Visual Studio" scheme="http://blogs.msdn.com/b/teixeira/archive/tags/Visual+Studio/" /></entry><entry><title>Como fazer Interop de componentes COM+ 32bits em aplicações .NET 64bits</title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/b/teixeira/archive/2013/02/11/como-fazer-interop-de-componentes-com-32bits-em-aplica-231-245-es-net-64bits.aspx" /><id>http://blogs.msdn.com/b/teixeira/archive/2013/02/11/como-fazer-interop-de-componentes-com-32bits-em-aplica-231-245-es-net-64bits.aspx</id><published>2013-02-11T10:00:00Z</published><updated>2013-02-11T10:00:00Z</updated><content type="html">&lt;table style="width: 599px;" border="0" cellspacing="0" cellpadding="2"&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td valign="top" width="597"&gt;
&lt;p&gt;Ol&amp;aacute; pessoal! Imagine o seguinte cen&amp;aacute;rio:&lt;/p&gt;
&lt;p&gt;Voc&amp;ecirc; possui uma aplica&amp;ccedil;&amp;atilde;o antiga constru&amp;iacute;da em ASP.NET mas que por algum motivo espec&amp;iacute;fico ainda usa componentes COM atrav&amp;eacute;s de Interop.&lt;/p&gt;
&lt;p&gt;Este, apesar de n&amp;atilde;o desejado, &amp;eacute; um cen&amp;aacute;rio muito comum, em particular em ambientes corporativos: muitas vezes os componentes COM foram constru&amp;iacute;dos em VB6 ou VC++ e encapsulam regras de neg&amp;oacute;cio que n&amp;atilde;o mudaram. Como as &amp;aacute;reas de TI nem sempre possuem or&amp;ccedil;amento para fazer a convers&amp;atilde;o deste c&amp;oacute;digo para uma linguagem .NET como o Visual Basic.NET ou C#, esses componentes costumam ser usados por um logo per&amp;iacute;odo de tempo, at&amp;eacute; que um novo projeto substitua inteiramente a aplica&amp;ccedil;&amp;atilde;o.&lt;/p&gt;
&lt;p&gt;Agora, imagine que a &amp;aacute;rea de TI da empresa resolve evoluir a plataforma Web para as vers&amp;otilde;es mais recentes do Windows Server, s&amp;oacute; dispon&amp;iacute;veis em 64-bits. Para este cen&amp;aacute;rio sempre existe a possibilidade de rodar os Application Pools do IIS 7.x (e superior) em modo 32-bits, mas seria desej&amp;aacute;vel que asp aplica&amp;ccedil;&amp;otilde;es ASP.NET pudessem explorar o m&amp;aacute;ximo da nova plataforma, com o poder total da arquitetura 64-bits. Mas ai, surge o problema dos velhos componentes VB6 32-bits. Por padr&amp;atilde;o, n&amp;atilde;o &amp;eacute; poss&amp;iacute;vel carregar uma DLL (Componente COM) 32-bits em um processo (Application Pool) 64-bits. O que fazer???&lt;/p&gt;
&lt;p&gt;Uma forma simples de continuar utilizando o c&amp;oacute;digo legado desses componentes COM de 32-bits sem custo extra &amp;eacute; passar a us&amp;aacute;-los no COM+ (Component Services). Basta seguir os seguintes passos:&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Primeiro, se voc&amp;ecirc; tiver registrado a DLL do seu componente no seu Windows x64, voc&amp;ecirc; ter&amp;aacute; que desfazer este processo. Execute o comando &amp;ldquo;regsvr32 /u &amp;lt;path_e_nome_da_dll&amp;gt;&amp;rdquo;&lt;/li&gt;
&lt;li&gt;V&amp;aacute; no &lt;em&gt;Control Panel / Administrative Tools/ Component Services&lt;/em&gt;. Depois, no treeview abra &lt;em&gt;My Computer&lt;/em&gt;, e ent&amp;atilde;o &lt;em&gt;COM+ Applications&lt;/em&gt;. Clique com o bot&amp;atilde;o direito e selecione &amp;ldquo;&lt;em&gt;New &amp;ndash;&amp;gt; Application&lt;/em&gt;&amp;rdquo;&lt;/li&gt;
&lt;li&gt;Na tela &amp;ldquo;&lt;em&gt;Welcome to the COM Application Install Wizard&lt;/em&gt;&amp;rdquo; clique em &amp;ldquo;&lt;em&gt;Next &amp;gt;&lt;/em&gt;&amp;rdquo;.&lt;/li&gt;
&lt;li&gt;Selecione o bot&amp;atilde;o &amp;ldquo;&lt;em&gt;Create an Empty Application&lt;/em&gt;&amp;rdquo;.&lt;/li&gt;
&lt;li&gt;D&amp;ecirc; um nome para a sua aplica&amp;ccedil;&amp;atilde;o (qualquer nome serve, mas &amp;eacute; bom colocar algo que lembre o nome do componente que ser&amp;aacute; executado). Depois entre &amp;ldquo;&lt;em&gt;Library / Server&lt;/em&gt;&amp;rdquo;, selecione o tipo &amp;ldquo;&lt;em&gt;Server&lt;/em&gt;&amp;rdquo;.&lt;/li&gt;
&lt;li&gt;Clique em &amp;ldquo;&lt;em&gt;Next &amp;gt;&lt;/em&gt;&amp;rdquo; e depois&amp;nbsp; &amp;ldquo;&lt;em&gt;This User&amp;rdquo;&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;Selecione o usu&amp;aacute;rio com o qual o componente ser&amp;aacute; executado. Pode ser um usu&amp;aacute;rio de dom&amp;iacute;nio previamente criado para executar o componente ou um dos usu&amp;aacute;rios de sistema existentes (NOTA: escolha o usu&amp;aacute;rio tentando manter o mais seguro poss&amp;iacute;vel; evite LOCAL SYSTEM pois o mesmo tem direitos de administrador no Sistema Operacional, a menos que isso seja um pr&amp;eacute;-requisito da aplica&amp;ccedil;&amp;atilde;o).&lt;/li&gt;
&lt;li&gt;Depois pressione &amp;ldquo;&lt;em&gt;Next &amp;gt;&lt;/em&gt;&amp;rdquo; nas telas seguintes (n&amp;atilde;o altere nada), at&amp;eacute; concluir a cria&amp;ccedil;&amp;atilde;o da aplica&amp;ccedil;&amp;atilde;o. &lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-40-37-metablogapi/7573.image_5F00_18BCCED4.png"&gt;&lt;img style="float: right; display: inline; background-image: none;" title="image" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-40-37-metablogapi/1205.image_5F00_thumb_5F00_703DECBF.png" alt="image" width="219" height="299" align="right" border="0" /&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;O pr&amp;oacute;ximo passo &amp;eacute; adicionar o seu componente a esta aplica&amp;ccedil;&amp;atilde;o rec&amp;eacute;m-criada. Voc&amp;ecirc; encontrar&amp;aacute; a aplica&amp;ccedil;&amp;atilde;o em &lt;em&gt;Component Services -&amp;gt; Computers -&amp;gt; My Computer -&amp;gt; COM+ Application &lt;/em&gt;. Clique no &amp;iacute;cone &amp;ldquo;+&amp;rdquo; e voc&amp;ecirc; ver&amp;aacute; um item &amp;ldquo;&lt;em&gt;Components&lt;/em&gt;&amp;rdquo;. Selecione este item.&lt;/li&gt;
&lt;li&gt;Usando o Windows Explorer, arraste a DLL para a janela &amp;agrave; direita na tela em &amp;ldquo;&lt;em&gt;Components&lt;/em&gt;&amp;rdquo;. Com isso o componente ser&amp;aacute; registrado automaticamente no Component Services. Aparecer&amp;aacute; um &amp;iacute;cone de forma circular e de cor amarelada que representa o Componente rec&amp;eacute;m-instalado.&lt;/li&gt;
&lt;li&gt;Em seguida v&amp;aacute; em &lt;em&gt;Component Services -&amp;gt; Computers -&amp;gt; My Computer -&amp;gt; COM+ Application&lt;/em&gt; e selecione sua aplica&amp;ccedil;&amp;atilde;o. Clique com o bot&amp;atilde;o direito e abra as propriedades selecionando &amp;ldquo;&lt;em&gt;Properties&lt;/em&gt;&amp;rdquo; no menu de contexto.&lt;/li&gt;
&lt;li&gt;&lt;span style="background-color: #ffff00;"&gt;Clique na guia &amp;ldquo;&lt;em&gt;Security&lt;/em&gt;&amp;rdquo; e em &amp;ldquo;&lt;em&gt;Authorization&lt;/em&gt;&amp;rdquo; desmarque a op&amp;ccedil;&amp;atilde;o &amp;ldquo;&lt;em&gt;Enforce access checks for this application&lt;/em&gt;&amp;rdquo;. &lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="background-color: #ffff00;"&gt;Em &amp;ldquo;&lt;em&gt;Security Level&lt;/em&gt;&amp;rdquo; marque a op&amp;ccedil;&amp;atilde;o &amp;ldquo;&lt;em&gt;Perform access checks only at the process level&lt;/em&gt;.&amp;rdquo; &lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="background-color: #ffff00;"&gt;Tamb&amp;eacute;m garanta que &amp;ldquo;&lt;em&gt;Apply restriction policy&lt;/em&gt;&amp;rdquo; est&amp;aacute; desmarcado.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="background-color: #ffff00;"&gt;Configure o &amp;ldquo;&lt;em&gt;Impersonate Level&lt;/em&gt;&amp;rdquo; para &amp;ldquo;&lt;em&gt;Anonymous&lt;/em&gt;&amp;rdquo;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;O &amp;uacute;ltimo passo ser&amp;aacute; garantir que o usu&amp;aacute;rio que roda o Application Pool poder&amp;aacute; utilizar o seu componente. Para isso, em COM+ &lt;em&gt;Application &amp;ndash;&amp;gt; &amp;lt;Nome_da_sua_aplicacao&amp;gt; -&amp;gt; Roles -&amp;gt; CreateOwner &amp;ndash;&amp;gt; Users&lt;/em&gt; voc&amp;ecirc; dever&amp;aacute; adicionar o usu&amp;aacute;rio do IIS (em geral IUSR) ou o grupo IIS_USRS (para o IIS 7.X/8).&lt;/li&gt;
&lt;li&gt;
&lt;div align="left"&gt;Tamb&amp;eacute;m garanta que a pasta onde est&amp;aacute; instalado o componente esteja com permiss&amp;otilde;es NTFS que permitam ao usu&amp;aacute;rio do Application Pool possa ler o arquivo do componente. Em geral &amp;eacute; suficiente adicionar a permiss&amp;atilde;o de Execu&amp;ccedil;&amp;atilde;o nesta pasta para o grupo IIS_USRS.&lt;/div&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;div align="center"&gt;
&lt;table style="width: 560px;" border="0" cellspacing="0" cellpadding="5" bgcolor="#eeeeee"&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td valign="top" width="560"&gt;
&lt;p align="left"&gt;&lt;span style="color: #ff0000;"&gt;NOTAS: &lt;/span&gt;&lt;/p&gt;
&lt;p align="left"&gt;&lt;span style="color: #ff0000;"&gt;a) As configura&amp;ccedil;&amp;otilde;es de seguran&amp;ccedil;a do componente (em amarelo acima) podem variar, se o mesmo necessitar personificar o usu&amp;aacute;rio (i.e. rodar sobre o contexto de um outro usu&amp;aacute;rio, por exemplo, para acessar um banco de dados ou outro recurso externo). &lt;br /&gt;&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;b) Se estiver usando o Pipeline Classico do IIS 7.x talvez seja necess&amp;aacute;rio adicionar tamb&amp;eacute;m o usu&amp;aacute;rio IUSR e IWAM quando estiver atribuindo as permiss&amp;otilde;es no Component Services e nas permiss&amp;otilde;es NTFS da pasta.&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;p align="center"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Agora basta testar a sua aplica&amp;ccedil;&amp;atilde;o. Configure o Application Pool para rodar em modo 64bits e fa&amp;ccedil;a o teste: a aplica&amp;ccedil;&amp;atilde;o, mesmo usando componentes antigos escritos em VB6 dever&amp;aacute; executar sem problemas.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;At&amp;eacute; a pr&amp;oacute;xima!&lt;/p&gt;
&lt;p&gt;PT&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10392313" width="1" height="1"&gt;</content><author><name>Paulo Teixeira - MSFT</name><uri>http://blogs.msdn.com/paulo_5F00_teixeira/ProfileUrlRedirect.ashx</uri></author><category term="ASP.NET" scheme="http://blogs.msdn.com/b/teixeira/archive/tags/ASP-NET/" /><category term=".NET" scheme="http://blogs.msdn.com/b/teixeira/archive/tags/-NET/" /><category term="IIS" scheme="http://blogs.msdn.com/b/teixeira/archive/tags/IIS/" /></entry><entry><title>Varrendo a poeira!</title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/b/teixeira/archive/2013/02/09/varrendo-a-poeira.aspx" /><id>http://blogs.msdn.com/b/teixeira/archive/2013/02/09/varrendo-a-poeira.aspx</id><published>2013-02-09T18:00:01Z</published><updated>2013-02-09T18:00:01Z</updated><content type="html">&lt;table cellspacing="0" cellpadding="2" width="560" border="0"&gt;&lt;tbody&gt;     &lt;tr&gt;       &lt;td valign="top" width="560"&gt;         &lt;p&gt;Olá pessoal! &lt;/p&gt;          &lt;p&gt;Esse é só um post daqueles que a gente escreve para dizer que está fazendo uma faxina na casa. Aproveitando a inspiração de ontem,&amp;#160; acabei fazendo uns updates nos posts antigos sobre ARR (pouca coisa, somente umas referências atualizadas e algumas informações adicionais para deixar o conteúdo mais claro). &lt;/p&gt;          &lt;p&gt;Também devo iniciar uma série de posts sobre assuntos diversos, boa parte deles com foco em problemas que ocorrem durante a migração de aplicações de IIS5/6 (32bits) para IIS 7.x/8. &lt;/p&gt;          &lt;p&gt;A gente se vê em breve! &lt;/p&gt;          &lt;p&gt;&amp;#160;&lt;/p&gt;          &lt;p&gt;[]s           &lt;br /&gt;PT&lt;/p&gt;       &lt;/td&gt;     &lt;/tr&gt;   &lt;/tbody&gt;&lt;/table&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10392381" width="1" height="1"&gt;</content><author><name>Paulo Teixeira - MSFT</name><uri>http://blogs.msdn.com/paulo_5F00_teixeira/ProfileUrlRedirect.ashx</uri></author></entry><entry><title>Monitorando aplicações COM+</title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/b/teixeira/archive/2013/02/08/monitorando-aplica-231-245-es-com.aspx" /><id>http://blogs.msdn.com/b/teixeira/archive/2013/02/08/monitorando-aplica-231-245-es-com.aspx</id><published>2013-02-08T18:27:38Z</published><updated>2013-02-08T18:27:38Z</updated><content type="html">&lt;p&gt;Já faz um tempo que não publico nada, mas esta semana um outro colega esteve trabalhando num caso muito interessante. Ele estava fazendo o diagnóstico de uma aplicação Web que havia sido migrada para o Windows 2008 R2. &lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-40-37-metablogapi/8836.clip_5F00_image001_5F00_3CE5D031.jpg"&gt;&lt;img title="clip_image001" style="float: right; display: inline; background-image: none;" border="0" alt="clip_image001" align="right" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-40-37-metablogapi/6758.clip_5F00_image001_5F00_thumb_5F00_19D55EC1.jpg" width="356" height="311" /&gt;&lt;/a&gt;Esta aplicação usa componentes COM+ e em algum momento, o componente simplesmente travava (cenário típico de Hang).     &lt;br /&gt;Os componentes são antigos, e não se tem o código-fonte dos mesmos. Após muita investigação, descobriu-se que o componente iniciava um outro processo no Windows para realizar uma tarefa específica. Quando o COM+, por algum motivo realizava o RECYCLE do processo DLLHOST.exe onde o componente estava sendo executado, este outro processo permanecia em execução. &lt;/p&gt;  &lt;p&gt;Na próxima chamada ao componente, o mesmo tentava executar o outro processo, mas já havia uma instância em execução e por isso o componente travava. A melhor solução seria reescrever todo o componente de forma que o mesmo utilize técnicas mais modernas para executar as tarefas a que se propõe, mas infelizmente isso é impossível. &lt;/p&gt;  &lt;p&gt;Neste caso, uma solução de contorno foi necessária. Para eliminar o travamento, bastou desabilitar o RECYCLING da aplicação COM+ no snap-in dos serviços de componente (Component Services). &lt;/p&gt;  &lt;p&gt;Todavia, um novo problema surge com essa abordagem, que é o fato que agora o processo DLLHOST.exe do COM+ poderá travar em função de algum outro mau comportamento ou até mesmo devido ao processo natural de fragmentação de memória (outro dia faço um post sobre isso). &lt;/p&gt;  &lt;p&gt;Para minimizar esse problema seria ideal ter uma ferramenta que monitore o comportamento da aplicação COM+ (“AppBugada”, no exemplo da imagem acima) e em caso de consumo de um certo limite de memória virtual, que ela seja automaticamente encerrada. &lt;/p&gt;  &lt;p&gt;Para isso, um script foi usado a fim de monitorar a aplicação COM+. Veja abaixo um exemplo &lt;strong&gt;&lt;u&gt;similar&lt;/u&gt;&lt;/strong&gt; que também pode ser usado para fazer este tipo de objetivo:&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;em&gt;&lt;font style="background-color: rgb(255, 255, 0);" color="#ff0000"&gt;NOTA: Este script é um código-exemplo, use por sua conta e risco. Não oferecemos suporte a este script e não nos responsabilizamos por eventuais consequências adversas devido ao seu uso num ambiente de produção. &lt;/font&gt;&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;    &lt;blockquote&gt;   &lt;p&gt;&lt;font color="#0000ff" face="Courier New"&gt;strComputer = &amp;quot;.&amp;quot;       &lt;br /&gt;strCOMAppName = &amp;quot;AppBugada&amp;quot;        &lt;br /&gt;constMemLimit = 999999999 'Bytes        &lt;br /&gt;constRunning = false        &lt;br /&gt;constCOMAppFound = false&lt;/font&gt;&lt;/p&gt;    &lt;p&gt;     &lt;br /&gt;&lt;font color="#0000ff" face="Courier New"&gt; Set objCOMCatalog = CreateObject(&amp;quot;COMAdmin.COMAdminCatalog&amp;quot;)       &lt;br /&gt; Set objCOMApps = objCOMCatalog.GetCollection(&amp;quot;Applications&amp;quot;)        &lt;br /&gt;objCOMApps.Populate&lt;/font&gt;&lt;/p&gt;    &lt;p&gt;&lt;font color="#0000ff" face="Courier New"&gt;&lt;/font&gt;&lt;/p&gt;    &lt;p&gt;&lt;font color="#0000ff" face="Courier New"&gt;For each objCOMApp in objCOMApps       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; If objCOMApp.Name = strCOMAppName then        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Set objCOMAppInstances = objCOMApps.GetCollection(&amp;quot;ApplicationInstances&amp;quot;,objCOMApp.Key)        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; objCOMAppInstances.Populate        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; For each objCOMInstance in objCOMAppInstances        &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; PID = objCOMInstance.Value(&amp;quot;ProcessID&amp;quot;)        &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; constRunning = not ( objCOMInstance.Value(&amp;quot;IsPaused&amp;quot;) or objCOMInstance.Value(&amp;quot;HasRecycled&amp;quot;))        &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; If constRunning then        &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; Set objWMIService = GetObject(&amp;quot;winmgmts:&amp;quot; _        &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; &amp;quot;{impersonationLevel=impersonate}!\\&amp;quot; _        &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; strComputer &amp;amp; &amp;quot;\root\cimv2&amp;quot;)        &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; Set objProcesses = objWMIService.ExecQuery _        &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;quot;Select * from Win32_Process where ProcessId='&amp;quot; &amp;amp; PID &amp;amp; &amp;quot;'&amp;quot;)        &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; For Each objProcess in objProcesses        &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; Wscript.Echo &amp;quot;Process: &amp;quot; &amp;amp; objProcess.Name        &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; sngProcessTime = (CSng(objProcess.KernelModeTime) + _        &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;#160;&amp;#160;&amp;#160;&amp;#160; CSng(objProcess.UserModeTime)) / 10000000        &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; Wscript.Echo &amp;quot;Processor Time: &amp;quot; &amp;amp; sngProcessTime        &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; Wscript.Echo &amp;quot;Process ID: &amp;quot; &amp;amp; objProcess.ProcessID        &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; Wscript.Echo &amp;quot;Peak Virtual Size: &amp;quot; _        &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; objProcess.PeakVirtualSize        &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; Wscript.Echo &amp;quot;Virtual Size: &amp;quot; _        &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; objProcess.VirtualSize        &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; If objProcess.VirtualSize &amp;gt; constMemLimit then        &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;#160;&amp;#160;&amp;#160;&amp;#160; objProcess.Terminate()        &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; End if        &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; Next        &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; Set objWMIService = nothing        &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; Set objProcesses = nothing        &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; Exit For        &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; Else        &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; Wscript.Echo &amp;quot;COM+ Application not running.&amp;quot;        &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; End if        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Next        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Set objCOMAppInstances = nothing        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; constCOMAppFound = true        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Exit For        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; End if        &lt;br /&gt; Next&lt;/font&gt;&lt;/p&gt;    &lt;p&gt;&lt;font color="#0000ff" face="Courier New"&gt;&lt;/font&gt;&lt;/p&gt;    &lt;p&gt;&lt;font color="#0000ff" face="Courier New"&gt;If constCOMAppFound = false then       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Wscript.Echo &amp;quot;COM+ Application not found.&amp;quot;        &lt;br /&gt;End if&lt;/font&gt;&lt;/p&gt;    &lt;p&gt;&lt;font color="#0000ff" face="Courier New"&gt;&lt;/font&gt;&lt;/p&gt;    &lt;p&gt;&lt;font face="Courier New"&gt;&lt;font color="#0000ff"&gt;Set objCOMApps = nothing         &lt;br /&gt; Set objCOMCatalog = nothing&lt;/font&gt;        &lt;br /&gt;&lt;/font&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;O Script usa a interface COMAdmin para monitorar as aplicações COM+ e classes WMI para coletar informações do processo DLLHOST.exe correspondente. Caso o processo atinja um certo limite de uso de memória virtual, o mesmo será terminado. &lt;/p&gt;  &lt;p&gt;Valeu pessoal e até a próxima. &lt;/p&gt;  &lt;p&gt;PT&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10392241" width="1" height="1"&gt;</content><author><name>Paulo Teixeira - MSFT</name><uri>http://blogs.msdn.com/paulo_5F00_teixeira/ProfileUrlRedirect.ashx</uri></author></entry><entry><title>Localizando assemblies compilados em modo debug</title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/b/teixeira/archive/2011/08/05/localizando-assemblies-compilados-em-modo-debug.aspx" /><id>http://blogs.msdn.com/b/teixeira/archive/2011/08/05/localizando-assemblies-compilados-em-modo-debug.aspx</id><published>2011-08-05T09:26:00Z</published><updated>2011-08-05T09:26:00Z</updated><content type="html">&lt;p&gt;No meu &amp;uacute;ltimo post eu comentei os problemas que pode ocorrer ao se publicar uma aplica&amp;ccedil;&amp;atilde;o Web em modo debug para a produ&amp;ccedil;&amp;atilde;o.&lt;/p&gt;
&lt;p&gt;Com isso, ficou uma d&amp;uacute;vida: como saber se o meu website possui aplica&amp;ccedil;&amp;otilde;es publicadas em modo debug. Uma forma muito simples de verificar isso &amp;eacute; localizar o arquivo web.config e procurar pela diretiva &amp;lt;compilation debug=&amp;rdquo;true&amp;rdquo;&amp;gt;.&lt;/p&gt;
&lt;p&gt;Mas eu vou mostrar uma outra t&amp;eacute;cnica diferente aqui, que se baseia na inspe&amp;ccedil;&amp;atilde;o de cada uma das DLLs contidas nas pastas de conte&amp;uacute;do do seu site.&lt;/p&gt;
&lt;p&gt;Isso porque, eventualmente uma aplica&amp;ccedil;&amp;atilde;o foi compilada em modo debug, e depois cpiada para produ&amp;ccedil;&amp;atilde;o, e ent&amp;atilde;o teve o seu arquivo web.config alterado (ajustado). O que pode ocorrer &amp;eacute; que h&amp;aacute; DLLs em modo debug, mesmo com a diretiva j&amp;aacute; marcada como FALSE.&lt;/p&gt;
&lt;p&gt;Vamos usar um script powershell 2.0 que varre as pastas a partir de um certa pasta, e localiza todos os arquivos .exe e .dll. Depois usamos o namespace System.Reflection.Assembly para verificar se foi compilado em modo debug ou release (atributo isJITTrackingEnabled).&lt;/p&gt;
&lt;p&gt;Se a DLL n&amp;atilde;o for compilada com .NET, ser&amp;aacute; gerada um exce&amp;ccedil;&amp;atilde;o e nada ser&amp;aacute; escrito, caso contr&amp;aacute;rio, uma mensagem com o nome e o atributo debug &amp;eacute; exibido.&amp;nbsp; Veja o c&amp;oacute;digo-exemplo a seguir:&lt;/p&gt;
&lt;table style="width: 100%;" border="1"&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p&gt;&lt;span style="font-family: Courier New; font-size: x-small;" size="2" face="Courier New"&gt;# &lt;br /&gt;# List Assemblies - requires a path &lt;br /&gt;# &lt;br /&gt;PARAM &lt;br /&gt;( &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; [string] $path = ""&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;) &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; # List assemblies&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; "Assemblies using debug mode" &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; $files =&amp;nbsp; dir -recurse -path $path -include "*.dll", "*.exe" &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; foreach($file in $files) &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; { &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; try { &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; $assembly = [System.Reflection.Assembly]::LoadFile($file); &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; $attrib = $assembly.GetCustomAttributes($false) | where-object { $_ -is &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family: Courier New; font-size: x-small;" size="2" face="Courier New"&gt;[System.Diagnostics.DebuggableAttribute] } &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; if ( $attrib.IsJITTrackingEnabled )&amp;nbsp;&amp;nbsp; { &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; $debug = 'Debug'; &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; } else&amp;nbsp; { &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; $debug = 'Release'; &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; } &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; $version = $assembly.ImageRuntimeVersion; &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; $file.FullName.ToLower().Replace($path.ToLower(),'') + " | " + $debug + " | " &lt;/span&gt;&lt;span style="font-family: Courier New; font-size: x-small;" size="2" face="Courier New"&gt;+ $version ; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } catch [System.Management.Automation.MethodInvocationException] &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; { &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; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;br /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="background-color: #ffff00;" color="#ff0000"&gt;
&lt;p&gt;&lt;strong&gt;DISCLAIMER: o c&amp;oacute;digo acima &amp;eacute; fornecido &amp;ldquo;as is&amp;rdquo;, e sem garantias. Use por sua conta e risco.&lt;/strong&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Com isso, fica bem mais f&amp;aacute;cil identificar se h&amp;aacute; aplica&amp;ccedil;&amp;otilde;es em modo DEBUG. Voc&amp;ecirc; pode usar a mesma abordagem para criar uma aplica&amp;ccedil;&amp;atilde;o .NET (ou um Windows Service)&lt;/p&gt;
&lt;p&gt;At&amp;eacute; mais!&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10191428" width="1" height="1"&gt;</content><author><name>Paulo Teixeira - MSFT</name><uri>http://blogs.msdn.com/paulo_5F00_teixeira/ProfileUrlRedirect.ashx</uri></author></entry><entry><title>Compilation Debug=”true”, uma odisséia</title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/b/teixeira/archive/2011/07/30/compilation-debug-true-uma-odiss-233-ia.aspx" /><id>http://blogs.msdn.com/b/teixeira/archive/2011/07/30/compilation-debug-true-uma-odiss-233-ia.aspx</id><published>2011-07-30T21:41:21Z</published><updated>2011-07-30T21:41:21Z</updated><content type="html">&lt;p&gt;Este é mais uma daqueles posts que retrata a sempre tensa relação entre os administradores de Servidores Web e os desenvolvedores de aplicações ASP.NET. &lt;/p&gt;  &lt;p&gt;Resolvi escrever isso porque ontem estava conversando com um cliente e ele estava com dúvidas sobre o uso (ou não) dessa diretiva nos arquivos web.config das aplicações ASP.NET.&lt;/p&gt;  &lt;p&gt;A pergunta que sempre se faz é a seguinte: Em que momento devo usar a diretiva &amp;lt;compilation debug=”true”/&amp;gt; em minhas aplicações ASP.NET. Semprem surgem duvidas em relação a resposta para esta questão, então vou tentar ser bem claro: &lt;strong&gt;NUNCA!!&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;O grande problema é que, por padrão, quando o desenvolvedor está criando a sua aplicação, é necessário ter esta diretiva habilitada para poder fazer o &lt;em&gt;debugging&lt;/em&gt; da aplicação. Assim, o Visual Studio por padrão deixa o &amp;lt;compilation debug=”true” /&amp;gt; quando está se gerando um build em modo Debug. Por outro lado, se o código da aplicação for compilado em modo RELEASE, então teremos o &amp;lt;compilation debug=”false” /&amp;gt;.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-40-37-metablogapi/6404.image_5F00_55E57FC9.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-40-37-metablogapi/0121.image_5F00_thumb_5F00_52F01B16.png" width="505" height="65" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Cabe deixar bem claro que &lt;em&gt;é responsabilidade do desenvolvedor gerar um build em modo RELEASE&lt;/em&gt; antes de enviar para a publicação no servidor Web. É também &lt;em&gt;é responsabilidade do administrador de servidores Web garantir que não serão publicados builds em modo debug&lt;/em&gt; no ambiente de produção Web. &lt;/p&gt;  &lt;p&gt;Há uma miríade de artigos explicando os problemas causados pelo &lt;em&gt;deployment&lt;/em&gt; de aplicações em modo debug, então vou apontar um &lt;em&gt;oficial &lt;/em&gt;que resume-os: &lt;a title="http://support.microsoft.com/kb/2580348" href="http://support.microsoft.com/kb/2580348"&gt;http://support.microsoft.com/kb/2580348&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;Para desabilitar o modo debug nas aplicações Web, basta seguir as recomendações do artigo: &lt;a title="http://support.microsoft.com/kb/815157" href="http://support.microsoft.com/kb/815157"&gt;http://support.microsoft.com/kb/815157&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;Algo que poucos sabem é que os administradores de servidores Web podem evitar que aplicações sejam publicadas em modo &lt;em&gt;debug &lt;/em&gt;nos seus servidores, para o .NET Framework 2.0 e versões posteriores. Para isso, basta alterar o arquivo machine.config, adicionando a diretiva &amp;lt;deployment retail=”true” /&amp;gt;, como exemplificado:&lt;/p&gt;  &lt;p&gt;&lt;font size="2" face="Courier New"&gt;&amp;lt;configuration&amp;gt;      &lt;br /&gt;&lt;/font&gt;&lt;font size="2" face="Courier New"&gt;&amp;#160;&amp;#160; &amp;lt;system.web&amp;gt;      &lt;br /&gt;&lt;/font&gt;&lt;font size="2" face="Courier New"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;font style="background-color: #ffff00"&gt;&amp;lt;deployment retail=&amp;quot;true&amp;quot;/&amp;gt;&lt;/font&gt;       &lt;br /&gt;&lt;/font&gt;&lt;font size="2" face="Courier New"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ...      &lt;br /&gt;&lt;/font&gt;&lt;font size="2" face="Courier New"&gt;&amp;#160;&amp;#160; &amp;lt;/system.web&amp;gt;      &lt;br /&gt;&lt;/font&gt;&lt;font size="2" face="Courier New"&gt;&amp;lt;/configuration&amp;gt;&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;Com isso, o &lt;em&gt;debugging&lt;/em&gt; será desabilitado para todas as aplicações. Mas mesmo assim, se uma aplicação ainda estiver configurada para usar &amp;lt;compilation debug=”true” /&amp;gt;, então o &lt;em&gt;executionTimeout&lt;/em&gt; (ou seja, o tempo máximo que uma página pode executar) continuará sendo 30.000.000 segundos (ou seja, muiiiito tempo).&lt;/p&gt;  &lt;p&gt;Resumindo, &amp;lt;deployment retail=”true” /&amp;gt; ajuda, mas não resolve o problema totalmente. &lt;/p&gt;  &lt;p&gt;Então, DEVs e WebAdmins, fiquem atentos e não se esqueçam de sempre confirmar que as aplicações estão sendo publicadas em modo release no ambiente de produção.&lt;/p&gt;  &lt;p&gt;Até mais!&lt;/p&gt;  &lt;p&gt;Paulo.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10191424" width="1" height="1"&gt;</content><author><name>Paulo Teixeira - MSFT</name><uri>http://blogs.msdn.com/paulo_5F00_teixeira/ProfileUrlRedirect.ashx</uri></author></entry><entry><title>Como desabilitar o SSLv2 e o PCT v1 no IIS6 e IIS7.x</title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/b/teixeira/archive/2011/05/28/como-desabilitar-o-sslv2-e-o-pct-v1-no-iis6-e-iis7-x.aspx" /><id>http://blogs.msdn.com/b/teixeira/archive/2011/05/28/como-desabilitar-o-sslv2-e-o-pct-v1-no-iis6-e-iis7-x.aspx</id><published>2011-05-28T21:45:19Z</published><updated>2011-05-28T21:45:19Z</updated><content type="html">&lt;p&gt;&lt;font size="2"&gt;Já faz algum tempo que se sabe que o protocolo SSL v2 é suscetível a ataques do tipo “man-in-the-middle”. Mas a menos tempo as empresas especializadas em testes de intrusão começaram a fazer testes e colocar este protocolo na “lista negra” das vulnerabilidades pelo qual o seu web site pode ser atacado. &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font size="2"&gt;Recentemente montei um pequeno laboratório para desabilitar estes protocolos no Windows 2003, Windows 2008 e Windows 2008 R2, a pedido de um cliente. A melhor forma de fazer isso nestas versões do Windows é através do Schannel. O Schannel é um Security Support Provider utilizado no Windows por aplicações de Internet (como o IIS) que necessitam comunicações seguras via HTTP. O Schannel oferece autenticação e comunicações seguras e privadas através do uso de criptografia. &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font size="2"&gt;O procedimento consiste em remover da lista de protocolos permitidos pelo Schannel aqueles que são considerados fatores de risco, ou que apresentem vulnerabilidades conhecidas. Dessa forma, o SSL v2.0, o PCT 1.0 e as cifras de 40bits e 56bits devem ser desabilitadas. Os passos estão descritos a seguir:&amp;#160; &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;font size="2"&gt;Windows 2003: &lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;font size="2"&gt;No Windows 2003/IIS6, o protocolo SSLv2 está habilitado, juntamente com o PCT 1.0.      &lt;br /&gt;Neste caso, o procedimento recomendado para desabilitar estes procotolos e também as cifras de 40 e 56bits é o seguinte:&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font size="2"&gt;Crie um arquivo .REG com o seguinte conteúdo: &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font size="2" face="Courier New"&gt;Windows Registry Editor Version 5.00&lt;/font&gt;&lt;font size="2" face="Courier New"&gt;[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\     &lt;br /&gt;SCHANNEL\Protocols\Multi-Protocol Unified Hello\Server]       &lt;br /&gt;&lt;/font&gt;&lt;font size="2" face="Courier New"&gt;&amp;quot;Enabled&amp;quot;=dword:00000000      &lt;br /&gt;&lt;/font&gt;&lt;font size="2" face="Courier New"&gt;HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\     &lt;br /&gt;SCHANNEL\Protocols\PCT 1.0\Server]       &lt;br /&gt;&lt;/font&gt;&lt;font size="2" face="Courier New"&gt;&amp;quot;Enabled&amp;quot;=dword:00000000&lt;/font&gt;&lt;font size="2" face="Courier New"&gt;      &lt;br /&gt;[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\      &lt;br /&gt;SCHANNEL\Protocols\SSL 2.0\Server]       &lt;br /&gt;&lt;/font&gt;&lt;font size="2" face="Courier New"&gt;&amp;quot;Enabled&amp;quot;=dword:00000000     &lt;br /&gt;&lt;/font&gt;&lt;font size="2" face="Courier New"&gt;[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\     &lt;br /&gt;SCHANNEL\Protocols\SSL 3.0\Server]       &lt;br /&gt;&lt;/font&gt;&lt;font size="2" face="Courier New"&gt;&amp;quot;Enabled&amp;quot;=dword:ffffffff&lt;/font&gt;&lt;font size="2" face="Courier New"&gt;      &lt;br /&gt;[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\      &lt;br /&gt;SCHANNEL\Protocols\TLS 1.0\Server]       &lt;br /&gt;&lt;/font&gt;&lt;font size="2" face="Courier New"&gt;&amp;quot;Enabled&amp;quot;=dword:ffffffff&lt;/font&gt;&lt;font size="2" face="Courier New"&gt;      &lt;br /&gt;[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\      &lt;br /&gt;SCHANNEL\Ciphers\DES 56/56]       &lt;br /&gt;&lt;/font&gt;&lt;font size="2" face="Courier New"&gt;&amp;quot;Enabled&amp;quot;=dword:00000000&lt;/font&gt;&lt;font size="2" face="Courier New"&gt;      &lt;br /&gt;[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\      &lt;br /&gt;SCHANNEL\Ciphers\NULL]       &lt;br /&gt;&lt;/font&gt;&lt;font size="2" face="Courier New"&gt;&amp;quot;Enabled&amp;quot;=dword:00000000&lt;/font&gt;&lt;font size="2" face="Courier New"&gt;      &lt;br /&gt;[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\      &lt;br /&gt;SCHANNEL\Ciphers\RC2 128/128]       &lt;br /&gt;&lt;/font&gt;&lt;font size="2" face="Courier New"&gt;&amp;quot;Enabled&amp;quot;=dword:00000000&lt;/font&gt;&lt;font size="2" face="Courier New"&gt;      &lt;br /&gt;[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\      &lt;br /&gt;SCHANNEL\Ciphers\RC2 40/128]       &lt;br /&gt;&lt;/font&gt;&lt;font size="2" face="Courier New"&gt;&amp;quot;Enabled&amp;quot;=dword:00000000&lt;/font&gt;&lt;font size="2" face="Courier New"&gt;      &lt;br /&gt;[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\      &lt;br /&gt;SCHANNEL\Ciphers\RC2 56/128]       &lt;br /&gt;&lt;/font&gt;&lt;font size="2" face="Courier New"&gt;&amp;quot;Enabled&amp;quot;=dword:00000000&lt;/font&gt;&lt;font size="2" face="Courier New"&gt;      &lt;br /&gt;[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\      &lt;br /&gt;SCHANNEL\Ciphers\RC4 128/128]       &lt;br /&gt;&lt;/font&gt;&lt;font size="2" face="Courier New"&gt;&amp;quot;Enabled&amp;quot;=dword:ffffffff&lt;/font&gt;&lt;font size="2" face="Courier New"&gt;      &lt;br /&gt;[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\      &lt;br /&gt;SCHANNEL\Ciphers\RC4 40/128]       &lt;br /&gt;&lt;/font&gt;&lt;font size="2" face="Courier New"&gt;&amp;quot;Enabled&amp;quot;=dword:00000000&lt;/font&gt;&lt;font size="2" face="Courier New"&gt;      &lt;br /&gt;[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\      &lt;br /&gt;SCHANNEL\Ciphers\RC4 56/128]       &lt;br /&gt;&lt;/font&gt;&lt;font size="2" face="Courier New"&gt;&amp;quot;Enabled&amp;quot;=dword:00000000&lt;/font&gt;&lt;font size="2" face="Courier New"&gt;      &lt;br /&gt;[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\      &lt;br /&gt;SCHANNEL\Ciphers\RC4 64/128]       &lt;br /&gt;&lt;/font&gt;&lt;font size="2" face="Courier New"&gt;&amp;quot;Enabled&amp;quot;=dword:00000000&lt;/font&gt;&lt;font size="2" face="Courier New"&gt;      &lt;br /&gt;[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\      &lt;br /&gt;SCHANNEL\Ciphers\Triple DES 168/168]       &lt;br /&gt;&lt;/font&gt;&lt;font size="2" face="Courier New"&gt;&amp;quot;Enabled&amp;quot;=dword:ffffffff&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font size="2"&gt;Aplique então este arquivo nos servidores IIS6 e em seguida reinicie os mesmos. Para testar se o protocolo foi desabilitado pode ser utilizado o utilitário WFETCH, que é parte do IIS6 Resource Kit. &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;font size="2"&gt;Windows 2008 e Windows 2008 R2:&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;font size="2"&gt;No Windows 2008 e Windows 2008 R2 o protocolo SSL v2.0 está habilitado, mas o protocolo PCT 1.0 já está desabilitado por padrão. Também não há cifras com 40 ou 56 bits habilitadas. De qualquer forma a mesma configuração utilizada no Windows 2003 pode ser aplicada no Windows 2008. &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font size="2"&gt;Assim, basta criar um arquivo .REG com o seguinte conteúdo: &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font size="2" face="Courier New"&gt;Windows Registry Editor Version 5.00&lt;/font&gt;&lt;font size="2" face="Courier New"&gt;      &lt;br /&gt;[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\      &lt;br /&gt;SCHANNEL\Protocols\Multi-Protocol Unified Hello\Server]       &lt;br /&gt;&lt;/font&gt;&lt;font size="2" face="Courier New"&gt;&amp;quot;Enabled&amp;quot;=dword:00000000&lt;/font&gt;&lt;font size="2" face="Courier New"&gt;      &lt;br /&gt;[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\      &lt;br /&gt;SCHANNEL\Protocols\PCT 1.0\Server]       &lt;br /&gt;&lt;/font&gt;&lt;font size="2" face="Courier New"&gt;&amp;quot;Enabled&amp;quot;=dword:00000000&lt;/font&gt;&lt;font size="2" face="Courier New"&gt;      &lt;br /&gt;[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\      &lt;br /&gt;SCHANNEL\Protocols\SSL 2.0\Server]       &lt;br /&gt;&lt;/font&gt;&lt;font size="2" face="Courier New"&gt;&amp;quot;Enabled&amp;quot;=dword:00000000&lt;/font&gt;&lt;font size="2" face="Courier New"&gt;      &lt;br /&gt;[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\      &lt;br /&gt;SCHANNEL\Protocols\SSL 3.0\Server]       &lt;br /&gt;&lt;/font&gt;&lt;font size="2" face="Courier New"&gt;&amp;quot;Enabled&amp;quot;=dword:ffffffff&lt;/font&gt;&lt;font size="2" face="Courier New"&gt;      &lt;br /&gt;[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\      &lt;br /&gt;SCHANNEL\Protocols\TLS 1.0\Server]       &lt;br /&gt;&lt;/font&gt;&lt;font size="2" face="Courier New"&gt;&amp;quot;Enabled&amp;quot;=dword:ffffffff&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font size="2"&gt;Uma outra forma de desabilitar o uso do protocolo SSL v2 no Windows 2008 e Windows 2008 R2 é explicitamente desabilitar as seguints cifras: &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font size="2"&gt;SSL_CK_RC4_128_WITH_MD5,      &lt;br /&gt;&lt;/font&gt;&lt;font size="2"&gt;SSL_CK_DES_192_EDE3_CBC_WITH_MD5&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font size="2"&gt;Para isso basta seguir os procedimentos sugeridos no artigo:      &lt;br /&gt;&lt;/font&gt;    &lt;br /&gt;&lt;a href="http://blogs.msdn.com/b/amol/archive/2010/04/27/how-to-disable-ssl-2-0-in-internet-information-services-7.asp"&gt;&lt;font size="2"&gt;&lt;/font&gt;&lt;/a&gt;&lt;a href="http://blogs.msdn.com/b/amol/archive/2010/04/27/how-to-disable-ssl-2-0-in-internet-information-services-7.aspx"&gt;http://blogs.msdn.com/b/amol/archive/2010/04/27/how-to-disable-ssl-2-0-in-internet-information-services-7.asp&lt;/a&gt;&lt;/a&gt;&lt;font size="2"&gt;x&lt;/font&gt;     &lt;br /&gt;    &lt;br /&gt;substituindo os valores padrão a seguir: &lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;font size="2" face="Courier New"&gt;TLS_RSA_WITH_AES_128_CBC_SHA256,TLS_RSA_WITH_AES_128_CBC_SHA,      &lt;br /&gt;TLS_RSA_WITH_AES_256_CBC_SHA256,TLS_RSA_WITH_AES_256_CBC_SHA,       &lt;br /&gt;TLS_RSA_WITH_RC4_128_SHA,TLS_RSA_WITH_3DES_EDE_CBC_SHA,       &lt;br /&gt;TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256_P256,       &lt;br /&gt;TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256_P384,       &lt;br /&gt;TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA_P256,       &lt;br /&gt;TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA_P384,       &lt;br /&gt;TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA_P256,       &lt;br /&gt;TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA_P384,       &lt;br /&gt;TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256_P256,       &lt;br /&gt;TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256_P256,       &lt;br /&gt;TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384_P384,       &lt;br /&gt;TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384_P384,       &lt;br /&gt;TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA_P256,       &lt;br /&gt;TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA_P384,       &lt;br /&gt;TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA_P256,       &lt;br /&gt;TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA_P384,       &lt;br /&gt;TLS_DHE_DSS_WITH_AES_128_CBC_SHA256,       &lt;br /&gt;TLS_DHE_DSS_WITH_AES_128_CBC_SHA,       &lt;br /&gt;TLS_DHE_DSS_WITH_AES_256_CBC_SHA256,       &lt;br /&gt;TLS_DHE_DSS_WITH_AES_256_CBC_SHA,       &lt;br /&gt;TLS_DHE_DSS_WITH_3DES_EDE_CBC_SHA,       &lt;br /&gt;TLS_RSA_WITH_RC4_128_MD5,       &lt;br /&gt;&lt;font style="background-color: #ff0000"&gt;&lt;strong&gt;SSL_CK_RC4_128_WITH_MD5,SSL_CK_DES_192_EDE3_CBC_WITH_MD5,&lt;/strong&gt;         &lt;br /&gt;&lt;/font&gt;TLS_RSA_WITH_NULL_SHA256,TLS_RSA_WITH_NULL_SHA&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font size="2"&gt;Por este novo conjunto de cifras: &lt;/font&gt;&lt;/p&gt; &lt;font size="2" face="Courier New"&gt;TLS_RSA_WITH_AES_128_CBC_SHA256,TLS_RSA_WITH_AES_128_CBC_SHA,    &lt;br /&gt;TLS_RSA_WITH_AES_256_CBC_SHA256,TLS_RSA_WITH_AES_256_CBC_SHA,     &lt;br /&gt;TLS_RSA_WITH_RC4_128_SHA,TLS_RSA_WITH_3DES_EDE_CBC_SHA,     &lt;br /&gt;TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256_P256,     &lt;br /&gt;TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256_P384,     &lt;br /&gt;TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA_P256,     &lt;br /&gt;TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA_P384,     &lt;br /&gt;TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA_P256,     &lt;br /&gt;TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA_P384,     &lt;br /&gt;TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256_P256,     &lt;br /&gt;TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256_P256,     &lt;br /&gt;TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384_P384,     &lt;br /&gt;TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384_P384,     &lt;br /&gt;TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA_P256,     &lt;br /&gt;TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA_P384,     &lt;br /&gt;TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA_P256,     &lt;br /&gt;TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA_P384,     &lt;br /&gt;TLS_DHE_DSS_WITH_AES_128_CBC_SHA256,     &lt;br /&gt;TLS_DHE_DSS_WITH_AES_128_CBC_SHA,     &lt;br /&gt;TLS_DHE_DSS_WITH_AES_256_CBC_SHA256,     &lt;br /&gt;TLS_DHE_DSS_WITH_AES_256_CBC_SHA,     &lt;br /&gt;TLS_DHE_DSS_WITH_3DES_EDE_CBC_SHA,     &lt;br /&gt;TLS_RSA_WITH_RC4_128_MD5,     &lt;br /&gt;TLS_RSA_WITH_NULL_SHA256,TLS_RSA_WITH_NULL_SHA&lt;/font&gt;   &lt;p&gt;&lt;font size="2"&gt;Adicionalmente, é recomendado que os websites configurados nos servidores IIS7.x sejam configurados para não permitir o uso de cifras fracas (40bits e 56bits). Para isso, utilizando o Internet Information Services Manager, selecione o website a ser configurado, e no painel de navegação selecione &amp;quot;SSL Settings&amp;quot;. Em seguida, configure o site para requerer o uso de cifras de 128bits (marque o checkbox &amp;quot;Require 128-bit SSL&amp;quot;). A figura a seguir ilustra a configuração necessária: &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-40-37-metablogapi/6837.clip_5F00_image001_5F00_1424BF6C.png"&gt;&lt;font size="2"&gt;&lt;/font&gt;&lt;/a&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-40-37-metablogapi/8407.clip_5F00_image001_5F00_71144DFB.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto; padding-top: 0px" title="clip_image001" border="0" alt="clip_image001" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-40-37-metablogapi/8738.clip_5F00_image001_5F00_thumb_5F00_718DF675.png" width="503" height="247" /&gt;&lt;/a&gt;&lt;/a&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;font size="2"&gt;&lt;strong&gt;Conclusões&lt;/strong&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font size="2"&gt;Este procedimento irá desabilitar o protocolo SSL v2.0 e PCT v1.0 removendo-os da lista dos protocolos permitidos no Schannel. &lt;/font&gt;&lt;font size="2"&gt;Ao se remover os protocolos SSL v2.0 e PCT v1.0 da lista de protocolos permitidos no Schannel, o servidor Web IIS não será mais capaz de estabelecer canais de comunicação utilizando os mesmos, dessa forma evitando que vulnerabilidades conhecidas sejam exploradas. Contudo, &lt;strong&gt;&lt;font color="#c0504d"&gt;clientes antigos ou proprietários que não implementem os protocolos restantes (com o SSL v3.0 ou o TLS 1.0) não conseguirão mais ter acesso ao servidor&lt;/font&gt;&lt;/strong&gt;. Cabe a você avaliar se há aplicações que dependam dos protocolos desabilitados, e o consequente impacto para o seu negócio ao se tomar esta ação. &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;font size="2"&gt;Referências: &lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;font size="2"&gt;&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;font size="2"&gt;Cipher Suites in Schannel:        &lt;br /&gt;&lt;/font&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/aa374757(VS.85).aspx"&gt;&lt;font size="2"&gt;http://msdn.microsoft.com/en-us/library/aa374757(VS.85).aspx&lt;/font&gt;&lt;/a&gt;&lt;font size="2"&gt; &lt;/font&gt;&lt;/li&gt; &lt;/ul&gt;  &lt;ul&gt;   &lt;li&gt;&lt;font size="2"&gt;Schannel Cipher Suites in Windows Vista:        &lt;br /&gt;&lt;/font&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/ff468651(v=VS.85).aspx"&gt;&lt;font size="2"&gt;http://msdn.microsoft.com/en-us/library/ff468651(v=VS.85).aspx&lt;/font&gt;&lt;/a&gt;&lt;font size="2"&gt; &lt;/font&gt;&lt;/li&gt; &lt;/ul&gt;  &lt;ul&gt;   &lt;li&gt;&lt;font size="2"&gt;How to disable SSL 2.0 in Internet Information Services 7:        &lt;br /&gt;&lt;/font&gt;&lt;a href="http://blogs.msdn.com/b/amol/archive/2010/04/27/how-to-disable-ssl-2-0-in-internet-information-services-7.asp"&gt;&lt;font size="2"&gt;http://blogs.msdn.com/b/amol/archive/2010/04/27/how-to-disable-ssl-2-0-in-internet-information-services-7.asp&lt;/font&gt;&lt;/a&gt;&lt;font size="2"&gt;x &lt;/font&gt;&lt;/li&gt; &lt;/ul&gt;  &lt;ul&gt;   &lt;li&gt;&lt;font size="2"&gt;How to disable PCT 1.0, SSL 2.0, SSL 3.0, or TLS 1.0 in Internet Information Services:        &lt;br /&gt;&lt;/font&gt;&lt;a href="http://support.microsoft.com/?id=187498"&gt;&lt;font size="2"&gt;http://support.microsoft.com/?id=187498&lt;/font&gt;&lt;/a&gt;&lt;font size="2"&gt; &lt;/font&gt;&lt;/li&gt; &lt;/ul&gt;  &lt;ul&gt;   &lt;li&gt;&lt;font size="2"&gt;Prioritizing Schannel Cipher Suites:        &lt;br /&gt;&lt;/font&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/bb870930(VS.85).aspx"&gt;&lt;font size="2"&gt;http://msdn.microsoft.com/en-us/library/bb870930(VS.85).aspx&lt;/font&gt;&lt;/a&gt;&lt;font size="2"&gt; &lt;/font&gt;&lt;/li&gt; &lt;/ul&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10169339" width="1" height="1"&gt;</content><author><name>Paulo Teixeira - MSFT</name><uri>http://blogs.msdn.com/paulo_5F00_teixeira/ProfileUrlRedirect.ashx</uri></author></entry></feed>