<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://blogs.msdn.com/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>Luis H Demetrio</title><link>http://blogs.msdn.com/b/luisdem/</link><description>Premier Field Engineer</description><dc:language>en-US</dc:language><generator>Telligent Evolution Platform Developer Build (Build: 5.6.50428.7875)</generator><item><title>HTTP could not register URL http://+:8000/</title><link>http://blogs.msdn.com/b/luisdem/archive/2012/10/04/http-could-not-register-url-http-8000.aspx</link><pubDate>Fri, 05 Oct 2012 00:45:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:10356133</guid><dc:creator>Luis Henrique Demetrio</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.msdn.com/b/luisdem/rsscomments.aspx?WeblogPostID=10356133</wfw:commentRss><comments>http://blogs.msdn.com/b/luisdem/archive/2012/10/04/http-could-not-register-url-http-8000.aspx#comments</comments><description>&lt;p&gt;Uma das principais mudan&amp;ccedil;as de seguran&amp;ccedil;a implementada &amp;agrave; partir do Windows Vista &amp;eacute; o &lt;a title="Controle de Conta de Usu&amp;aacute;rio (UAC)" href="http://blogs.msdn.com/b/luisdem/archive/2012/04/15/controle-de-conta-de-usu-225-rio-uac.aspx"&gt;Controle de Conta de Usu&amp;aacute;rio (UAC)&lt;/a&gt;. Com o UAC habilitado, todas as contas de usu&amp;aacute;rio, incluindo contas administrativas, s&amp;atilde;o executadas com direitos de usu&amp;aacute;rio padr&amp;atilde;o.&lt;/p&gt;
&lt;p&gt;Quando um administrador faz logon, o Windows cria dois tokens de acesso separados para o usu&amp;aacute;rio, sendo um token de acesso sem privil&amp;eacute;gios administrativos (token filtrado) e outro de acesso de administrador (token full). No momento em que um processo precisa ser executado com privil&amp;eacute;gio elevado, o Windows n&amp;atilde;o utiliza o token filtrado para executar o processo e, sim, o token completo. Se o usu&amp;aacute;rio for administrador, o Windows exibe a tela do UAC apenas para confirmar a troca do token. Caso contr&amp;aacute;rio, o Windows solicita as credenciais de uma conta administrativa.&lt;/p&gt;
&lt;p&gt;O resultado &amp;eacute; que isso afeta execu&amp;ccedil;&amp;atilde;o de servi&amp;ccedil;os web HTTP, pois escutar um determinado endere&amp;ccedil;o HTTP &amp;eacute; uma opera&amp;ccedil;&amp;atilde;o restrita para usu&amp;aacute;rios com privil&amp;eacute;gios administrativos. Por padr&amp;atilde;o, cada caminho HTTP &amp;eacute; reservado para uso do administrador do sistema. Por exemplo, ao realizar o debug dos servi&amp;ccedil;os no Visual Studio, a exce&amp;ccedil;&amp;atilde;o &lt;strong&gt;AddressAccessDeniedException&lt;/strong&gt; &amp;eacute; gerada no momento em que o servi&amp;ccedil;o &amp;eacute; iniciado caso n&amp;atilde;o seja executado atrav&amp;eacute;s de uma conta elevada.&lt;/p&gt;
&lt;p&gt;&lt;span style="text-decoration: underline;"&gt;Mensagem de erro&lt;/span&gt;:&lt;/p&gt;
&lt;p&gt;&lt;span style="background-color: #ffff00;"&gt;HTTP could not register URL http://+:8000/. Your process does not have access rights to this namespace (see http://go.microsoft.com/fwlink/?LinkId=70353 for details). &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Uma maneira de resolver o problema &amp;eacute; executar o Visual Studio elevado. Outra op&amp;ccedil;&amp;atilde;o &amp;eacute; executar o prompt de comando como administrador e executar o comando a seguir para atribuir o namespace HTTP para a conta do usu&amp;aacute;rio:&lt;/p&gt;
&lt;p&gt;&lt;span style="background-color: #ffff00;"&gt;netsh http add urlacl url=http://+:8000/ user=MYMACHINE\UserName &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;*MYMACHINE deve ser substitu&amp;iacute;do pelo nome do computador ou pelo dom&amp;iacute;nio e UserName pelo usu&amp;aacute;rio administrador. E a URL digitada deve corresponder a URL da mensagem de erro.&lt;/p&gt;
&lt;p&gt;Ao executar o servi&amp;ccedil;o novamente no Visual Studio a exce&amp;ccedil;&amp;atilde;o n&amp;atilde;o ir&amp;aacute; mais ocorrer.&lt;/p&gt;
&lt;p&gt;Para maiores informa&amp;ccedil;&amp;otilde;es do comando netsh execute o comando &amp;ldquo;netsh http&amp;rdquo;.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10356133" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/b/luisdem/archive/tags/Compatibilidade+Windows+7/">Compatibilidade Windows 7</category><category domain="http://blogs.msdn.com/b/luisdem/archive/tags/Visual+Studio/">Visual Studio</category></item><item><title>Aplicação exibindo o erro Run-time error '20599': Cannot Open SQL</title><link>http://blogs.msdn.com/b/luisdem/archive/2012/07/20/aplica-231-227-o-exibindo-o-erro-run-time-error-20599-cannot-open-sql.aspx</link><pubDate>Sat, 21 Jul 2012 00:57:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:10332144</guid><dc:creator>Luis Henrique Demetrio</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.msdn.com/b/luisdem/rsscomments.aspx?WeblogPostID=10332144</wfw:commentRss><comments>http://blogs.msdn.com/b/luisdem/archive/2012/07/20/aplica-231-227-o-exibindo-o-erro-run-time-error-20599-cannot-open-sql.aspx#comments</comments><description>&lt;p&gt;Em um dos trabalhos de compatibilidade de aplica&amp;ccedil;&amp;otilde;es com o Windows 7 me deparei com uma aplica&amp;ccedil;&amp;atilde;o que gerava a seguite mensagem de erro quando tentava abrir um relat&amp;oacute;rio do Crystal Report:&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Run-time error '20599':&lt;/p&gt;
&lt;p&gt;Cannot Open SQL&lt;/p&gt;
&lt;p&gt;Resumindo o cen&amp;aacute;rio, o cliente n&amp;atilde;o tinha o c&amp;oacute;digo-fonte da aplica&amp;ccedil;&amp;atilde;o, n&amp;atilde;o tinha acesso ao Event Viewer do servidor da base de dados e n&amp;atilde;o possu&amp;iacute;a manual de implanta&amp;ccedil;&amp;atilde;o da aplica&amp;ccedil;&amp;atilde;o.&lt;/p&gt;
&lt;p&gt;Como a mensagem de erro apenas informava que a aplica&amp;ccedil;&amp;atilde;o n&amp;atilde;o conseguia se comunicar com a base de dados, a &amp;nbsp;sa&amp;iacute;da foi reproduzir o problema e capturar a tr&amp;aacute;fego de rede atrav&amp;eacute;s do Network Monitor (NetMon). O NetMon &amp;eacute; uma ferramenta utilizada para diagnosticar problemas com a conectividade do servidor que permite capturar, visualizar e analisar o tr&amp;aacute;fego de rede e descifrar os protocolos de rede.&lt;/p&gt;
&lt;p&gt;A comunica&amp;ccedil;&amp;atilde;o entre a aplica&amp;ccedil;&amp;atilde;o e o SQL Server utiliza o formato de comunica&amp;ccedil;&amp;atilde;o Microsoft denominado pacote TDS (Tabular Data Stream). Uma vez estabelecida a conex&amp;atilde;o as mensagens TDS s&amp;atilde;o usadas para a comunica&amp;ccedil;&amp;atilde;o entre o cliente e o servidor. A figura a seguir ilustra um fluxo simplificado de comunica&amp;ccedil;&amp;atilde;o para&lt;br /&gt;TDS.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-52-35/8662.Figura2.PNG"&gt;&lt;img alt="" src="http://blogs.msdn.com/resized-image.ashx/__size/550x0/__key/communityserver-blogs-components-weblogfiles/00-00-01-52-35/8662.Figura2.PNG" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Para facilitar a an&amp;aacute;lise dos dados coletados pelo NetMon filtrei apenas o protocolo TDS para reduzir o volume de informa&amp;ccedil;&amp;otilde;es coletadas (ProtocolName == "TDS"). Ap&amp;oacute;s aplicado o filtro a troca de pacotes fica bem f&amp;aacute;cil de ser analisada. Ap&amp;oacute;s aplicado o filtro fica f&amp;aacute;cil visualizar o fluxo ilustrado na figura anterior.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-52-35/5086.Figura1.PNG"&gt;&lt;img alt="" src="http://blogs.msdn.com/resized-image.ashx/__size/550x0/__key/communityserver-blogs-components-weblogfiles/00-00-01-52-35/5086.Figura1.PNG" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Atrav&amp;eacute;s da figura abaixo &amp;eacute; poss&amp;iacute;vel verificar que o servidor SQL est&amp;aacute; retornando (TDS:Response) o erro "falha de logon" ap&amp;oacute;s a aplica&amp;ccedil;&amp;atilde;o tentar realizar o login na base de dados (TDS:Login7 - define as regras de autentica&amp;ccedil;&amp;atilde;o para uso entre cliente e servidor).&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-52-35/8206.Figura3.PNG"&gt;&lt;img alt="" src="http://blogs.msdn.com/resized-image.ashx/__size/550x0/__key/communityserver-blogs-components-weblogfiles/00-00-01-52-35/8206.Figura3.PNG" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;A conclus&amp;atilde;o &amp;eacute; que n&amp;atilde;o havia incompatibilidade da aplica&amp;ccedil;&amp;atilde;o com o Windows 7. O erro era decorrente da configura&amp;ccedil;&amp;atilde;o incorreta da base de dados de uma fonte de dados ODBC utilizada pela aplica&amp;ccedil;&amp;atilde;o. A aplica&amp;ccedil;&amp;atilde;o funcionou corretamente ap&amp;oacute;s o cliente informar a base de dados correta.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Refer&amp;ecirc;ncia&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Protocolos de rede e pontos de extremidade TDS&lt;/p&gt;
&lt;p&gt;&lt;a href="http://msdn.microsoft.com/pt-br/library/ms191220(v=SQL.100).aspx"&gt;http://msdn.microsoft.com/pt-br/library/ms191220(v=SQL.100).aspx&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Microsoft Network Monitor 3.4&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.microsoft.com/en-us/download/details.aspx?id=4865"&gt;http://www.microsoft.com/en-us/download/details.aspx?id=4865&lt;/a&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10332144" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/b/luisdem/archive/tags/NetMon/">NetMon</category></item><item><title>Web Service com Lentidão gerando Timeout</title><link>http://blogs.msdn.com/b/luisdem/archive/2012/07/18/web-service-com-lentid-227-o-gerando-timeout.aspx</link><pubDate>Wed, 18 Jul 2012 03:26:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:10330950</guid><dc:creator>Luis Henrique Demetrio</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.msdn.com/b/luisdem/rsscomments.aspx?WeblogPostID=10330950</wfw:commentRss><comments>http://blogs.msdn.com/b/luisdem/archive/2012/07/18/web-service-com-lentid-227-o-gerando-timeout.aspx#comments</comments><description>&lt;p&gt;O cliente estava recebendo erro de timeout em algumas p&amp;aacute;ginas da sua aplica&amp;ccedil;&amp;atilde;o web. Coletamos um dump do processo w3wp.exe correspondente ao webservice utilizado pela aplica&amp;ccedil;&amp;atilde;o web, pois o cliente garantiu que as p&amp;aacute;ginas do site apenas realizavam chamadas para esse webservice.&lt;/p&gt;
&lt;p&gt;O primeiro passo &amp;eacute; carregar a extens&amp;atilde;o de depura&amp;ccedil;&amp;atilde;o de c&amp;oacute;digo gerenciado &lt;a href="http://www.microsoft.com/downloads/details.aspx?FamilyID=5c068e9f-ebfe-48a5-8b2f-0ad6ab454ad4&amp;amp;amp;amp;displayLang=en&amp;amp;displaylang=en"&gt;Psscor2&lt;/a&gt;&amp;nbsp;que &amp;eacute; utilizada para ajudar no diagn&amp;oacute;stico de problemas em aplica&amp;ccedil;&amp;otilde;es do Framework .Net, para as vers&amp;otilde;es 2.0, 3.0 e 3.5 atrav&amp;eacute;s do commando &lt;span style="background-color: #ffff00;"&gt;.load psscor2.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;A extens&amp;atilde;o Psscor2 cont&amp;eacute;m um comando muito &amp;uacute;til chamado &lt;span style="background-color: #ffff00;"&gt;!aspxpages&lt;/span&gt; que mostra informa&amp;ccedil;&amp;otilde;es sobre v&amp;aacute;rias requisi&amp;ccedil;&amp;otilde;es ASP.NET, o tempo de execu&amp;ccedil;&amp;atilde;o e as threads associadas com o System.Web.HttpContext que estavam sendo executadas no momento em que o dump foi coletado.&lt;/p&gt;
&lt;p&gt;A figura a seguir exibe o resultado da execu&amp;ccedil;&amp;atilde;o do comando &lt;span style="background-color: #ffff00;"&gt;!aspxpages&lt;/span&gt;. Atrav&amp;eacute;s do resultado podemos observar que o tempo m&amp;eacute;dio de execu&amp;ccedil;&amp;atilde;o das requisi&amp;ccedil;&amp;otilde;es, no momento em que o dump foi tirado, era de aproximadamente 5 minutos. &amp;Eacute; poss&amp;iacute;vel observar tamb&amp;eacute;m que essa tempo ultrapassa, na maioria dos casos, o tempo&lt;br /&gt;estipulado de timeout.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-52-35/4405.AspxPages.PNG"&gt;&lt;img alt="" src="http://blogs.msdn.com/resized-image.ashx/__size/550x0/__key/communityserver-blogs-components-weblogfiles/00-00-01-52-35/4405.AspxPages.PNG" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;span lang="PT" style="color: black; font-family: 'Arial','sans-serif'; font-size: 9pt; mso-ansi-language: PT;"&gt;Vamos analisar a thread 41, referente ao web service consultas.asmx, cujo tempo de execu&amp;ccedil;&amp;atilde;o no momento do dump era de 472 segundos (7 minutos).&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span lang="PT" style="color: black; line-height: 115%; font-family: 'Arial','sans-serif'; font-size: 9pt; mso-ansi-language: PT; mso-fareast-font-family: Calibri; mso-fareast-theme-font: minor-latin; mso-fareast-language: EN-US; mso-bidi-language: AR-SA;"&gt;O comando &lt;/span&gt;&lt;span lang="EN" style="background: yellow; line-height: 115%; font-family: 'Calibri','sans-serif'; font-size: 10pt; mso-ansi-language: EN; mso-fareast-font-family: Calibri; mso-fareast-theme-font: minor-latin; mso-bidi-font-family: 'Times New Roman'; mso-bidi-theme-font: minor-bidi; mso-fareast-language: EN-US; mso-bidi-language: AR-SA; mso-bidi-font-size: 11.0pt; mso-ascii-theme-font: minor-latin; mso-hansi-theme-font: minor-latin;"&gt;!clrstack &lt;/span&gt;&lt;span lang="PT" style="color: black; line-height: 115%; font-family: 'Arial','sans-serif'; font-size: 9pt; mso-ansi-language: PT; mso-fareast-font-family: Calibri; mso-fareast-theme-font: minor-latin; mso-fareast-language: EN-US; mso-bidi-language: AR-SA;"&gt;permite verificar a pilha de chamadas da thread para verificar o que est&amp;aacute; sendo executado.&lt;/span&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-52-35/3630.Clrstack.PNG"&gt;&lt;img alt="" src="http://blogs.msdn.com/resized-image.ashx/__size/550x0/__key/communityserver-blogs-components-weblogfiles/00-00-01-52-35/3630.Clrstack.PNG" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Atrav&amp;eacute;s desse comando &amp;eacute; poss&amp;iacute;vel verificar que a thread est&amp;aacute; executando o m&amp;eacute;todo &lt;a href="http://msdn.microsoft.com/pt-br/library/system.data.sqlclient.sqlcommand.executereader.aspx"&gt;ExecuteReader&lt;/a&gt;&amp;nbsp;para popular um objeto &lt;a href="http://msdn.microsoft.com/pt-br/library/system.data.sqlclient.sqldatareader.aspx"&gt;SqlDataReader&lt;/a&gt;. Para obter maiores detalhes do que est&amp;aacute; sendo executado n&amp;oacute;s podemos executar o commando !dso (!dumpstackobjects) na thread 41 e analisar as informa&amp;ccedil;&amp;otilde;es do objeto SqlDataReader.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-52-35/5238.Dso.PNG"&gt;&lt;img alt="" src="http://blogs.msdn.com/resized-image.ashx/__size/550x0/__key/communityserver-blogs-components-weblogfiles/00-00-01-52-35/5238.Dso.PNG" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Agora que temos o endere&amp;ccedil;o do objeto SqlDataReader (070dac1c) n&amp;oacute;s podemos obter maiores detalhes deste objeto atrav&amp;eacute;s do comando !do (!dumpobject).&lt;/p&gt;
&lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-52-35/0005.Do.PNG"&gt;&lt;img alt="" src="http://blogs.msdn.com/resized-image.ashx/__size/550x0/__key/communityserver-blogs-components-weblogfiles/00-00-01-52-35/0005.Do.PNG" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Observe&amp;nbsp;na figura que o timeout (_timeoutSeconds) dessa conex&amp;atilde;o &amp;eacute; de 600 segundos. O comando SQL que est&amp;aacute; sendo executado pode ser obtido executando o dump do objeto para o endere&amp;ccedil;o 070daa34 correspondente ao objeto SqlCommand (_command).&lt;/p&gt;
&lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-52-35/2604.comand.PNG"&gt;&lt;img alt="" src="http://blogs.msdn.com/resized-image.ashx/__size/550x0/__key/communityserver-blogs-components-weblogfiles/00-00-01-52-35/2604.comand.PNG" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="line-height: 115%; font-family: 'Calibri','sans-serif'; font-size: 11pt; mso-ansi-language: EN-US; mso-fareast-font-family: Calibri; mso-fareast-theme-font: minor-latin; mso-bidi-font-family: 'Times New Roman'; mso-bidi-theme-font: minor-bidi; mso-fareast-language: EN-US; mso-bidi-language: AR-SA; mso-ascii-theme-font: minor-latin; mso-hansi-theme-font: minor-latin;"&gt;Finalmente para &lt;/span&gt;&lt;span lang="PT" style="color: black; line-height: 115%; font-family: 'Arial','sans-serif'; font-size: 9pt; mso-ansi-language: PT; mso-fareast-font-family: Calibri; mso-fareast-theme-font: minor-latin; mso-fareast-language: EN-US; mso-bidi-language: AR-SA;"&gt;obtermos maiores detalhes deste objeto &amp;eacute; necess&amp;aacute;rio executar o comando !do (!dumpobject) para o endere&amp;ccedil;o 070da99c correspondente ao comando SQL.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span lang="PT" style="color: black; line-height: 115%; font-family: 'Arial','sans-serif'; font-size: 9pt; mso-ansi-language: PT; mso-fareast-font-family: Calibri; mso-fareast-theme-font: minor-latin; mso-fareast-language: EN-US; mso-bidi-language: AR-SA;"&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-52-35/7853.doCommandText.PNG"&gt;&lt;img alt="" src="http://blogs.msdn.com/resized-image.ashx/__size/550x0/__key/communityserver-blogs-components-weblogfiles/00-00-01-52-35/7853.doCommandText.PNG" border="0" /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span lang="PT" style="color: black; line-height: 115%; font-family: 'Arial','sans-serif'; font-size: 9pt; mso-ansi-language: PT; mso-fareast-font-family: Calibri; mso-fareast-theme-font: minor-latin; mso-fareast-language: EN-US; mso-bidi-language: AR-SA;"&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Por se tratar de informa&amp;ccedil;&amp;atilde;o de cliente, n&amp;atilde;o pude mostrar o nome da comando SQL, mas &amp;eacute; poss&amp;iacute;vel verificar que se trata de uma procedure.&amp;nbsp;Para esse caso, a procedure era a respons&amp;aacute;vel pela lentid&amp;atilde;o do servi&amp;ccedil;o.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span lang="PT" style="color: black; line-height: 115%; font-family: 'Arial','sans-serif'; font-size: 9pt; mso-ansi-language: PT; mso-fareast-font-family: Calibri; mso-fareast-theme-font: minor-latin; mso-fareast-language: EN-US; mso-bidi-language: AR-SA;"&gt;&lt;/span&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10330950" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/b/luisdem/archive/tags/Debug/">Debug</category><category domain="http://blogs.msdn.com/b/luisdem/archive/tags/Dump/">Dump</category></item><item><title>Controle de Conta de Usuário (UAC) e o Mapeamento de Drives</title><link>http://blogs.msdn.com/b/luisdem/archive/2012/07/16/controle-de-conta-de-usu-225-rio-uac-e-o-mapeamento-de-drives.aspx</link><pubDate>Mon, 16 Jul 2012 16:30:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:10330212</guid><dc:creator>Luis Henrique Demetrio</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.msdn.com/b/luisdem/rsscomments.aspx?WeblogPostID=10330212</wfw:commentRss><comments>http://blogs.msdn.com/b/luisdem/archive/2012/07/16/controle-de-conta-de-usu-225-rio-uac-e-o-mapeamento-de-drives.aspx#comments</comments><description>&lt;p&gt;Esse &amp;eacute; um problema bastante simples, mas que ocorre frequentemente quando a &amp;aacute;rea de suporte vai realizar o troubleshooting na m&amp;aacute;quina do usu&amp;aacute;rio.&lt;/p&gt;
&lt;p&gt;Imagine o seguinte cen&amp;aacute;rio: o UAC est&amp;aacute; configurado no n&amp;iacute;vel padr&amp;atilde;o e o usu&amp;aacute;rio possui um recurso de rede mapeado para, por exemplo, o drive Z.&lt;/p&gt;
&lt;p&gt;Vamos supor que o suporte tente executar como administrador uma aplica&amp;ccedil;&amp;atilde;o localizada no recurso Z que est&amp;aacute; apresentando problema para diagnosticar se o erro &amp;eacute; decorrente da falta de acesso.&lt;/p&gt;
&lt;p&gt;Quando o suporte executa a aplica&amp;ccedil;&amp;atilde;o como administrador &amp;eacute; gerado outro erro informando ue o mapeamento Z n&amp;atilde;o existe. Entretanto, o mesmo mapeamento &amp;eacute; exibido no Windows Explorer.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Exemplo&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;Abra o prompt de comando e mapeie a pasta Windows para o drive Z, atrav&amp;eacute;s do comando subst Z: C:\Windows. Abra o Windows Explorer e observe que o drive Z est&amp;aacute; mapeado conforme esperado.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-52-35/6874.Figura1.PNG"&gt;&lt;img alt="" src="http://blogs.msdn.com/resized-image.ashx/__size/550x0/__key/communityserver-blogs-components-weblogfiles/00-00-01-52-35/6874.Figura1.PNG" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Execute agora o prompt de comando elevado (bot&amp;atilde;o direito e executar como administrador). Observe que ao tentar acessar o drive Z (digite Z: e pressione enter) &amp;eacute; exibida uma mensagem informando que o drive n&amp;atilde;o existe.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-52-35/4774.Figura2.png"&gt;&lt;img alt="" src="http://blogs.msdn.com/resized-image.ashx/__size/550x0/__key/communityserver-blogs-components-weblogfiles/00-00-01-52-35/4774.Figura2.png" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Motivo&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;Quando um administrador faz logon, o Windows cria dois tokens de acesso separados para o usu&amp;aacute;rio: um token de acesso sem privil&amp;eacute;gios administrativos (token filtrado) e um token de acesso de administrador (token full). Para maiores detalhes veja o artigo &lt;a href="http://blogs.msdn.com/b/luisdem/archive/2012/04/15/controle-de-conta-de-usu-225-rio-uac.aspx"&gt;Controle de Conta de Usu&amp;aacute;rio (UAC)&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Quando recursos de rede s&amp;atilde;o mapeados, eles est&amp;atilde;o associados a sess&amp;atilde;o de logon corrente para o token de acesso do processo atual. Isso significa que, se um usu&amp;aacute;rio usa o prompt de comando (cmd. exe) juntamente com o token de acesso filtrado para mapear um compartilhamento de rede, o compartilhamento de rede n&amp;atilde;o est&amp;aacute; mapeado para processos que s&amp;atilde;o executados com o token de acesso total de administrador.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Solu&amp;ccedil;&amp;atilde;o&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;Existem duas maneiras de resolver esse problema, sendo a primeira duplicar o mapeamento da unidade de rede para o token elevado. Nesse caso, al&amp;eacute;m do primeiro mapeamento &amp;eacute; necess&amp;aacute;rio realizar um segundo atrav&amp;eacute;s do prompt de comando elevado (executado com privil&amp;eacute;gio administrativo).&lt;/p&gt;
&lt;p&gt;A segunda op&amp;ccedil;&amp;atilde;o (n&amp;atilde;o recomendada e n&amp;atilde;o suportada pela Microsoft) &amp;eacute; configurar a chave &lt;b&gt;EnableLinkedConnections&lt;/b&gt; no registro do Windows para compartilhar as conex&amp;otilde;es entre os tokens filtrado e de administrador (full). Ap&amp;oacute;s configurar essa chave,o LSA (Local Security Authority) verifica se existe outro token que est&amp;aacute; associado a sess&amp;atilde;o do usu&amp;aacute;rio e se o recurso de rede est&amp;aacute; mapeado para o token. Caso o LSA determinar que existe o mapeamento para o outro token do usu&amp;aacute;rio, ele adiciona o mapemanento para o token atual.&lt;/p&gt;
&lt;p&gt;Siga os seguintes passos para configurar a chave EnableLinkedConnections:&lt;/p&gt;
&lt;p&gt;1.Abra o Regedit.exe.&lt;/p&gt;
&lt;p&gt;2.Localize a seguinte chave de registro: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System&lt;/p&gt;
&lt;p&gt;3.Crie uma nova subchave do tipo DWORD com o nome EnableLinkedConnections e com o valor 1.&lt;/p&gt;
&lt;p&gt;4.Reinicie o computador.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;Maiores detalhes em: http://support.microsoft.com/kb/937624&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10330212" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/b/luisdem/archive/tags/Compatibilidade+Windows+7/">Compatibilidade Windows 7</category></item><item><title>O Caso da Página ASP.NET Extremamente Lenta</title><link>http://blogs.msdn.com/b/luisdem/archive/2012/06/27/o-caso-da-p-225-gina-asp-net-extremamente-lenta.aspx</link><pubDate>Thu, 28 Jun 2012 00:26:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:10324827</guid><dc:creator>Luis Henrique Demetrio</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.msdn.com/b/luisdem/rsscomments.aspx?WeblogPostID=10324827</wfw:commentRss><comments>http://blogs.msdn.com/b/luisdem/archive/2012/06/27/o-caso-da-p-225-gina-asp-net-extremamente-lenta.aspx#comments</comments><description>&lt;p&gt;O cliente estava enfrentando um problema de lentid&amp;atilde;o em um dos seus sites. Os usu&amp;aacute;rios n&amp;atilde;o conseguiam navegar entre as p&amp;aacute;ginas alegando que a p&amp;aacute;gina ficava &amp;ldquo;em branco&amp;rdquo; e depois gerava timeout.&lt;/p&gt;
&lt;p&gt;Coletamos um DUMP no momento da lentid&amp;atilde;o para analisarmos a causa da lentid&amp;atilde;o.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Comandos Executados&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="background-color: #ffff00;"&gt;.load psscor2&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Esse comando &amp;eacute; utilizado para carregar a extens&amp;atilde;o de depura&amp;ccedil;&amp;atilde;o de c&amp;oacute;digo gerenciado &lt;a href="http://www.microsoft.com/downloads/details.aspx?FamilyID=5c068e9f-ebfe-48a5-8b2f-0ad6ab454ad4&amp;amp;amp;amp;displayLang=en&amp;amp;displaylang=en"&gt;Psscor2&lt;/a&gt;&amp;nbsp;que &amp;eacute; utilizada para ajudar no diagn&amp;oacute;stico de problemas em aplica&amp;ccedil;&amp;otilde;es do Framework .Net, para as vers&amp;otilde;es 2.0, 3.0 e 3.5.&lt;/p&gt;
&lt;p&gt;&lt;span style="background-color: #ffff00;"&gt;!threadpool&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;No momento em que o DUMP foi coletado a quantidade de threads em execu&amp;ccedil;&amp;atilde;o era superior a metade do valor limite do pool de threads.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-52-35/1581.Figura0.PNG"&gt;&lt;img alt="" src="http://blogs.msdn.com/resized-image.ashx/__size/550x0/__key/communityserver-blogs-components-weblogfiles/00-00-01-52-35/1581.Figura0.PNG" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Atrav&amp;eacute;s do resultado &amp;eacute; poss&amp;iacute;vel verificar que o problema de desempenho n&amp;atilde;o &amp;eacute; decorrente do consumo de processamento.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;span style="background: yellow; color: black; line-height: 115%; font-family: Courier; font-size: 9pt; mso-ansi-language: EN-US; mso-fareast-font-family: Calibri; mso-fareast-theme-font: minor-latin; mso-bidi-font-family: 'Times New Roman'; mso-bidi-theme-font: minor-bidi; mso-highlight: yellow; mso-fareast-language: EN-US; mso-bidi-language: AR-SA;"&gt;!eestack &amp;ndash;ee&lt;/span&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;Esse comando permite investigar o callstack das threads&amp;nbsp;gerenciadas. Observe que a maioria&amp;nbsp;das threads estavam executando os seguintes m&amp;eacute;todos:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-52-35/1323.Figura1.PNG"&gt;&lt;img alt="" src="http://blogs.msdn.com/resized-image.ashx/__size/550x0/__key/communityserver-blogs-components-weblogfiles/00-00-01-52-35/1323.Figura1.PNG" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Praticamente todas as threads estavam executando os mesmos m&amp;eacute;todos.&lt;/p&gt;
&lt;p&gt;&lt;span style="background-color: #ffff00;"&gt;kb&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Atrav&amp;eacute;s desse commando &amp;eacute; poss&amp;iacute;vel analisar a&amp;nbsp;pilha de chamadas n&amp;atilde;o gerenciada dessas threads.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-52-35/5140.Figura2.PNG"&gt;&lt;img alt="" src="http://blogs.msdn.com/resized-image.ashx/__size/550x0/__key/communityserver-blogs-components-weblogfiles/00-00-01-52-35/5140.Figura2.PNG" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Observe que o callstack da thread acima mostra que ela est&amp;aacute; bloqueada por outra thread. O mesmo ocorre para a maioria das outras threads.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;!syncblk&lt;/p&gt;
&lt;p&gt;A figura abaixo mostra que a thread&amp;nbsp;156 est&amp;aacute; bloqueando (lock) as demais threads (348 no total).&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-52-35/2541.Figura3.PNG"&gt;&lt;img alt="" src="http://blogs.msdn.com/resized-image.ashx/__size/550x0/__key/communityserver-blogs-components-weblogfiles/00-00-01-52-35/2541.Figura3.PNG" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;A an&amp;aacute;lise do callstack da thread 156 mostra que a ferramenta &lt;strong&gt;CA Wily Introscope&lt;/strong&gt; &amp;eacute; quem est&amp;aacute; controlando essa thread e n&amp;atilde;o est&amp;aacute; liberando o LOCK.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-52-35/8446.Figura4.PNG"&gt;&lt;img alt="" src="http://blogs.msdn.com/resized-image.ashx/__size/550x0/__key/communityserver-blogs-components-weblogfiles/00-00-01-52-35/8446.Figura4.PNG" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;O problema foi resolvido desativando o servi&amp;ccedil;o CA Wily Introscope.&lt;/p&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=10324827" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/b/luisdem/archive/tags/Debug/">Debug</category><category domain="http://blogs.msdn.com/b/luisdem/archive/tags/Dump/">Dump</category></item><item><title>Serviço .NET Travando Intermitentemente</title><link>http://blogs.msdn.com/b/luisdem/archive/2012/06/24/servi-231-o-net-travando-intermitentemente.aspx</link><pubDate>Sun, 24 Jun 2012 21:24:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:10323365</guid><dc:creator>Luis Henrique Demetrio</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.msdn.com/b/luisdem/rsscomments.aspx?WeblogPostID=10323365</wfw:commentRss><comments>http://blogs.msdn.com/b/luisdem/archive/2012/06/24/servi-231-o-net-travando-intermitentemente.aspx#comments</comments><description>&lt;p&gt;Uma vez trabalhei em um caso onde um servi&amp;ccedil;o intermitentemente parava de atender as requisi&amp;ccedil;&amp;otilde;es do System.Runtime.Remoting sem gerar nenhum log de erro.&lt;/p&gt;
&lt;p&gt;O erro ocorria no ambiente de produ&amp;ccedil;&amp;atilde;o e a primeira a&amp;ccedil;&amp;atilde;o tomada foi coletar um dump&amp;nbsp;&amp;nbsp;no momento do travamento.&lt;/p&gt;
&lt;p&gt;Existem v&amp;aacute;rias formas e cen&amp;aacute;rios para coletar um dump. Nesse caso espec&amp;iacute;fico, o dump pode ser coletado atrav&amp;eacute;s do gerenciador de tarefas do Windows. Na aba Processos do Gerenciador de Tarefas, localize o processo do servi&amp;ccedil;o e clique em Create a dump file (ou criar arquivo de despejo).&lt;/p&gt;
&lt;p&gt;Utilizamos o &lt;a href="http://msdn.microsoft.com/en-us/windows/hardware/gg463009.aspx"&gt;WinDbg&lt;/a&gt;&amp;nbsp;para abrir e analisar o dump. O&amp;nbsp; WinDbg &amp;eacute; um User mode e Kernel mode debugger com uma interface gr&amp;aacute;fica que usa a infraestrutura dos debuggers NTSD, CDB e KD para prover um ambiente mais&amp;nbsp;parecido com o Visual Studio, com janelas de watch, breakpoints visuais em linhas de c&amp;oacute;digo e outras facilidades, por exemplo, exibir vari&amp;aacute;veis (incluindo objetos C++), stack traces e mem&amp;oacute;ria.&lt;/p&gt;
&lt;p&gt;Tamb&amp;eacute;m utilizamos a extens&amp;atilde;o &lt;a href="http://www.microsoft.com/downloads/details.aspx?FamilyID=5c068e9f-ebfe-48a5-8b2f-0ad6ab454ad4&amp;amp;amp;amp;displayLang=en&amp;amp;displaylang=en"&gt;Psscor2&lt;/a&gt; do WinDbg criada para ajudar no diagn&amp;oacute;stico de problemas de alto consumo de mem&amp;oacute;ria, alto consumo de processamento, chashes, hangs e outros problemas que podem ocorrer em aplica&amp;ccedil;&amp;otilde;es do Framework .Net, para as vers&amp;otilde;es 2.0, 3.0 e 3.5.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Comandos Executados&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="background-color: #ffff00;"&gt;.load psscor2&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Esse comando &amp;eacute; executado para carregar a extens&amp;atilde;o de depura&amp;ccedil;&amp;atilde;o de c&amp;oacute;digo gerenciado&amp;nbsp;&lt;a href="http://www.microsoft.com/downloads/details.aspx?FamilyID=5c068e9f-ebfe-48a5-8b2f-0ad6ab454ad4&amp;amp;amp;amp;displayLang=en&amp;amp;displaylang=en"&gt;Psscor2&lt;/a&gt;&amp;nbsp;que &amp;eacute; utilizada para ajudar no diagn&amp;oacute;stico de problemas em aplica&amp;ccedil;&amp;otilde;es do Framework .Net, para as vers&amp;otilde;es 2.0, 3.0 e 3.5.&lt;/p&gt;
&lt;p&gt;&lt;span style="background-color: #ffff00;"&gt;!threads&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Esse comando &amp;eacute; utilizado para obter as informa&amp;ccedil;&amp;otilde;es de cada thread gerenciada do sistema incluindo a &amp;uacute;ltima exce&amp;ccedil;&amp;atilde;o que foi gerada pela thread. O objetivo da execu&amp;ccedil;&amp;atilde;o desse comando &amp;eacute; verificar quais eram as threads que estavam sendo executadas e se haviam exce&amp;ccedil;&amp;otilde;es geradas pelas threads, conforme exibido a seguir:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-52-35/4812.Figura1.PNG"&gt;&lt;img alt="" src="http://blogs.msdn.com/resized-image.ashx/__size/550x500/__key/communityserver-blogs-components-weblogfiles/00-00-01-52-35/4812.Figura1.PNG" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Atrav&amp;eacute;s do resultado acima &amp;eacute; poss&amp;iacute;vel observar uma quantidade elevada de threads sendo executada (4007) e uma quantidade elevada de threads (4005) aguardando enfileirada.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-52-35/4812.Figura1.PNG"&gt;&lt;/a&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style="background-color: #ffff00;"&gt;!eestack &amp;ndash;ee&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Atrav&amp;eacute;s desse commando &amp;eacute; poss&amp;iacute;vel obter o call stack de todas as threads gerenciadas do processo. Ao analisar a pilha dessas threads &amp;eacute; poss&amp;iacute;vel identificar que a maioria das 4000 threads estavam executando o m&amp;eacute;todo&amp;nbsp; SerializeToDisk da classe RefDataCacheController, conforme exibido a seguir:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-52-35/4274.Figura2.PNG"&gt;&lt;img alt="" src="http://blogs.msdn.com/resized-image.ashx/__size/550x0/__key/communityserver-blogs-components-weblogfiles/00-00-01-52-35/4274.Figura2.PNG" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&lt;span style="background-color: #ffff00;"&gt;!threadpool&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;Esse comando &amp;eacute; utilizado para exibir o estado do thread pool durante o momento em que o dump foi coletado. Atrav&amp;eacute;s desse identificamos que a quantidade de threads utilizadas pela aplica&amp;ccedil;&amp;atilde;o atingiu o valor m&amp;aacute;ximo do limite dispon&amp;iacute;vel no ThreadPool, conforme exibido a seguir:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-52-35/1207.Figura3.PNG"&gt;&lt;img alt="" src="http://blogs.msdn.com/resized-image.ashx/__size/550x0/__key/communityserver-blogs-components-weblogfiles/00-00-01-52-35/1207.Figura3.PNG" border="0" /&gt;&lt;/a&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-52-35/8867.Figura4.PNG"&gt;&lt;/a&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Al&amp;eacute;m de todas threads do thread pool estarem ocupadas, havia uma fila de 36522 work items para serem executados pelo thread pool. Uma vez&amp;nbsp; que o remoting utiliza o thread pool para atender as requisi&amp;ccedil;&amp;otilde;es remotas,&amp;nbsp; o servi&amp;ccedil;o n&amp;atilde;o para de atender as requisi&amp;ccedil;&amp;otilde;es de remoting.&lt;/p&gt;
&lt;p&gt;Atrav&amp;eacute;s da execu&amp;ccedil;&amp;atilde;o dos comandos citados anteriormente foi poss&amp;iacute;vel identificar que o processo estava consumindo todas as threads dispon&amp;iacute;veis no thread pool e que essas threads executavam o m&amp;eacute;todo&amp;nbsp; SerializeToDisk da classe RefDataCacheController.&lt;/p&gt;
&lt;p&gt;Ao analisar o c&amp;oacute;digo-fonte da aplica&amp;ccedil;&amp;atilde;o identificamos que esse m&amp;eacute;todo &amp;eacute; executado a cada segundo atrav&amp;eacute;s de um Timer (System.Threading.Timer) definido no construtor dessa classe. Nesse m&amp;eacute;todo existe um c&amp;oacute;digo respons&amp;aacute;vel por desativar o timer visando garantir que apenas uma thread seja executada ao mesmo tempo e que n&amp;atilde;o haja enfileiramento, conforme destacado no fragmento de c&amp;oacute;digo a seguir:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-52-35/8877.Figura4.PNG"&gt;&lt;img alt="" src="http://blogs.msdn.com/resized-image.ashx/__size/550x0/__key/communityserver-blogs-components-weblogfiles/00-00-01-52-35/8877.Figura4.PNG" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;O fato da fun&amp;ccedil;&amp;atilde;o respons&amp;aacute;vel por desativar o timer ser executado dentro do lock (bloco respons&amp;aacute;vel por garantir que apenas uma thread execute ao mesmo tempo) possibilita que mais de uma thread seja executada simultaneamente quando, por exemplo, houver uma demora na execu&amp;ccedil;&amp;atilde;o das duas fun&amp;ccedil;&amp;otilde;es que s&amp;atilde;o executadas antes desse bloco.&amp;nbsp; O intervalo de um segundo do timer mais o atraso na execu&amp;ccedil;&amp;atilde;o dessas fun&amp;ccedil;&amp;otilde;es permite que a primeira thread habilite o timer justamente ap&amp;oacute;s o momento em que a segunda thread desativa o mesmo.&lt;/p&gt;
&lt;p&gt;&amp;Eacute; importante ressaltar que a classe System.Threading.Timer &amp;eacute; thread safe, dessa forma, suas opera&amp;ccedil;&amp;otilde;es n&amp;atilde;o precisam ser sincronizadas podendo ser removida dentro do lock.&lt;/p&gt;
&lt;p&gt;A equipe de desenvolvimento foi alertada para rever a periodicidade ao qual o timer deve ser executado e alterar o m&amp;eacute;todo SerializeToDisk para que o m&amp;eacute;todo respons&amp;aacute;vel por desativar a thread seja o primeiro a ser executado.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10323365" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/b/luisdem/archive/tags/Debug/">Debug</category><category domain="http://blogs.msdn.com/b/luisdem/archive/tags/Dump/">Dump</category></item><item><title>Como Determinar se o Usuário é Membro do Grupo Administrador no Windows 7 com o UAC habilitado</title><link>http://blogs.msdn.com/b/luisdem/archive/2012/06/21/como-determinar-se-o-usu-225-rio-233-membro-do-grupo-administrador-no-windows-7-com-o-uac-habilitado.aspx</link><pubDate>Thu, 21 Jun 2012 17:58:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:10322693</guid><dc:creator>Luis Henrique Demetrio</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.msdn.com/b/luisdem/rsscomments.aspx?WeblogPostID=10322693</wfw:commentRss><comments>http://blogs.msdn.com/b/luisdem/archive/2012/06/21/como-determinar-se-o-usu-225-rio-233-membro-do-grupo-administrador-no-windows-7-com-o-uac-habilitado.aspx#comments</comments><description>&lt;p&gt;Com o UAC habilitado no n&amp;iacute;vel padr&amp;atilde;o, todas as contas de usu&amp;aacute;rio, incluindo contas administrativas, executam com direitos de usu&amp;aacute;rio padr&amp;atilde;o.&lt;/p&gt;
&lt;p&gt;Quando um usu&amp;aacute;rio faz logon no Windows, o sistema cria um token de acesso para ele. Esse token cont&amp;eacute;m informa&amp;ccedil;&amp;otilde;es sobre o n&amp;iacute;vel de acesso que &amp;eacute; concedido ao usu&amp;aacute;rio, incluindo os identificadores de seguran&amp;ccedil;a (SIDs) e privil&amp;eacute;gios do Windows. Quando um administrador faz logon, o Windows cria dois tokens de acesso separados para o usu&amp;aacute;rio: um token de acesso sem privil&amp;eacute;gios administrativos (token filtrado) e um token de acesso de administrador (token full).&lt;/p&gt;
&lt;p&gt;Para maiores detalhes sobre UAC veja o artigo: &lt;span lang="PT-BR" style="line-height: 115%; font-family: 'Calibri','sans-serif'; font-size: 11pt; mso-ansi-language: PT-BR; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: Calibri; mso-fareast-theme-font: minor-latin; mso-hansi-theme-font: minor-latin; mso-bidi-font-family: 'Times New Roman'; mso-bidi-theme-font: minor-bidi; mso-fareast-language: EN-US; mso-bidi-language: AR-SA;"&gt;&lt;a href="http://blogs.msdn.com/b/luisdem/archive/2012/04/15/controle-de-conta-de-usu-225-rio-uac.aspx"&gt;Controle de Conta de Usu&amp;aacute;rio (UAC)&lt;/a&gt;&lt;/span&gt;.&lt;/p&gt;
&lt;p&gt;O UAC &amp;eacute; um grande avan&amp;ccedil;o para a seguran&amp;ccedil;a. No entanto, esse avan&amp;ccedil;o quebra alguns paradigmas que voc&amp;ecirc; pode estar acostumado a usar para desenvolver aplicativos. Por exemplo, verificar se o usu&amp;aacute;rio &amp;eacute; administrador.&lt;/p&gt;
&lt;p&gt;Se voc&amp;ecirc; utiliza a API &lt;b&gt;IsUserAnAdmin&lt;/b&gt; do shell32 ou as classes WindowsIdentity e WindowsPrincipal do .NET Framework (veja o fragmento de c&amp;oacute;digo a seguir), voc&amp;ecirc; descobrir&amp;aacute; que eles retornam verdadeiro quando o processo estiver elevado e falso caso contr&amp;aacute;rio.&amp;nbsp;&lt;/p&gt;
&lt;pre class="scroll"&gt;&lt;code class="csharp"&gt;bool IsUserAdministrator()&lt;br /&gt; {&lt;br /&gt; WindowsIdentity identity = WindowsIdentity.GetCurrent();&lt;br /&gt; WindowsPrincipal principal = new WindowsPrincipal(identity);&lt;br /&gt; return principal.IsInRole (WindowsBuiltInRole.Administrator);&lt;br /&gt;&lt;/code&gt;&lt;code class="csharp"&gt; }&lt;/code&gt;&lt;span style="font-size: medium;"&gt;&lt;code class="csharp"&gt;&lt;br /&gt; &lt;/code&gt;&lt;/span&gt;&lt;/pre&gt;
&lt;p&gt;O resultado est&amp;aacute; correto, entretanto, em alguns casos o valor n&amp;atilde;o informa se o usu&amp;aacute;rio &amp;eacute; administrador independentemente se a aplica&amp;ccedil;&amp;atilde;o est&amp;aacute; sendo executada elevada.&lt;/p&gt;
&lt;p&gt;A API &lt;b&gt;GetTokenInformation&lt;/b&gt; do advapi32.dll permite determinar qual &amp;eacute; o token que o usu&amp;aacute;rio est&amp;aacute; utilizando e com isso &amp;eacute; poss&amp;iacute;vel &lt;b&gt;assumir&lt;/b&gt; (isso mesmo, veja mais adiante) se o usu&amp;aacute;rio &amp;eacute; administrador independemente se o processo est&amp;aacute; ou n&amp;atilde;o elevado. &amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre class="scroll"&gt;&lt;code class="csharp"&gt;[DllImport("advapi32.dll", SetLastError = true)]&lt;br /&gt; static extern bool GetTokenInformation(IntPtr tokenHandle, TokenInformationClass tokenInformationClass, IntPtr tokenInformation, int tokenInformationLength, out int returnLength);&lt;br /&gt; &lt;br /&gt; /// &amp;lt;summary&amp;gt;&lt;br /&gt; /// Passed to &amp;lt;see cref="GetTokenInformation"/&amp;gt; to specify what&lt;br /&gt; /// information about the token to return.&lt;br /&gt; /// &amp;lt;/summary&amp;gt;&lt;br /&gt; enum TokenInformationClass&lt;br /&gt; {&lt;br /&gt; TokenUser = 1,&lt;br /&gt; TokenGroups,&lt;br /&gt; TokenPrivileges,&lt;br /&gt; TokenOwner,&lt;br /&gt; TokenPrimaryGroup,&lt;br /&gt; TokenDefaultDacl,&lt;br /&gt; TokenSource,&lt;br /&gt; TokenType,&lt;br /&gt; TokenImpersonationLevel,&lt;br /&gt; TokenStatistics,&lt;br /&gt; TokenRestrictedSids,&lt;br /&gt; TokenSessionId,&lt;br /&gt; TokenGroupsAndPrivileges,&lt;br /&gt; TokenSessionReference,&lt;br /&gt; TokenSandBoxInert,&lt;br /&gt; TokenAuditPolicy,&lt;br /&gt; TokenOrigin,&lt;br /&gt; TokenElevationType,&lt;br /&gt; TokenLinkedToken,&lt;br /&gt; TokenElevation,&lt;br /&gt; TokenHasRestrictions,&lt;br /&gt; TokenAccessInformation,&lt;br /&gt; TokenVirtualizationAllowed,&lt;br /&gt; TokenVirtualizationEnabled,&lt;br /&gt; TokenIntegrityLevel,&lt;br /&gt; TokenUiAccess,&lt;br /&gt; TokenMandatoryPolicy,&lt;br /&gt; TokenLogonSid,&lt;br /&gt; MaxTokenInfoClass&lt;br /&gt; }&lt;br /&gt; &lt;br /&gt; /// &amp;lt;summary&amp;gt;&lt;br /&gt; /// The elevation type for a user token.&lt;br /&gt; /// &amp;lt;/summary&amp;gt;&lt;br /&gt; enum TokenElevationType&lt;br /&gt; {&lt;br /&gt; TokenElevationTypeDefault = 1,&lt;br /&gt; TokenElevationTypeFull,&lt;br /&gt; TokenElevationTypeLimited&lt;br /&gt; }&lt;br /&gt; &lt;br /&gt; &lt;br /&gt; bool IsUserAnAdministrator() {&lt;br /&gt; &lt;br /&gt; WindowsIdentity identity = WindowsIdentity.GetCurrent();&lt;br /&gt; WindowsPrincipal principal = new WindowsPrincipal(identity);&lt;br /&gt; &lt;br /&gt; // Verifica se o usu&amp;aacute;rio tem a role de Admin. Caso tiver retorna verdadeiro.&lt;br /&gt; // Se o UAC estiver habilitado e o processo n&amp;atilde;o estiver elevado a verifica&amp;ccedil;&amp;atilde;o abaixo retornar&amp;aacute; falso &lt;br /&gt; //independentemente se o usu&amp;aacute;rio pertencer ao grupo administrador&lt;br /&gt; if (principal.IsInRole(WindowsBuiltInRole.Administrator)) return true;&lt;br /&gt; &lt;br /&gt; // Se o processo n&amp;atilde;o estiver executando a partir do Vista, n&amp;atilde;o &amp;eacute; necess&amp;aacute;rio realizar a verifica&amp;ccedil;&amp;atilde;o do UAC.&lt;br /&gt; if (Environment.OSVersion.Platform != PlatformID.Win32NT || Environment.OSVersion.Version.Major &amp;lt; 6)&lt;br /&gt; {&lt;br /&gt; return false;&lt;br /&gt; }&lt;br /&gt; &lt;br /&gt; int tokenInfLength = Marshal.SizeOf(typeof(int));&lt;br /&gt; IntPtr tokenInformation = Marshal.AllocHGlobal(tokenInfLength);&lt;br /&gt; &lt;br /&gt; try&lt;br /&gt; {&lt;br /&gt; var token = identity.Token;&lt;br /&gt; var result = GetTokenInformation(token, TokenInformationClass.TokenElevationType, tokenInformation, tokenInfLength, out tokenInfLength);&lt;br /&gt; &lt;br /&gt; if (!result)&lt;br /&gt; {&lt;br /&gt; var exception = Marshal.GetExceptionForHR(Marshal.GetHRForLastWin32Error());&lt;br /&gt; throw new InvalidOperationException("N&amp;atilde;o foi poss&amp;iacute;vel obter a informa&amp;ccedil;&amp;atilde;o do TOKEN", exception);&lt;br /&gt; }&lt;br /&gt; &lt;br /&gt; var elevationType = (TokenElevationType)Marshal.ReadInt32(tokenInformation);&lt;br /&gt; &lt;br /&gt; switch (elevationType)&lt;br /&gt; {&lt;br /&gt; case TokenElevationType.TokenElevationTypeDefault:&lt;br /&gt; // TokenElevationTypeDefault - O usu&amp;aacute;rio possui apenas um token, portanto n&amp;atilde;o &amp;eacute; administrador.&lt;br /&gt; return false;&lt;br /&gt; case TokenElevationType.TokenElevationTypeFull:&lt;br /&gt; // TokenElevationTypeFull - O usu&amp;aacute;rio possui dois tokens e o processo est&amp;aacute; sendo executado elevado.&lt;br /&gt; return true;&lt;br /&gt; case TokenElevationType.TokenElevationTypeLimited:&lt;br /&gt; // TokenElevationTypeLimited - O usu&amp;aacute;rio possui dois tokens mas o processo n&amp;atilde;o est&amp;aacute; sendo executado elevado. &lt;br /&gt; return true;&lt;br /&gt; default:&lt;br /&gt; // N&amp;atilde;o foi poss&amp;iacute;vel determinar qual o token do usu&amp;aacute;rio.&lt;br /&gt; return false;&lt;br /&gt; }&lt;br /&gt; }&lt;br /&gt; finally&lt;br /&gt; {&lt;br /&gt; if (tokenInformation != IntPtr.Zero) Marshal.FreeHGlobal(tokenInformation);&lt;br /&gt; }&lt;br /&gt; &lt;br /&gt; }&lt;br /&gt; &lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-size: small;"&gt;Observe que essa t&amp;eacute;cnica apenas detecta qual &amp;eacute; o token que o usu&amp;aacute;rio possui. Na maioria das situa&amp;ccedil;&amp;otilde;es, isso ir&amp;aacute; determinar se o usu&amp;aacute;rio est&amp;aacute; executando como administrador. No entanto, existem outros tipos de usu&amp;aacute;rios com permiss&amp;otilde;es avan&amp;ccedil;adas que podem gerar uma divis&amp;atilde;o de token durante um logon interativo (por exemplo, o grupo operadores de configura&amp;ccedil;&amp;atilde;o de rede). Se voc&amp;ecirc; estiver usando um desses grupos de permiss&amp;atilde;o avan&amp;ccedil;ada, esta t&amp;eacute;cnica ir&amp;aacute; determinar o tipo de eleva&amp;ccedil;&amp;atilde;o e n&amp;atilde;o a presen&amp;ccedil;a (ou aus&amp;ecirc;ncia) de credenciais de administrador.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-size: small;"&gt;Se o UAC estiver desabilitado, a API&amp;nbsp; ir&amp;aacute; retornar apenas o TOKEN TokenElevationTypeDefault. Caso o usu&amp;aacute;rio estiver logado como administrador o nosso c&amp;oacute;digo de exemplo ir&amp;aacute; identific&amp;aacute;-lo erroneamente como usu&amp;aacute;rio comum. Por isso, nesse caso, &amp;eacute; importante combinar os dois tipos de verifica&amp;ccedil;&amp;atilde;o (IsUserAnAdmin ou WindowsIdentity e WindowsPrincipal) com o TOKEN.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-size: small;"&gt;Para finalizar, a n&amp;atilde;o ser que voc&amp;ecirc; realmente precise e saiba o que est&amp;aacute; fazendo, n&amp;atilde;o utilize esses mecanismos de verifica&amp;ccedil;&amp;atilde;o. Caso voc&amp;ecirc; precise de direitos administrativos, crie, por exemplo, um manifesto para sua aplica&amp;ccedil;&amp;atilde;o e defina que a aplica&amp;ccedil;&amp;atilde;o precisa ser executada com privil&amp;eacute;gios administrativos.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-size: small;"&gt;No Visual Studio &amp;eacute; poss&amp;iacute;vel definir essa configura&amp;ccedil;&amp;atilde;o atrav&amp;eacute;s do manifesto da aplica&amp;ccedil;&amp;atilde;o localizado na pasta properties do projeto, conforme:&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre class="scroll"&gt;&lt;code class="csharp"&gt; &amp;lt;?xml version="1.0" encoding="utf-8"?&amp;gt;&lt;br /&gt; &amp;lt;asmv1:assembly manifestVersion="1.0" xmlns="urn:schemas-microsoft-com:asm.v1" xmlns:asmv1="urn:schemas-microsoft-com:asm.v1" xmlns:asmv2="urn:schemas-microsoft-com:asm.v2" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"&amp;gt;&lt;br /&gt; &amp;lt;assemblyIdentity version="1.0.0.0" name="MyApplication.app" /&amp;gt;&lt;br /&gt; &amp;lt;trustInfo xmlns="urn:schemas-microsoft-com:asm.v2"&amp;gt;&lt;br /&gt; &amp;lt;security&amp;gt;&lt;br /&gt; &amp;lt;requestedPrivileges xmlns="urn:schemas-microsoft-com:asm.v3"&amp;gt;&lt;br /&gt; &amp;lt;!-- UAC Manifest Options&lt;br /&gt; If you want to change the Windows User Account Control level replace the &lt;br /&gt; requestedExecutionLevel node with one of the following.&lt;br /&gt; &lt;br /&gt; &amp;lt;requestedExecutionLevel level="asInvoker" uiAccess="false" /&amp;gt;&lt;br /&gt; &amp;lt;requestedExecutionLevel level="requireAdministrator" uiAccess="false" /&amp;gt;&lt;br /&gt; &amp;lt;requestedExecutionLevel level="highestAvailable" uiAccess="false" /&amp;gt;&lt;br /&gt; &lt;br /&gt; If you want to utilize File and Registry Virtualization for backward &lt;br /&gt; compatibility then delete the requestedExecutionLevel node.&lt;br /&gt; --&amp;gt;&lt;br /&gt; &lt;br /&gt; &amp;lt;requestedExecutionLevel level="asInvoker" uiAccess="false" /&amp;gt;&lt;br /&gt; &amp;lt;/requestedPrivileges&amp;gt;&lt;br /&gt; &amp;lt;applicationRequestMinimum&amp;gt;&lt;br /&gt; &amp;lt;defaultAssemblyRequest permissionSetReference="Custom" /&amp;gt;&lt;br /&gt; &amp;lt;PermissionSet class="System.Security.PermissionSet" version="1" ID="Custom" SameSite="site" Unrestricted="true" /&amp;gt;&lt;br /&gt; &amp;lt;/applicationRequestMinimum&amp;gt;&lt;br /&gt; &amp;lt;/security&amp;gt;&lt;br /&gt; &amp;lt;/trustInfo&amp;gt;&lt;br /&gt; &amp;lt;/asmv1:assembly&amp;gt;&lt;br /&gt; &lt;/code&gt;&lt;/pre&gt;
&lt;pre class="scroll"&gt;&lt;code class="csharp"&gt;&lt;/code&gt;&amp;nbsp;&lt;/pre&gt;
&lt;p&gt;A tabela a seguir descreve os tipos de execu&amp;ccedil;&amp;atilde;o:&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;table style="width: 622px;" border="0" cellspacing="0" cellpadding="0"&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td width="134"&gt;
&lt;p&gt;&lt;b&gt;N&amp;iacute;vel&amp;nbsp;de Execu&amp;ccedil;&amp;atilde;o&lt;/b&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td width="488"&gt;
&lt;p&gt;&lt;b&gt;Descri&amp;ccedil;&amp;atilde;o&lt;/b&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td width="134" valign="top"&gt;
&lt;p&gt;asInvoker&lt;/p&gt;
&lt;/td&gt;
&lt;td width="488" valign="top"&gt;
&lt;p&gt;Executa a&amp;nbsp;aplica&amp;ccedil;&amp;atilde;o com o token atual. Nunca solicita eleva&amp;ccedil;&amp;atilde;o.&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td width="134" valign="top"&gt;
&lt;p&gt;highestAvailable&lt;/p&gt;
&lt;/td&gt;
&lt;td width="488" valign="top"&gt;
&lt;p&gt;Tenta usar&amp;nbsp;os direitos de usu&amp;aacute;rio mais alto dispon&amp;iacute;veis. Solicitar&amp;aacute; o modo de aprova&amp;ccedil;&amp;atilde;o&lt;br /&gt;&amp;nbsp; de administrador caso o usu&amp;aacute;rio for administrador.&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td width="134" valign="top"&gt;
&lt;p&gt;requireAdministrator&lt;/p&gt;
&lt;/td&gt;
&lt;td width="488" valign="top"&gt;
&lt;p&gt;Solicitar&amp;aacute; eleva&amp;ccedil;&amp;atilde;o, a menos que ser que o processo pai j&amp;aacute; esteja elevado.&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=10322693" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/b/luisdem/archive/tags/Compatibilidade+Windows+7/">Compatibilidade Windows 7</category></item><item><title>Oracle Enterprise Manager 10g Grid Control no Windows 7</title><link>http://blogs.msdn.com/b/luisdem/archive/2012/06/01/oracle-enterprise-manager-10g-grid-control-no-windows-7.aspx</link><pubDate>Fri, 01 Jun 2012 21:18:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:10313789</guid><dc:creator>Luis Henrique Demetrio</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.msdn.com/b/luisdem/rsscomments.aspx?WeblogPostID=10313789</wfw:commentRss><comments>http://blogs.msdn.com/b/luisdem/archive/2012/06/01/oracle-enterprise-manager-10g-grid-control-no-windows-7.aspx#comments</comments><description>&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Em um dos trabalhos de compatibilidade realizados, o cliente me informou que a ferramenta Oracle Enterprise Manager 10g s&amp;oacute; funcionava no Windows 7 quando&amp;nbsp;&amp;nbsp;executada com privil&amp;eacute;gios administrativos. Caso contr&amp;aacute;rio, a aplica&amp;ccedil;&amp;atilde;o era encerrada (Crash) ap&amp;oacute;s o usu&amp;aacute;rio fornecer suas credenciais.&lt;/p&gt;
&lt;p&gt;Informei ao cliente que por se tratar de uma ferramenta de terceiros, que o recomendado era acionar o fornecedor e solicitar o suporte at&amp;eacute; mesmo para evitar perder qualquer tipo de garantia do produto ou suporte.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Devido &amp;agrave; urg&amp;ecirc;ncia e aval do cliente, seguimos com o processo de troubleshooting.&lt;/p&gt;
&lt;p&gt;O problema ocorria nas seguintes ferramentas: Enterprise Manager, Oracle SQL Plus e Oracle Export.&lt;/p&gt;
&lt;p&gt;O seguinte erro era gerado no console do &lt;b&gt;&lt;i&gt;Enterprise Manager&lt;/i&gt;&lt;/b&gt;:&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre class="scroll"&gt;&lt;code class="java"&gt; Unexpected Signal : EXCEPTION_ACCESS_VIOLATION (0xc0000005) occurred at PC=0x8077E76&lt;br /&gt; &lt;br /&gt; Function=[Unknown.]&lt;br /&gt; &lt;br /&gt; Library=C:\oracle\product\10.2.0\client_1\jdk\jre\bin\client\jvm.dll &lt;br /&gt; &lt;br /&gt; &lt;br /&gt; Current Java thread: &lt;br /&gt; at oracle.jdbc.driver.T2CConnection.t2cCreateState(Native Method) &lt;br /&gt; at oracle.jdbc.driver.T2CConnection.logon(T2CConnection.java:346)&lt;br /&gt; at oracle.jdbc.driver.PhysicalConnection.&amp;lt;init&amp;gt;(PhysicalConnection.java:414) &lt;br /&gt; at oracle.jdbc.driver.T2CConnection.&amp;lt;init&amp;gt;(T2CConnection.java:132)&lt;br /&gt; at oracle.jdbc.driver.T2CDriverExtension.getConnection(T2CDriverExtension.java:78) &lt;br /&gt; at oracle.jdbc.driver.OracleDriver.connect(OracleDriver.java:801)&lt;br /&gt; &lt;/code&gt;&lt;/pre&gt;
&lt;pre class="scroll"&gt;&lt;code class="java"&gt;&lt;/code&gt;&amp;nbsp;&lt;/pre&gt;
&lt;p&gt;No &lt;b&gt;&lt;i&gt;Oracle SQL Plus&lt;/i&gt;&lt;/b&gt;, atrav&amp;eacute;s de um DUMP, identificamos que o seguinte erro ocorria ap&amp;oacute;s o CRASH:&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre class="scroll"&gt;&lt;code class="java"&gt;sp2-1053 unable to initialize Oracle call interface&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;J&amp;aacute; no &lt;b&gt;&lt;i&gt;Oracle Export&lt;/i&gt;&lt;/b&gt; a aplica&amp;ccedil;&amp;atilde;o n&amp;atilde;o exportava as tabelas e gerava o seguinte erro quando n&amp;atilde;o era executada com o perfil de administrador:&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre class="scroll"&gt;&lt;code class="java"&gt; Export: Release 10.2.0.1.0 - Production on Sex Jan 6 14:26:07 2012&lt;br /&gt; &lt;br /&gt; &lt;br /&gt; Copyright (c) 1982, 2005, Oracle. All rights reserved.&lt;br /&gt;&lt;br /&gt; EXP-00056:&lt;br /&gt; &lt;br /&gt; EXP-00000: Exporta&amp;thorn;&amp;Ograve;o encerrada sem &amp;Ucirc;xito&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;b&gt;Causa do Problema:&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Os processos da ferramenta Oracle Enterprise Manager 10g tentam criar um objeto de mapeamento de arquivo no namespace Global que requer o privil&amp;eacute;gio SeCreateGlobal, que n&amp;atilde;o est&amp;aacute; dispon&amp;iacute;vel para usu&amp;aacute;rios comuns.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;O SHIM &lt;b&gt;LocalMappedObject&lt;/b&gt; &amp;nbsp;substitui o prefixo &lt;b&gt;Global\ &lt;/b&gt;com o prefixo &lt;b&gt;Local\ &lt;/b&gt;antes da aplica&amp;ccedil;&amp;atilde;o chamar a API original.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Solu&amp;ccedil;&amp;atilde;o:&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Habilitar o UAC (&lt;a href="http://blogs.msdn.com/b/luisdem/archive/2012/04/15/controle-de-conta-de-usu-225-rio-uac.aspx"&gt;Controle de Conta de Usu&amp;aacute;rio&lt;/a&gt;) no n&amp;iacute;vel padr&amp;atilde;o recomendado pela Microsoft e criar os seguintes SHIMs (corre&amp;ccedil;&amp;otilde;es) para cada aplica&amp;ccedil;&amp;atilde;o conforme descrito seguir.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style="text-decoration: underline;"&gt;Console do Enterprise Manager:&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Utilize o SHIM LocalMappedObject para corrigir o problema.&lt;/p&gt;
&lt;p&gt;O SHIM pode ser criado atrav&amp;eacute;s da ferramenta Compatibility Administrator que faz parte do Microsoft Application Compatibility Toolkit 5.6 (ACT).&lt;/p&gt;
&lt;p&gt;Ao executar o Enterprise Manager verificamos que o n&amp;atilde;o se trata de um execut&amp;aacute;vel e sim de um arquivo .JAR.&lt;/p&gt;
&lt;p&gt;Atrav&amp;eacute;s do PROCMON foi poss&amp;iacute;vel obter a linha de comando utilizada para executar a ferramenta:&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre class="scroll"&gt;&lt;code class="java"&gt;java -mx128m&lt;br /&gt; -DADMIN_WRL=C:\oracle\product\10.2.0\client_1\sysman\admin&lt;br /&gt; -Dsun.java2d.noddraw=true -DORACLE_HOME=C:\oracle\product\10.2.0\client_1&lt;br /&gt; -DGENERAL_BUS_PACK="" -DORBdisableLocator=true&lt;br /&gt; -Djdbc.backward_compatible_to_816=true &lt;br /&gt; -cp&lt;br /&gt; "classes;jlib/oembase-10_1_0.jar;jlib/oemtools-10_1_0.jar;jlib/swingall-1_1_1.jar;jlib/ewtcompat-3_3_15.jar;jlib/ewt3.jar;jlib/ewt3-nls.jar;jlib/share.jar;C:\oracle\product\10.2.0\client_1\sysman\jlib\master.jar;C:\oracle\product\10.2.0\client_1\sysman\jlib\master_zh_CN.jar;C:\oracle\product\10.2.0\client_1\sysman\jlib\master_fr.jar;C:\oracle\product\10.2.0\client_1\sysman\jlib\master_de.jar;C:\oracle\product\10.2.0\client_1\sysman\jlib\master_it.jar;C:\oracle\product\10.2.0\client_1\sysman\jlib\master_ja.jar;C:\oracle\product\10.2.0\client_1\sysman\jlib\master_ko.jar;C:\oracle\product\10.2.0\client_1\sysman\jlib\master_pt_BR.jar;C:\oracle\product\10.2.0\client_1\sysman\jlib\master_es.jar;jlib/help4.jar;jlib/help4-nls.jar;jlib/oracle_ice5.jar;jlib/dbui2.jar;jlib/dbui2-nls.jar;jdbc\lib\ojdbc14.jar;jdbc/lib/nls_charset12.zip;jlib\orai18n.jar;jlib/kodiak.jar;sysman\jlib\netchart360.jar;jlib/javax-ssl-1_1.jar;jlib/jssl-1_1.jar;jlib/netcfg.jar;jlib/o3logon.jar;jlib/verifier14.jar;jlib/ewm-1_1.jar;jlib/ojpse_2_1_5.jar;network\jlib/netmgrm.jar;network\jlib/netmgr.jar;network/tools;lib\xmlparserv2.jar;jlib/cvd.zip;jlib/jndi.jar;jlib/jewt4.jar;jlib/jewt4-nls.jar;assistants/jlib/assistantsCommon.jar;jlib/jle2.jar;jle2-nls.jar;jlib/ldap.jar;jlib/ldapjclnt10.jar;rdbms\jlib\qsma.jar"&lt;br /&gt; oracle.sysman.vtx.vtxOemApp.OemApp console &lt;br /&gt; &lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;O primeiro passo &amp;eacute; executar a ferramenta Compatibility Administrator e clicar no bot&amp;atilde;o FIX para criar o SHIM, conforme:&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-52-35/8080.Etapa1.png"&gt;&lt;img alt="" src="http://blogs.msdn.com/resized-image.ashx/__size/550x500/__key/communityserver-blogs-components-weblogfiles/00-00-01-52-35/8080.Etapa1.png" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Nesse caso o SHIM deve ser aplicado na aplica&amp;ccedil;&amp;atilde;o JAVA.EXE utilizada pela aplica&amp;ccedil;&amp;atilde;o.&lt;/p&gt;
&lt;p&gt;Atrav&amp;eacute;s do arquivo de configura&amp;ccedil;&amp;atilde;o da ferramenta, ou at&amp;eacute; mesmo pelo PROCMON, foi poss&amp;iacute;vel obter o caminho do arquivo JAVA.EXE utilizado pela aplica&amp;ccedil;&amp;atilde;o.&lt;/p&gt;
&lt;p&gt;Ap&amp;oacute;s fornecer o caminho do arquivo JAVA.EXE clique no bot&amp;atilde;o NEXT.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-52-35/0268.Etapa2.png"&gt;&lt;img alt="" src="http://blogs.msdn.com/resized-image.ashx/__size/550x500/__key/communityserver-blogs-components-weblogfiles/00-00-01-52-35/0268.Etapa2.png" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;A seguinte tela ir&amp;aacute; aparecer. Clique no bot&amp;atilde;o NEXT para prosseguir.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-52-35/3005.Etapa3.png"&gt;&lt;img alt="" src="http://blogs.msdn.com/resized-image.ashx/__size/550x500/__key/communityserver-blogs-components-weblogfiles/00-00-01-52-35/3005.Etapa3.png" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Selecione o SHIM LocalMappedObject e clique no bot&amp;atilde;o NEXT.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-52-35/4604.Etapa4.png"&gt;&lt;img alt="" src="http://blogs.msdn.com/resized-image.ashx/__size/550x500/__key/communityserver-blogs-components-weblogfiles/00-00-01-52-35/4604.Etapa4.png" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Clique no bot&amp;atilde;o FINISH para finalizar.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-52-35/0458.Etapa5.png"&gt;&lt;img alt="" src="http://blogs.msdn.com/resized-image.ashx/__size/550x500/__key/communityserver-blogs-components-weblogfiles/00-00-01-52-35/0458.Etapa5.png" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Clique no&amp;nbsp;&amp;iacute;cone Salvar existe na barra de ferramentas (ou pressione CTRL+S) para salvar o SHIM (arquivo SDB).&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-52-35/3755.Etapa6.png"&gt;&lt;img alt="" src="http://blogs.msdn.com/resized-image.ashx/__size/550x500/__key/communityserver-blogs-components-weblogfiles/00-00-01-52-35/3755.Etapa6.png" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Ap&amp;oacute;s salvar, clique com o bot&amp;atilde;o direito no SHIM e clique no item Install.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-52-35/8420.Etapa7.png"&gt;&lt;img alt="" src="http://blogs.msdn.com/resized-image.ashx/__size/550x500/__key/communityserver-blogs-components-weblogfiles/00-00-01-52-35/8420.Etapa7.png" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Uma vez instalado &amp;eacute; poss&amp;iacute;vel conferir atrav&amp;eacute;s do n&amp;oacute; Installed Database.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-52-35/6746.Etapa8.png"&gt;&lt;img alt="" src="http://blogs.msdn.com/resized-image.ashx/__size/550x500/__key/communityserver-blogs-components-weblogfiles/00-00-01-52-35/6746.Etapa8.png" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Uma alternativa para a instala&amp;ccedil;&amp;atilde;o &amp;eacute; executar o seguinte comando:&lt;/p&gt;
&lt;p&gt;SDBINST.EXE &amp;lt;nome do SHIM (arquivo SDB)&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Os mesmos procedimos foram realizados para o Oracle SQL PLUS e ORACLE EXPORT. Para o SQL PLUS o arquivo selecionado para&amp;nbsp;criar o&amp;nbsp;SHIM foi o sqldeveloper.exe e para o ORACLE EXPORT o arquivo foi o exp.exe.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Ferramentas:&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Microsoft Application Compatibility Toolkit 5.6&lt;/p&gt;
&lt;p&gt;Dispon&amp;iacute;vel em: &lt;a href="http://www.microsoft.com/en-us/download/details.aspx?id=7352"&gt;http://www.microsoft.com/en-us/download/details.aspx?id=7352&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Microsoft Application Verifier&lt;/p&gt;
&lt;p&gt;Dispon&amp;iacute;vel em: &lt;a href="http://www.microsoft.com/en-us/download/details.aspx?id=20028"&gt;http://www.microsoft.com/en-us/download/details.aspx?id=20028&lt;/a&gt;&lt;/p&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=10313789" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/b/luisdem/archive/tags/Compatibilidade+Windows+7/">Compatibilidade Windows 7</category></item><item><title>Valores Atuais e Máximos de Paged Pool e Nonpaged Pool</title><link>http://blogs.msdn.com/b/luisdem/archive/2012/04/22/valores-atuais-e-m-225-ximos-de-paged-pool-e-nonpaged-pool.aspx</link><pubDate>Mon, 23 Apr 2012 00:48:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:10296279</guid><dc:creator>Luis Henrique Demetrio</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.msdn.com/b/luisdem/rsscomments.aspx?WeblogPostID=10296279</wfw:commentRss><comments>http://blogs.msdn.com/b/luisdem/archive/2012/04/22/valores-atuais-e-m-225-ximos-de-paged-pool-e-nonpaged-pool.aspx#comments</comments><description>&lt;p&gt;Existem duas &amp;aacute;reas da mem&amp;oacute;ria do modo privilegiado (kernel), conhecidas como paged e nonpaged pools. O nonpaged pool &amp;eacute; uma &amp;aacute;rea de mem&amp;oacute;ria onde residem objetos que n&amp;atilde;o podem ser escritos no disco, ou seja, enquanto eles estiverem alocados eles devem permanecer na mem&amp;oacute;ria f&amp;iacute;sica, ao contr&amp;aacute;rio do paged pool, onde as informa&amp;ccedil;&amp;otilde;es podem ser armazenadas no pagefile.&lt;/p&gt;
&lt;p&gt;&amp;Eacute; importante ficar atento &amp;agrave; utiliza&amp;ccedil;&amp;atilde;o dessas duas &amp;aacute;reas de mem&amp;oacute;ria, observando o valor atual e o limite, pois quando o valor atual alcan&amp;ccedil;ar o limite, o sistema operacional ficar&amp;aacute; inst&amp;aacute;vel e ir&amp;aacute; gerar erros quando opera&amp;ccedil;&amp;otilde;es b&amp;aacute;sicas forem realizadas.&lt;/p&gt;
&lt;p&gt;O Performance Monitor (Perfmon)&amp;nbsp; pode ser usado para exibir os valores atuais de mem&amp;oacute;ria dispon&amp;iacute;vel para Paged Pool e Non-Paged Pool atrav&amp;eacute;s dos indicadores:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;\Memory\Pool Paged Bytes&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p class="Ln1" style="padding-left: 30px;"&gt;Mede o tamanho, em bytes, da &amp;aacute;rea de mem&amp;oacute;ria onde residem objetos que podem ser escritos no disco quando n&amp;atilde;o est&amp;atilde;o sendo usados. O Registry &amp;eacute; o maior consumidor dessa &amp;aacute;rea de mem&amp;oacute;ria.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;\Memory\Pool Nonpaged Bytes&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p class="Ln1" style="padding-left: 30px;"&gt;Mede o tamanho, em bytes, da &amp;aacute;rea de mem&amp;oacute;ria onde residem objetos que n&amp;atilde;o podem ser escritos no disco. Enquanto eles estiverem alocados eles devem permanecer na mem&amp;oacute;ria f&amp;iacute;sica. Os drivers dessa &amp;aacute;rea de mem&amp;oacute;ria n&amp;atilde;o podem ser interrompidos e aguardar por disco I/O.&lt;/p&gt;
&lt;p&gt;Atrav&amp;eacute;s do Process Explorer pode ser utilizado para visualizar os valores m&amp;aacute;ximos desses indicadores, uma vez que n&amp;atilde;o &amp;eacute; poss&amp;iacute;vel obt&amp;ecirc;-los atrav&amp;eacute;s do Perfmon.&lt;/p&gt;
&lt;p&gt;Para visualiz&amp;aacute;-los no Process Explorer:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Abra o Process Explorer.&lt;/li&gt;
&lt;li&gt;&amp;Eacute; necess&amp;aacute;rio configurar os s&amp;iacute;mbolos para que o Process Explorer exiba os valoreslimites de paged pool e nonpaged pool. Para tanto, clique em &lt;strong&gt;Options/Configure Symbols&lt;/strong&gt; e verifique se a configura&amp;ccedil;&amp;atilde;o dos s&amp;iacute;mbolos corresponde a seguinte:&lt;/li&gt;
&lt;li&gt;A localiza&amp;ccedil;&amp;atilde;o da DLL do DBGHelp deve corresponder&amp;nbsp;a DLL&amp;nbsp;dbghelp.dll do &lt;a title="Debugging Tools for Windows" href="http://msdn.microsoft.com/en-us/windows/hardware/gg463009.aspx"&gt;Debugging Tools for Windows&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;O caminho dos arquivos de s&amp;iacute;mbolo deve ser: &lt;strong&gt;srv*c:\symbols*http://msdl.microsoft.com/download/symbols&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Clique no menu View/System Information ou pressione CTRL+I.&lt;/li&gt;
&lt;li&gt;Ser&amp;aacute; exibida a tela com as informa&amp;ccedil;&amp;otilde;es do sistema que cont&amp;eacute;m os valores atuais e os limites do paged pool e nonpaged pool, conforme exibido e destacado a seguir:&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-52-04/2018.Figura1.png"&gt;&lt;/a&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-52-04/2364.PagedPool.JPG"&gt;&lt;img alt="" src="http://blogs.msdn.com/resized-image.ashx/__size/550x500/__key/communityserver-blogs-components-weblogfiles/00-00-01-52-04/2364.PagedPool.JPG" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;A tabela a seguir exibe os valores limites do Paged Pool e Non-Paged Pool:&lt;/p&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;
&lt;table class="TableILT" border="1" cellspacing="0" cellpadding="0"&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;td width="150"&gt;&amp;nbsp;&amp;nbsp;
&lt;p class="TableHead"&gt;Valor Limite&lt;/p&gt;
&lt;/td&gt;
&lt;td width="378"&gt;&amp;nbsp;&amp;nbsp;
&lt;p class="TableHead"&gt;Efeito&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td width="150" valign="top"&gt;
&lt;ul&gt;
&lt;li&gt;&amp;nbsp; 0-50%&lt;/li&gt;
&lt;/ul&gt;
&lt;/td&gt;
&lt;td width="378" valign="top"&gt;
&lt;p class="TableBody"&gt;Informativo&lt;/p&gt;
&lt;p class="TableBody"&gt;Comportamento normal.&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td width="150" valign="top"&gt;
&lt;ul&gt;
&lt;li&gt;&amp;nbsp; 60-80%&lt;/li&gt;
&lt;/ul&gt;
&lt;/td&gt;
&lt;td width="378" valign="top"&gt;
&lt;p class="TableBody"&gt;Aten&amp;ccedil;&amp;atilde;o&lt;/p&gt;
&lt;p class="TableBody"&gt;Uso quase&amp;nbsp;cr&amp;iacute;tico, que pode resultar na lentid&amp;atilde;o ou travamentos.&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td width="150" valign="top"&gt;
&lt;ul&gt;
&lt;li&gt;&amp;nbsp; 80-100%&lt;/li&gt;
&lt;/ul&gt;
&lt;/td&gt;
&lt;td width="378" valign="top"&gt;
&lt;p class="TableBody"&gt;Cr&amp;iacute;tico&lt;/p&gt;
&lt;p class="TableBody"&gt;Problemas&amp;nbsp;de estabilidade e desempenho extremamente baixo para aplica&amp;ccedil;&amp;otilde;es e servi&amp;ccedil;os.&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&amp;nbsp;Maiores informa&amp;ccedil;&amp;otilde;es em:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Windows&amp;reg; Internals&lt;/strong&gt; by Mark E. Russinovich and Alex Ionescu&amp;nbsp;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10296279" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/b/luisdem/archive/tags/Arquitetura+do+Windows/">Arquitetura do Windows</category></item><item><title>Problemas de Automação no Internet Explorer 8.0</title><link>http://blogs.msdn.com/b/luisdem/archive/2012/04/17/problemas-de-automa-231-227-o-no-internet-explorer-8-0.aspx</link><pubDate>Tue, 17 Apr 2012 03:08:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:10294339</guid><dc:creator>Luis Henrique Demetrio</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.msdn.com/b/luisdem/rsscomments.aspx?WeblogPostID=10294339</wfw:commentRss><comments>http://blogs.msdn.com/b/luisdem/archive/2012/04/17/problemas-de-automa-231-227-o-no-internet-explorer-8-0.aspx#comments</comments><description>&lt;p&gt;Nessa semana me deparei com uma aplica&amp;ccedil;&amp;atilde;o desenvolvida em Visual Basic 6.0 que&amp;nbsp;gerava o seguinte erro quando a aplica&amp;ccedil;&amp;atilde;o tentava navegar para uma p&amp;aacute;gina da Intranet para capturar informa&amp;ccedil;&amp;otilde;es do site:&lt;/p&gt;
&lt;p&gt;&lt;span style="background-color: #ffff00;"&gt;-2147023179&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="background-color: #ffff00;"&gt;Erro de automa&amp;ccedil;&amp;atilde;o (Automation error)&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="background-color: #ffff00;"&gt;Interface desconhecida&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: #ffff00;"&gt;(The interface is unknown).&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Diagn&amp;oacute;stico&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;Ao fazer o debug do c&amp;oacute;digo, foi poss&amp;iacute;vel identificar que o erro ocorria quando a aplica&amp;ccedil;&amp;atilde;o tentava acessar os sites que pertenciam &amp;agrave; zona da Intranet. Nenhum erro ocorria quando a aplica&amp;ccedil;&amp;atilde;o acessava os sites associados &amp;agrave; zona da Internet. Uma das diferen&amp;ccedil;as entre essas zonas &amp;eacute; que os sites da Intranet n&amp;atilde;o possuem o Modo Protegido habilitado por padr&amp;atilde;o.&lt;/p&gt;
&lt;p&gt;O modo protegido ajuda a proteger usu&amp;aacute;rios contra ataques executando o processo do Internet Explorer com privil&amp;eacute;gios muito restritos. Quando executado no modo protegido, o IE8 &amp;eacute; um processo de baixa integridade sem acesso de grava&amp;ccedil;&amp;atilde;o a arquivos e chaves do registro.&lt;/p&gt;
&lt;p&gt;O Internet Explorer 8 possui pelo menos dois processos (Figura 1) quando &amp;eacute; executado em uma m&amp;aacute;quina que possui o UAC (Controle de Conta de Usu&amp;aacute;rio) configurado no n&amp;iacute;vel padrao. O processo do navegador (&lt;b&gt;Frame Manager)&lt;/b&gt; e um ou mais processos (&lt;b&gt;Tab Process)&lt;/b&gt; que podem ser executados nos seguintes n&amp;iacute;veis de integridade:&lt;/p&gt;
&lt;p&gt;&amp;bull;Modo de Integridade Baixo (LowIL) para os sites de modo protegido&lt;/p&gt;
&lt;p&gt;&amp;bull;Modo de Integridade M&amp;eacute;dio (MediumIL) para sites da Intranet/confi&amp;aacute;veis&lt;/p&gt;
&lt;p&gt;&amp;bull;Modo de Integridade Alto (HighIL) se o IE for iniciado como Admin&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&amp;nbsp;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-52-35/7026.Figura1.png"&gt;&lt;img alt="" src="http://blogs.msdn.com/resized-image.ashx/__size/550x500/__key/communityserver-blogs-components-weblogfiles/00-00-01-52-35/7026.Figura1.png" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Figura 1 - Modelo conhecido como Loosely Coupled IE (LCIE)&lt;/p&gt;
&lt;p&gt;O Internet Explorer 8 assume que o processo da aba padr&amp;atilde;o deve ser executado no modo de baixa integridade (LowIL). Dessa forma, quando o IE &amp;eacute; criado via automa&amp;ccedil;&amp;atilde;o COM, a tab padr&amp;atilde;o &amp;eacute; executada no modo de baixa integridade (veja o fragmento de c&amp;oacute;digo a seguir).&lt;/p&gt;
&lt;pre class="scroll"&gt;&lt;code class="csharp"&gt;Dim IE As InternetExplorer&lt;br /&gt; &lt;br /&gt; &lt;br /&gt; Set IE = CreateObject("InternetExplorer.Application")&lt;br /&gt; &lt;br /&gt; IE.Navigate2 &amp;ldquo;http://intranet/&amp;rdquo;&lt;br /&gt; &lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;Se o navegador determinar que a navega&amp;ccedil;&amp;atilde;o requer que um processo (Tab Process) seja executado no modo de integridade m&amp;eacute;dia, o navegador faz a troca da aba virtual. O problema da automa&amp;ccedil;&amp;atilde;o ocorre porque o script ou c&amp;oacute;digo que criou a inst&amp;acirc;ncia do Internet Explorer via automa&amp;ccedil;&amp;atilde;o permanece com uma refer&amp;ecirc;ncia anterior (irrelevante) para o processo da aba atual, ou seja, ele perde o controle.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Solu&amp;ccedil;&amp;atilde;o&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;A primeira solu&amp;ccedil;&amp;atilde;o &amp;eacute; habilitar o modo protegido do Internet Explorer para os sites da Intranet.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-52-35/0741.Figura2.png"&gt;&lt;img alt="" src="http://blogs.msdn.com/resized-image.ashx/__size/550x500/__key/communityserver-blogs-components-weblogfiles/00-00-01-52-35/0741.Figura2.png" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Figura 2 - Habilitar o Modo Protegido para os sites da Intranet&lt;/p&gt;
&lt;p&gt;Outra solu&amp;ccedil;&amp;atilde;o requer altera&amp;ccedil;&amp;atilde;o no c&amp;oacute;digo da aplica&amp;ccedil;&amp;atilde;o , conforme exibido no fragmento de c&amp;oacute;digo a seguir:&lt;/p&gt;
&lt;pre class="scroll"&gt;&lt;code class="csharp"&gt;Dim IE As InternetExplorer&lt;br /&gt; &lt;br /&gt; Set IE = CreateObject("new:{D5E8041D-920F-45e9-B8FB-B1DEB82C6E5E}")&lt;br /&gt; &lt;br /&gt; IE.Navigate2 &amp;ldquo;http://intranet/&amp;rdquo;&lt;br /&gt; &lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Ao utilizar o CLSID a aplica&amp;ccedil;&amp;atilde;o cria uma inst&amp;acirc;ncia do Internet Explorer no modo de integridade m&amp;eacute;dio (MediumIL). A l&amp;oacute;gica &amp;eacute; bem simples e pode ser verificada atrav&amp;eacute;s da chave de registro &lt;b&gt;HKEY_CLASSES_ROOT\CLSID\{D5E8041D-920F-45e9-B8FB-B1DEB82C6E5E}\LocalServer32 &lt;/b&gt;que cont&amp;eacute;m a &lt;b&gt;REG_EXPAND_SZ&lt;/b&gt; com o&lt;br /&gt;valor &lt;b&gt;"%ProgramFiles(x86)%\Internet Explorer\iexplore.exe" &amp;ndash;startmediumtab.&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;Fontes:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/bb250462(VS.85).aspx"&gt;http://msdn.microsoft.com/en-us/library/bb250462(VS.85).aspx&lt;/a&gt;&lt;/p&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=10294339" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/b/luisdem/archive/tags/Compatibilidade+Windows+7/">Compatibilidade Windows 7</category></item><item><title>Compatibilidade Borland Quick Report 5 com Windows 7</title><link>http://blogs.msdn.com/b/luisdem/archive/2012/04/15/compatibilidade-borland-quick-report-5-com-windows-7.aspx</link><pubDate>Sun, 15 Apr 2012 18:13:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:10293910</guid><dc:creator>Luis Henrique Demetrio</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.msdn.com/b/luisdem/rsscomments.aspx?WeblogPostID=10293910</wfw:commentRss><comments>http://blogs.msdn.com/b/luisdem/archive/2012/04/15/compatibilidade-borland-quick-report-5-com-windows-7.aspx#comments</comments><description>&lt;p&gt;Em um dos trabalhos realizados para garantir a compatibilidade de aplica&amp;ccedil;&amp;otilde;es no Windows 7, diagnostiquei uma aplica&amp;ccedil;&amp;atilde;o que exibia apenas as duas primeiras de um relat&amp;oacute;rio e que gerava o erro &lt;b&gt;&lt;i&gt;&amp;ldquo;Metafile is not valid&amp;rdquo; &lt;/i&gt;&lt;/b&gt;quando o usu&amp;aacute;rio tenta navegar entre as p&amp;aacute;ginas do relat&amp;oacute;rio. A aplica&amp;ccedil;&amp;atilde;o tamb&amp;eacute;m ignorava a requisi&amp;ccedil;&amp;atilde;o de imprimir o relat&amp;oacute;rio.&lt;/p&gt;
&lt;p&gt;Com a ajuda do &lt;a href="http://technet.microsoft.com/en-us/sysinternals/bb896645.aspx"&gt;Process Monitor&lt;/a&gt; (PROCMON) foi poss&amp;iacute;vel identificar que o erro era decorrente de um OVERFLOW que ocorria quando a aplica&amp;ccedil;&amp;atilde;o tentava armazenar o valor da vari&amp;aacute;vel de ambiente TMP. A aplica&amp;ccedil;&amp;atilde;o espera o valor &amp;ldquo;C:\TEMP&amp;rdquo; ao contr&amp;aacute;rio do valor &amp;ldquo;%USERPROFILE%\AppData\Local\Temp&amp;ldquo; retornado pelo Windows 7.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Solu&amp;ccedil;&amp;atilde;o&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;Em cen&amp;aacute;rios em que o cliente n&amp;atilde;o possui o c&amp;oacute;digo-fonte, a solu&amp;ccedil;&amp;atilde;o &amp;eacute; alterar o valor da vari&amp;aacute;vel de ambiente de usu&amp;aacute;rio TMP de &amp;ldquo;%USERPROFILE%\AppData\Local\Temp&amp;rdquo; para &amp;ldquo;C:\TEMP&amp;rdquo;, conforme indicado abaixo:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-52-04/8686.Solucao.JPG"&gt;&lt;img alt="" src="http://blogs.msdn.com/resized-image.ashx/__size/550x500/__key/communityserver-blogs-components-weblogfiles/00-00-01-52-04/8686.Solucao.JPG" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;div style="clear: both;"&gt;&lt;/div&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10293910" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/b/luisdem/archive/tags/Compatibilidade+Windows+7/">Compatibilidade Windows 7</category></item><item><title>Compatibilidade de Aplicações Visual Basic 6.0 no Windows 7</title><link>http://blogs.msdn.com/b/luisdem/archive/2012/04/15/compatibilidade-de-aplica-231-245-es-visual-basic-6-0-no-windows-7.aspx</link><pubDate>Sun, 15 Apr 2012 18:11:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:10293908</guid><dc:creator>Luis Henrique Demetrio</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.msdn.com/b/luisdem/rsscomments.aspx?WeblogPostID=10293908</wfw:commentRss><comments>http://blogs.msdn.com/b/luisdem/archive/2012/04/15/compatibilidade-de-aplica-231-245-es-visual-basic-6-0-no-windows-7.aspx#comments</comments><description>&lt;h1&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-52-04/4774.header.png"&gt;&lt;img alt="" src="http://blogs.msdn.com/resized-image.ashx/__size/550x300/__key/communityserver-blogs-components-weblogfiles/00-00-01-52-04/4774.header.png" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&amp;nbsp;&lt;/h1&gt;
&lt;p&gt;Nos &amp;uacute;ltimos trabalhos realizados para garantir a compatibilidade de aplica&amp;ccedil;&amp;otilde;es no Windows 7, encontrei uma quantidade significativa de aplica&amp;ccedil;&amp;otilde;es desenvolvidas em Visual Basic 6.0. O Visual Basic 6.0 apresenta alguns problemas de compatibilidade quando executado no Windows 7.&lt;/p&gt;
&lt;p&gt;Os t&amp;oacute;picos a seguir descrevem os problemas mais comuns encontrados durante o processo de migra&amp;ccedil;&amp;atilde;o das aplica&amp;ccedil;&amp;otilde;es do Windows XP para o Windows 7.&lt;/p&gt;
&lt;ol&gt;&lt;/ol&gt;
&lt;p&gt;&lt;b&gt;1.&amp;nbsp;Acesso Negado&lt;/b&gt;&lt;/p&gt;
&lt;ol&gt;&lt;/ol&gt;
&lt;p&gt;O &lt;a href="http://technet.microsoft.com/en-us/sysinternals/bb896645.aspx"&gt;Process Monitor&lt;/a&gt; (PROCMON) &amp;eacute; uma boa op&amp;ccedil;&amp;atilde;o para diagnosticar as atividades do sistema de arquivos, do Registro e de processos e threads em tempo real. Na Figura 1 &amp;eacute; poss&amp;iacute;vel verificar, atrav&amp;eacute;s do PROCMON, que o erro de acesso negado ocorre devido &amp;agrave; aplica&amp;ccedil;&amp;atilde;o tentar gravar um arquivo texto no diret&amp;oacute;rio da&lt;br /&gt;aplica&amp;ccedil;&amp;atilde;o localizado em &lt;b&gt;C:\Program Files (x86)&lt;/b&gt;. A partir do Windows Vista, &amp;eacute; necess&amp;aacute;rio ter privil&amp;eacute;gio administrative para realizar modifica&amp;ccedil;&amp;otilde;es por se tratar de um diret&amp;oacute;rio protegido.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-52-04/0172.accessdenied.png"&gt;&lt;img alt="" src="http://blogs.msdn.com/resized-image.ashx/__size/550x550/__key/communityserver-blogs-components-weblogfiles/00-00-01-52-04/0172.accessdenied.png" border="0" /&gt;&lt;/a&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-52-04/5102.TypeMismatch.png"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Figura 1 - Erro de Acesso Negado&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Na maioria dos casos, esse problema ocorre devido o UAC estar desativado (pr&amp;aacute;tica n&amp;atilde;o recomendada pela Microsoft). As aplica&amp;ccedil;&amp;otilde;es VB6 s&amp;atilde;o virtualizadas quando o UAC est&amp;aacute; habilitado. Consequentemente, com o UAC habilitado, o erro de acesso negado n&amp;atilde;o ir&amp;aacute; ocorrer quando a aplica&amp;ccedil;&amp;atilde;o tentar gravar o arquivo no diret&amp;oacute;rio da aplica&amp;ccedil;&amp;atilde;o, pois essa a&amp;ccedil;&amp;atilde;o ser&amp;aacute; automaticamente redirecionada (REPARSE) para a pasta VirtualStore localizada em %LOCALAPPDATA%, conforme ilustrado na Figura 2.&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&lt;br /&gt; &lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-52-04/8284.reparse.JPG"&gt;&lt;img alt="" src="http://blogs.msdn.com/resized-image.ashx/__size/550x500/__key/communityserver-blogs-components-weblogfiles/00-00-01-52-04/8284.reparse.JPG" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Figura 2 - Virtualiza&amp;ccedil;&amp;atilde;o de arquivo para aplica&amp;ccedil;&amp;otilde;es legadas&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Para maiores detalhes sobre UAC consulte o artigo &lt;a href="http://blogs.msdn.com/b/lus_henrique_demetrio/archive/2012/04/03/controle-de-conta-de-usu-225-rio-uac.aspx"&gt;Controle de Conta de Usu&amp;aacute;rio (UAC)&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;2. Permiss&amp;atilde;o Negada&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;No Windows 7, o uso do m&amp;eacute;todo SendKeys gera o erro &amp;ldquo;&lt;b&gt;Run-tine error '70': Permission denied&lt;/b&gt;&amp;rdquo; quando o UAC est&amp;aacute; habilitado. A Figura 3 exibe um DUMP coletado, para uma das aplica&amp;ccedil;&amp;otilde;es diagnosticadas, no momento em que o erro ocorre. Atrav&amp;eacute;s do DUMP &amp;eacute; poss&amp;iacute;vel verificar que o erro ocorreu devido ao uso da fun&amp;ccedil;&amp;atilde;o SendKeys:&lt;/p&gt;
&lt;p&gt;&lt;b&gt;&lt;br /&gt; &lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-52-04/0601.dump.png"&gt;&lt;img alt="" src="http://blogs.msdn.com/resized-image.ashx/__size/550x500/__key/communityserver-blogs-components-weblogfiles/00-00-01-52-04/0601.dump.png" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;br /&gt; &lt;/b&gt;Figura 3 - Permiss&amp;atilde;o Negada devido o uso do m&amp;eacute;todo SendKeys&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Um dos usos mais frequentes do SendKeys no VB6 &amp;eacute; simular a tecla tab, conforme o exemplo a seguir:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-52-04/4477.SendKeys.PNG"&gt;&lt;img alt="" src="http://blogs.msdn.com/resized-image.ashx/__size/550x200/__key/communityserver-blogs-components-weblogfiles/00-00-01-52-04/4477.SendKeys.PNG" border="0" /&gt;&lt;/a&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Figura 4- Uso do SendKeys&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Existem algumas solu&amp;ccedil;&amp;otilde;es para esse corrigir esse problema sem a necessidade de executar a aplica&amp;ccedil;&amp;atilde;o com privil&amp;eacute;gio elevado ou desativar o UAC. Sendo algumas delas:&amp;nbsp;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Recompilar a aplica&amp;ccedil;&amp;atilde;o VB6 no Windows 7. Esse problema de incompatibilidade foi corrigido na &amp;uacute;ltima vers&amp;atilde;o do runtime do VB6 (MSVBVM60.DLL) que agora utiliza um m&amp;eacute;todo interno diferente para realizar a a&amp;ccedil;&amp;atilde;o. Essa solu&amp;ccedil;&amp;atilde;o corrige o problema de acesso negado do c&amp;oacute;digo compilado, entretanto, n&amp;atilde;o elimina o erro durante o debug do c&amp;oacute;digo atrav&amp;eacute;s da IDE do VB6.&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Substituir o SendKeys pela API PostMessage, conforme:&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class="scroll"&gt;&lt;code class="csharp"&gt;Public Declare Function PostMessage Lib "user32" Alias "PostMessageA" (ByVal hWnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long &lt;br /&gt; &lt;br /&gt; Private Sub Text1_KeyPress(KeyAscii As Integer) &lt;br /&gt; &lt;br /&gt; If KeyAscii = 13 Then &lt;br /&gt; SendKeys "{tab}" '13 = Enter Key &lt;br /&gt; PostMessage hwnd, &amp;amp;H100, &amp;amp;HD&amp;amp;, &amp;amp;H1C0001 &lt;br /&gt; End If &lt;br /&gt; &lt;br /&gt; End Sub &lt;br /&gt; &lt;/code&gt;&lt;/pre&gt;
&lt;p style="padding-left: 30px;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;3.&amp;nbsp;&lt;/b&gt;&lt;b&gt;Tipo Incompat&amp;iacute;vel&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;Encontrei esse erro em algumas aplica&amp;ccedil;&amp;otilde;es VB6. Observando apenas a mensagem de erro fica dif&amp;iacute;cil identificar que o erro de incompatibilidade de dados ocorria devido &amp;agrave; falta do runtime do VB5 (que possui como DLL principal a MSVBVM50.DLL)&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-52-04/3681.TypeMismatch.png"&gt;&lt;img alt="" src="http://blogs.msdn.com/resized-image.ashx/__size/550x100/__key/communityserver-blogs-components-weblogfiles/00-00-01-52-04/3681.TypeMismatch.png" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p align="center" style="text-align: left;"&gt;Figura 5 - Mensagem Run-time error 13 Type mismatch&lt;/p&gt;
&lt;p&gt;&amp;nbsp;Em poucos casos a mensagem de erro informava corretamente que o motivo do erro era a falta da MSVBVM50.DLL.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-52-04/7411.RuntimeVB5Missing.png"&gt;&lt;img alt="" src="http://blogs.msdn.com/resized-image.ashx/__size/550x200/__key/communityserver-blogs-components-weblogfiles/00-00-01-52-04/7411.RuntimeVB5Missing.png" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p align="center" style="text-align: left;"&gt;Figura 6 - Mensagem de erro informando que o runtime do VB5 n&amp;atilde;o foi encontrado.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;O &lt;a href="http://technet.microsoft.com/en-us/sysinternals/bb896645.aspx"&gt;Process Monitor&lt;/a&gt; pode ser utilizado para confirmar que o problema realmente se refere &amp;agrave; falta do runtime do VB5.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-52-04/3377.RuntimeVB5.png"&gt;&lt;img alt="" src="http://blogs.msdn.com/resized-image.ashx/__size/550x500/__key/communityserver-blogs-components-weblogfiles/00-00-01-52-04/3377.RuntimeVB5.png" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&amp;nbsp;&lt;br /&gt; Figura 7 - Aplica&amp;ccedil;&amp;atilde;o VB6 que possui depend&amp;ecirc;ncia do runtime do VB5&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;O runtime do Visual Basic 5.0 funciona no Windows 7, apesar de n&amp;atilde;o ser mais suportado, e est&amp;aacute; dispon&amp;iacute;vel para download no Centro de Download da Microsoft: &lt;a href="http://support.microsoft.com/kb/180071"&gt;http://support.microsoft.com/kb/180071&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;4.&amp;nbsp;&lt;/b&gt;&lt;b&gt;ConnectionString Incorreta &lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;A seguinte mensagem de erro &amp;eacute; exibida quando a aplica&amp;ccedil;&amp;atilde;o n&amp;atilde;o &amp;eacute; executada com privil&amp;eacute;gio de administrador:&lt;/p&gt;
&lt;div&gt;
&lt;p&gt;&lt;code class="csharp"&gt;&amp;nbsp;&lt;br /&gt; Error: [Microsoft][ODBC &lt;br /&gt; Driver Manager] Data source name not found and no default driver specified &lt;br /&gt; Code: 80004005 &lt;br /&gt; Source: Microsoft OLE DB Provider for ODBC Drivers &lt;br /&gt; &lt;/code&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;A mensagem equivalente no Windows 7 em portugu&amp;ecirc;s seria: &lt;b&gt;Nome da fonte de dados n&amp;atilde;o encontrado e nenhum driver padr&amp;atilde;o especificado.&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;Durante o debug da aplica&amp;ccedil;&amp;atilde;o foi poss&amp;iacute;vel diagnosticar que a ConnectionString utilizada para retornar as informa&amp;ccedil;&amp;otilde;es de conex&amp;atilde;o estava incorreta, ou seja, retornava&amp;nbsp; apenas o provider da conex&amp;atilde;o.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/p&gt;
&lt;table style="width: 300px;" border="1" cellspacing="0" cellpadding="0"&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td width="168" valign="top"&gt;
&lt;p&gt;Valor&amp;nbsp;retornado&lt;/p&gt;
&lt;/td&gt;
&lt;td width="360" valign="top"&gt;
&lt;p&gt;Valor&amp;nbsp;esperado&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td width="168" valign="top"&gt;
&lt;p&gt;&lt;b&gt;Provider=MSDASQL.1;&lt;/b&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td width="360" valign="top"&gt;
&lt;p&gt;&lt;b&gt;DRIVER=XX;SERVER=XX;DataBase=XX;UID=XX;PWD=XX;&lt;/b&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;O motivo do valor da conex&amp;atilde;o estar truncado ocorre devido um FIX de seguran&amp;ccedil;a que foi lan&amp;ccedil;ado a partir do Windows Vista. O objetivo do FIX &amp;eacute; esconder as informa&amp;ccedil;&amp;otilde;es que exp&amp;otilde;em a seguran&amp;ccedil;a. &amp;Eacute; necess&amp;aacute;rio adicionar na ConnectionString a informa&amp;ccedil;&amp;atilde;o &amp;ldquo;PersistSecurity Info=true&amp;rdquo; para que o ADO entenda que as informa&amp;ccedil;&amp;otilde;es sens&amp;iacute;veis (Extended Properties) s&amp;atilde;o necess&amp;aacute;rias e devem ser mantidas.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Links &amp;Uacute;teis&lt;/strong&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Visual Basic 6.0 Resource Center - &lt;a href="http://msdn.microsoft.com/en-us/vstudio/ms788229.aspx"&gt;http://msdn.microsoft.com/en-us/vstudio/ms788229.aspx&lt;/a&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10293908" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/b/luisdem/archive/tags/Compatibilidade+Windows+7/">Compatibilidade Windows 7</category></item><item><title>Controle de Conta de Usuário (UAC)</title><link>http://blogs.msdn.com/b/luisdem/archive/2012/04/15/controle-de-conta-de-usu-225-rio-uac.aspx</link><pubDate>Sun, 15 Apr 2012 18:08:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:10293907</guid><dc:creator>Luis Henrique Demetrio</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.msdn.com/b/luisdem/rsscomments.aspx?WeblogPostID=10293907</wfw:commentRss><comments>http://blogs.msdn.com/b/luisdem/archive/2012/04/15/controle-de-conta-de-usu-225-rio-uac.aspx#comments</comments><description>&lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-52-04/6371.UAC.png"&gt;&lt;img alt="" src="http://blogs.msdn.com/resized-image.ashx/__size/550x550/__key/communityserver-blogs-components-weblogfiles/00-00-01-52-04/6371.UAC.png" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-size: medium;"&gt;&lt;strong&gt;Introdu&amp;ccedil;&amp;atilde;o&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;O Controle de Conta de Usu&amp;aacute;rio (UAC) &amp;eacute; um conjunto de tecnologias de infraestrutura implantado no&amp;nbsp; Windows Vista e aperfei&amp;ccedil;oado no Windows 7 que &amp;eacute; frequentemente mal-entendido pela maioria dos usu&amp;aacute;rios.&lt;/p&gt;
&lt;p&gt;A percep&amp;ccedil;&amp;atilde;o comum &amp;eacute; que o UAC &amp;eacute; um recurso irritante e in&amp;uacute;til cujo objetivo &amp;eacute; perguntar se o usu&amp;aacute;rio deseja realmente executar uma aplica&amp;ccedil;&amp;atilde;o. Consequentemente, n&amp;atilde;o &amp;eacute; dif&amp;iacute;cil encontrar em f&amp;oacute;runs ou em sites de fornecedores a recomenda&amp;ccedil;&amp;atilde;o de desativar o UAC como solu&amp;ccedil;&amp;atilde;o para as aplica&amp;ccedil;&amp;otilde;es que apresentam incompatibilidade com o Windows 7. Desativar o UAC &amp;eacute; uma pr&amp;aacute;tica n&amp;atilde;o recomendada pela Microsoft por expor a seguran&amp;ccedil;a do sistema operacional.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;span style="font-size: medium;"&gt;&lt;/span&gt;&lt;/strong&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;span style="font-size: medium;"&gt;Objetivos do UAC&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;O UAC &amp;eacute; destinado a permitir que os usu&amp;aacute;rios executem aplica&amp;ccedil;&amp;otilde;es sem o privil&amp;eacute;gio de administrador independentemente se o usu&amp;aacute;rio possui esse privil&amp;eacute;gio. O objetivo &amp;eacute; prevenir a instala&amp;ccedil;&amp;atilde;o silenciosa de programas mal-intencionados e a infec&amp;ccedil;&amp;atilde;o do computador.&lt;/p&gt;
&lt;p&gt;O perfil de administrador permite alterar o estado do sistema, desativar o firewall, configurar a diretiva de seguran&amp;ccedil;a, acessar informa&amp;ccedil;&amp;otilde;es de outros usu&amp;aacute;rios, instalar servi&amp;ccedil;o ou driver que afete todos os usu&amp;aacute;rios do computador e instalar softwares no computador inteiro. Os usu&amp;aacute;rios comuns n&amp;atilde;o podem executar essas tarefas.&lt;/p&gt;
&lt;p&gt;O UAC executa a maioria dos aplicativos com direitos de usu&amp;aacute;rio padr&amp;atilde;o, elimina a necessidade de direitos de administrador o tempo todo e encoraja os desenvolvedores de software a criarem aplicativos que executem com direitos de usu&amp;aacute;rio padr&amp;atilde;o.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-size: medium;"&gt;&lt;strong&gt;Mensagem de Notifica&amp;ccedil;&amp;atilde;o do UAC&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;A mensagem de controle de conta de usu&amp;aacute;rio (Figura 1) n&amp;atilde;o tem como objetivo perguntar se uma aplica&amp;ccedil;&amp;atilde;o pode ser executada ou se pode realizar alguma a&amp;ccedil;&amp;atilde;o. Essa mensagem &amp;eacute; exibida para solicitar permiss&amp;atilde;o para executar uma aplica&amp;ccedil;&amp;atilde;o com direitos administrativos.&lt;/p&gt;
&lt;p&gt;As solicita&amp;ccedil;&amp;otilde;es de eleva&amp;ccedil;&amp;atilde;o s&amp;atilde;o acionadas pelas atividades de usu&amp;aacute;rio como instala&amp;ccedil;&amp;atilde;o de aplicativos, altera&amp;ccedil;&amp;otilde;es nas configura&amp;ccedil;&amp;otilde;es do sistema ou a&amp;ccedil;&amp;otilde;es que exigem privil&amp;eacute;gios administrativos.&lt;/p&gt;
&lt;p&gt;Para os usu&amp;aacute;rios com perfil de administrador, a mensagem oferece as op&amp;ccedil;&amp;otilde;es de permitir ou negar que o aplicativo seja iniciado. Caso contr&amp;aacute;rio, &amp;eacute; solicitado o usu&amp;aacute;rio e a senha de uma conta que possui perfil de administrador.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-52-04/1665.Figura1.png"&gt;&lt;img alt="" src="http://blogs.msdn.com/resized-image.ashx/__size/550x550/__key/communityserver-blogs-components-weblogfiles/00-00-01-52-04/1665.Figura1.png" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Figura 1 - Modo de aprova&amp;ccedil;&amp;atilde;o de eleva&amp;ccedil;&amp;atilde;o exibido para os usu&amp;aacute;rios com o perfil administrativo e comum respectivamente.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Com o UAC habilitado, todas as contas de usu&amp;aacute;rio, incluindo contas administrativas, executam com direitos de usu&amp;aacute;rio padr&amp;atilde;o.&lt;/p&gt;
&lt;p&gt;Quando um usu&amp;aacute;rio faz logon no Windows, o sistema cria um token de acesso para ele. Esse token cont&amp;eacute;m informa&amp;ccedil;&amp;otilde;es sobre o n&amp;iacute;vel de acesso que &amp;eacute; concedido ao usu&amp;aacute;rio, incluindo os identificadores de seguran&amp;ccedil;a (SIDs) e privil&amp;eacute;gios do Windows. Quando um administrador faz logon, o Windows cria dois tokens de acesso separados para o usu&amp;aacute;rio: um token de acesso sem privil&amp;eacute;gios administrativos (token filtrado) e um token de acesso de administrador (token full).&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-52-04/3857.Figura2.png"&gt;&lt;img alt="" src="http://blogs.msdn.com/resized-image.ashx/__size/550x550/__key/communityserver-blogs-components-weblogfiles/00-00-01-52-04/3857.Figura2.png" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Figura 2 - Vis&amp;atilde;o Conceitual do UAC&lt;/p&gt;
&lt;p&gt;O token de acesso do usu&amp;aacute;rio padr&amp;atilde;o cont&amp;eacute;m as mesmas informa&amp;ccedil;&amp;otilde;es espec&amp;iacute;ficas de usu&amp;aacute;rio do token de acesso de administrador, mas sem os privil&amp;eacute;gios administrativos do Windows e os SIDs. Por padr&amp;atilde;o, esse token filtrado &amp;eacute; usado para executar programas do usu&amp;aacute;rio. O token n&amp;atilde;o filtrado &amp;eacute; associado apenas com programas elevados.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-size: medium;"&gt;&lt;strong&gt;Virtualiza&amp;ccedil;&amp;atilde;o&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;A maioria dos problemas de compatibilidade das aplica&amp;ccedil;&amp;otilde;es legadas &amp;eacute; decorrente da falta de privil&amp;eacute;gios para manipular informa&amp;ccedil;&amp;otilde;es em locais protegidos do sistema operacional. No Windows 7 &amp;eacute; necess&amp;aacute;rio ter o perfil de administrador para armazenar informa&amp;ccedil;&amp;otilde;es em locais globais do sistema, uma vez que essa a&amp;ccedil;&amp;atilde;o afeta todas as contas de usu&amp;aacute;rio.&lt;/p&gt;
&lt;p&gt;Alguns aplicativos armazenam suas configura&amp;ccedil;&amp;otilde;es em &amp;aacute;reas globais do registro (&lt;strong&gt;HKLM&lt;/strong&gt;\Software) ao inv&amp;eacute;s de armazenar perfil do usu&amp;aacute;rio (&lt;strong&gt;HKCU&lt;/strong&gt;\Software), assim como, gravam configura&amp;ccedil;&amp;otilde;es e logs nas suas pr&amp;oacute;prias pastas, ou nas pastas de sistema (Windows, System32, Arquivos de Programas).&lt;/p&gt;
&lt;p&gt;Uma boa pr&amp;aacute;tica recomendada pela Microsoft &amp;eacute; salvar os dados espec&amp;iacute;ficos dos usu&amp;aacute;rios no diret&amp;oacute;rio %AppData% e salvar configura&amp;ccedil;&amp;otilde;es dos usu&amp;aacute;rios no perfil de registro do usu&amp;aacute;rio (HKEY_CURRENT_USER\Software).&lt;/p&gt;
&lt;p&gt;Com o UAC habilitado, quando um aplicativo legado tenta gravar em &amp;aacute;reas protegidas do sistema de arquivos ou de registro, o Windows silenciosamente e transparentemente redireciona o acesso a uma parte do sistema de arquivos ou do registro que o usu&amp;aacute;rio tem permiss&amp;atilde;o para modificar. Isso permite que v&amp;aacute;rios aplicativos necess&amp;aacute;rios direitos administrativos em vers&amp;otilde;es anteriores do Windows para executar com &amp;ecirc;xito usando direitos de usu&amp;aacute;rio apenas padr&amp;atilde;o no Windows Vista e no Windows 7.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-52-04/4520.Figura3.png"&gt;&lt;img alt="" src="http://blogs.msdn.com/resized-image.ashx/__size/550x550/__key/communityserver-blogs-components-weblogfiles/00-00-01-52-04/4520.Figura3.png" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Figura 3 - Virtualiza&amp;ccedil;&amp;atilde;o de Arquivos e do Registro&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;A virtualiza&amp;ccedil;&amp;atilde;o de arquivos e registro pode ser configurada atrav&amp;eacute;s da pol&amp;iacute;tica de seguran&amp;ccedil;a &lt;em&gt;&lt;strong&gt;&amp;ldquo;User Account Control: Virtualize file and registry write failures to per-user locations&amp;rdquo;&lt;/strong&gt;&lt;/em&gt; ou atrav&amp;eacute;s da chave do registro:&lt;/p&gt;
&lt;p&gt;&lt;span style="background-color: #c0c0c0;"&gt;Key: SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: #c0c0c0;"&gt;Value: "EnableVirtualization" Data: 0 (disabled); 1 (enabled)&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; &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Quando o usu&amp;aacute;rio navega em um diret&amp;oacute;rio que cont&amp;eacute;m arquivos virtualizados, o Explorer exibe um bot&amp;atilde;o arquivos de compatibilidade na sua barra de ferramentas (Figura 4). Ao clicar nesse bot&amp;atilde;o o usu&amp;aacute;rio &amp;eacute; redirecionado para o subdiret&amp;oacute;rio correspondente ao VirtualStore da conta do usu&amp;aacute;rio que cont&amp;eacute;m os arquivos virtualizados.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-52-04/7357.Figura4.png"&gt;&lt;img alt="" src="http://blogs.msdn.com/resized-image.ashx/__size/550x550/__key/communityserver-blogs-components-weblogfiles/00-00-01-52-04/7357.Figura4.png" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Figura 4- Resultado da virtualiza&amp;ccedil;&amp;atilde;o de arquivos&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;A vari&amp;aacute;vel de ambiente &lt;strong&gt;%LOCALAPPDATA%&lt;/strong&gt; fornece o caminho do diret&amp;oacute;rio VirtualStore correspondente a conta do usu&amp;aacute;rio.a&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-size: medium;"&gt;&lt;strong&gt;Onde Armazenar as Informa&amp;ccedil;&amp;otilde;es&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;
&lt;table style="width: 550px;" border="1" cellspacing="0" cellpadding="0"&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td width="148"&gt;
&lt;p&gt;&lt;b&gt;Requisitos&lt;/b&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td width="230"&gt;
&lt;p&gt;&lt;b&gt;Informa&amp;ccedil;&amp;otilde;es Compartilhadas&lt;/b&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td width="246"&gt;
&lt;p&gt;&lt;b&gt;Informa&amp;ccedil;&amp;otilde;es do Usu&amp;aacute;rio&lt;/b&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td width="148" valign="top"&gt;
&lt;p&gt;Vis&amp;iacute;vel no Explorer&lt;/p&gt;
&lt;/td&gt;
&lt;td width="230" valign="top"&gt;
&lt;p&gt;%PUBLIC% (%SystemDrive%\Users\Public)&lt;/p&gt;
&lt;/td&gt;
&lt;td width="246" valign="top"&gt;
&lt;p&gt;%USERPROFILE%\Documents&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td width="148" valign="top"&gt;
&lt;p&gt;Oculto no Explorer e armazenado apenas localmente&lt;/p&gt;
&lt;/td&gt;
&lt;td width="230" valign="top"&gt;
&lt;p&gt;%ALLUSERSPROFILE% (%ProgramData%,&lt;br /&gt;&amp;nbsp; %SystemDrive%\ProgramData)&lt;/p&gt;
&lt;/td&gt;
&lt;td width="246" valign="top"&gt;
&lt;p&gt;%LOCALAPPDATA%&lt;br /&gt;&amp;nbsp; (%USERPROFILE%\AppData\Local)&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td width="148" valign="top"&gt;
&lt;p&gt;Oculto no Explorer e que faz parte do perfil do usu&amp;aacute;rio&lt;/p&gt;
&lt;/td&gt;
&lt;td width="230" valign="top"&gt;
&lt;p&gt;n/a&lt;/p&gt;
&lt;/td&gt;
&lt;td width="246" valign="top"&gt;
&lt;p&gt;%APPDATA%&lt;br /&gt;&amp;nbsp; (%USERPROFILE%\AppData\Roaming)&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;span style="font-size: medium;"&gt;&lt;strong&gt;Onde Configurar o UAC&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;Para configurar o UAC abra o Painel de Controle, clique em Contas de Usu&amp;aacute;rios e clique em Alterar as configura&amp;ccedil;&amp;otilde;es da Conta do Usu&amp;aacute;rio (tamb&amp;eacute;m &amp;eacute; poss&amp;iacute;vel alterar as configura&amp;ccedil;&amp;otilde;es atrav&amp;eacute;s do link que &amp;eacute; exibido no prompt de notifica&amp;ccedil;&amp;atilde;o do UAC).&lt;br /&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-52-04/3733.Figura5.png"&gt;&lt;img alt="" src="http://blogs.msdn.com/resized-image.ashx/__size/550x550/__key/communityserver-blogs-components-weblogfiles/00-00-01-52-04/3733.Figura5.png" border="0" /&gt;&lt;/a&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp; Figura 5 - Configura&amp;ccedil;&amp;atilde;o do Controle de Conta do Usu&amp;aacute;rio (UAC)&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;Eacute; importante registrar que a Microsoft recomenda manter as configura&amp;ccedil;&amp;otilde;es no UAC no n&amp;iacute;vel padr&amp;atilde;o (Figura 5) e que &amp;eacute; necess&amp;aacute;rio reiniciar o Windows ap&amp;oacute;s ativar ou desativar o UAC para que as configura&amp;ccedil;&amp;otilde;es tenham efeito.&lt;/p&gt;
&lt;p&gt;&lt;span style="font-size: medium;"&gt;&lt;strong&gt;Conclus&amp;atilde;o&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Contas de usu&amp;aacute;rio padr&amp;atilde;o proporcionam maior seguran&amp;ccedil;a e menor custo total de propriedade em ambientes dom&amp;eacute;sticos e corporativos. Quando os usu&amp;aacute;rios executam com direitos de usu&amp;aacute;rio padr&amp;atilde;o em vez de direitos administrativos, a configura&amp;ccedil;&amp;atilde;o de seguran&amp;ccedil;a do sistema, incluindo antiv&amp;iacute;rus e firewall, &amp;eacute; protegida. Isso fornece aos usu&amp;aacute;rios uma &amp;aacute;rea segura que pode proteger sua conta e o restante do sistema. Para implanta&amp;ccedil;&amp;otilde;es empresariais, as diretivas definidas por gerentes de TI da &amp;aacute;rea de trabalho n&amp;atilde;o podem ser substitu&amp;iacute;das e, em um computador compartilhado da fam&amp;iacute;lia, diferentes contas de usu&amp;aacute;rio s&amp;atilde;o protegidas contra as altera&amp;ccedil;&amp;otilde;es feitas por outras contas.&lt;/p&gt;
&lt;p&gt;&lt;span style="font-size: medium;"&gt;&lt;strong&gt;Refer&amp;ecirc;ncias&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;Security &lt;br /&gt;Inside Windows Vista User Account Control&lt;br /&gt;Mark Russinovich&lt;br /&gt;&lt;a href="http://technet.microsoft.com/pt-BR/query/4ce22051-1ff9-49c1-ab06-d97658e993e0"&gt;http://technet.microsoft.com/pt-BR/query/4ce22051-1ff9-49c1-ab06-d97658e993e0&lt;/a&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10293907" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/b/luisdem/archive/tags/Compatibilidade+Windows+7/">Compatibilidade Windows 7</category></item></channel></rss>