<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Windows 11 on kenji.blog</title><link>http://kenji.blog/pt/tags/windows-11/</link><description>Recent content in Windows 11 on kenji.blog</description><generator>Hugo -- gohugo.io</generator><language>pt</language><copyright>kenjinote</copyright><lastBuildDate>Sat, 12 Sep 2026 22:00:00 +0900</lastBuildDate><atom:link href="http://kenji.blog/pt/tags/windows-11/index.xml" rel="self" type="application/rss+xml"/><item><title>Como criar pacotes MSIX para Windows 11 e a armadilha do certificado autoassinado</title><link>http://kenji.blog/pt/p/windows-11-msix-packaging-guide/</link><pubDate>Sat, 12 Sep 2026 22:00:00 +0900</pubDate><guid>http://kenji.blog/pt/p/windows-11-msix-packaging-guide/</guid><description>&lt;img src="http://kenji.blog/p/windows-11-msix-packaging-guide/img/eyecatch.jpg" alt="Featured image of post Como criar pacotes MSIX para Windows 11 e a armadilha do certificado autoassinado" />&lt;p>Na era do Windows 11, o &amp;ldquo;MSIX&amp;rdquo; está se tornando a escolha padrão como formato de distribuição de aplicativos. Os instaladores tradicionais como MSI e EXE tinham muitos problemas, mas o MSIX é esperado como uma tecnologia de empacotamento de próxima geração que os resolve. No entanto, quando os desenvolvedores tentam criar um pacote MSIX e realizar o sideloading em um ambiente de teste ou na organização, eles frequentemente caem na &amp;ldquo;armadilha do certificado autoassinado&amp;rdquo;.&lt;/p>
&lt;p>Neste artigo, explicaremos de forma muito detalhada desde os detalhes técnicos do MSIX, como criar pacotes usando o Visual Studio ou ferramentas de linha de comando, até as causas e soluções para os erros relacionados a certificados autoassinados que muitos desenvolvedores enfrentam. O objetivo é ser um guia essencial para desenvolvedores de aplicativos do Windows, administradores de infraestrutura e responsáveis por empacotamento.&lt;/p>
&lt;h2 id="1-o-que-é-msix-comparação-com-msiexe-tradicionais">1. O que é MSIX? Comparação com MSI/EXE tradicionais
&lt;/h2>&lt;p>O MSIX é o formato de pacote de aplicativos mais recente para Windows fornecido pela Microsoft. Ele integra todos os excelentes recursos e conceitos do MSI (Microsoft Installer), instaladores personalizados baseados em .exe, App-V (Application Virtualization) e AppX (pacote de aplicativos da Universal Windows Platform) introduzidos a partir do Windows 8, e evoluiu para atender aos modernos requisitos de segurança e implantação.&lt;/p>
&lt;h3 id="problemas-dos-instaladores-tradicionais-msiexe">Problemas dos instaladores tradicionais (MSI/EXE)
&lt;/h3>&lt;p>O MSI e o EXE, que têm sido usados como o formato de instalação padrão do Windows por muitos anos, tinham problemas fundamentais como os seguintes.&lt;/p>
&lt;ol>
&lt;li>&lt;strong>Fenômeno Win Rot (Degradação do Windows)&lt;/strong>: À medida que os aplicativos são instalados e desinstalados repetidamente, chaves desnecessárias permanecem no registro e DLLs são deixadas em pastas do sistema (como &lt;code>C:\Windows\System32&lt;/code>). Isso faz com que o funcionamento do próprio sistema operacional fique gradualmente mais lento e instável.&lt;/li>
&lt;li>&lt;strong>Inferno de DLL (DLL Hell)&lt;/strong>: Quando vários aplicativos tentam instalar uma DLL com o mesmo nome (mas de versões diferentes) em um diretório de sistema compartilhado, o aplicativo instalado posteriormente pode sobrescrever a DLL existente, fazendo com que o aplicativo instalado anteriormente pare de funcionar corretamente.&lt;/li>
&lt;li>&lt;strong>Instabilidade devido a ações personalizadas&lt;/strong>: Em pacotes MSI, scripts arbitrários ou código chamado &amp;ldquo;ação personalizada&amp;rdquo; (custom action) podem ser executados com privilégios de sistema durante a instalação e desinstalação. Isso trazia o risco de o instalador travar no meio do processo ou causar alterações inesperadas nas configurações do sistema.&lt;/li>
&lt;/ol>
&lt;h3 id="solução-através-da-arquitetura-em-contêineres-do-msix">Solução através da arquitetura em contêineres do MSIX
&lt;/h3>&lt;p>O MSIX resolve esses problemas executando aplicativos em &amp;ldquo;contêineres&amp;rdquo; leves. Essa abordagem de conteinerização oferece benefícios enormes como os seguintes:&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Desinstalação limpa&lt;/strong>: Aplicativos instalados via MSIX realizam gravações no sistema de arquivos e no registro de forma virtualizada (VFS: Virtual File System, VReg: Virtual Registry). Portanto, na desinstalação, esse contêiner virtualizado é excluído por completo, não deixando lixo (resquícios) no sistema. Previne completamente o Win Rot.&lt;/li>
&lt;li>&lt;strong>Isolamento e Segurança (Isolation)&lt;/strong>: Cada aplicativo é executado dentro de seu próprio ambiente e não destrói diretamente as DLLs ou recursos de outros aplicativos. Isso liberta do inferno de DLL.&lt;/li>
&lt;li>&lt;strong>Otimização da largura de banda de rede&lt;/strong>: O mecanismo de atualização do MSIX é excelente, suportando atualizações diferenciais em nível de bloco (Differential Update). Como ele baixa apenas os poucos blocos alterados nos dados binários, o impacto na rede é minimizado mesmo ao atualizar aplicativos grandes.&lt;/li>
&lt;li>&lt;strong>Estado de instalação garantido&lt;/strong>: O pacote inclui um arquivo de manifesto (&lt;code>AppxManifest.xml&lt;/code>), e as transações de instalação são rigorosamente gerenciadas em nível de sistema operacional. Em caso de falha, ocorre a reversão completa (rollback) para o estado original.&lt;/li>
&lt;/ul>
&lt;h2 id="2-visão-geral-da-criação-de-pacotes-msix-e-cadeia-de-ferramentas-toolchain">2. Visão geral da criação de pacotes MSIX e cadeia de ferramentas (Toolchain)
&lt;/h2>&lt;p>Para criar pacotes MSIX, existem duas abordagens principais. Uma é usar o Ambiente de Desenvolvimento Integrado (IDE) do Visual Studio e a outra é fazer uso total das ferramentas de linha de comando (&lt;code>MakeAppx.exe&lt;/code> e &lt;code>SignTool.exe&lt;/code>) incluídas no Windows SDK.&lt;/p>
&lt;p>O diagrama Mermaid abaixo mostra o processo desde os arquivos de origem até a geração final do pacote MSIX assinado.&lt;/p>
&lt;pre class="mermaid">
flowchart TD
A[&amp;#34;Arquivos de Origem (EXE, DLL, Assets, etc.)&amp;#34;] --&amp;gt; B[&amp;#34;AppxManifest.xml (Definição de Manifesto)&amp;#34;]
B --&amp;gt; C[&amp;#34;MakeAppx.exe (Empacotador MSIX)&amp;#34;]
C --&amp;gt; D[&amp;#34;Pacote MSIX Não Assinado (.msix)&amp;#34;]
E[&amp;#34;Certificado Digital (.pfx)&amp;#34;] --&amp;gt; F[&amp;#34;SignTool.exe (Assinador Digital)&amp;#34;]
D --&amp;gt; F
F --&amp;gt; G[&amp;#34;Pacote MSIX Assinado (Pronto para Implantação)&amp;#34;]
style A fill:#f9f9f9,stroke:#333
style B fill:#e6f7ff,stroke:#333
style D fill:#ffcccb,stroke:#333
style G fill:#d4edda,stroke:#333
&lt;/pre>
&lt;p>Como pode ser visto a partir desse processo, simplesmente reunir e empacotar os arquivos (packaging) não é suficiente; a etapa de &amp;ldquo;assinatura digital&amp;rdquo; é sempre necessária. O Windows 11 não permite a instalação de pacotes MSIX não assinados por razões de segurança, em nenhuma circunstância.&lt;/p>
&lt;h2 id="3-abordagem-a-criando-msix-usando-o-visual-studio">3. Abordagem A: Criando MSIX usando o Visual Studio
&lt;/h2>&lt;p>O método mais fácil e comum é usar o &amp;ldquo;Windows Application Packaging Project (WAP)&amp;rdquo; do Visual Studio. Usando esse modelo de projeto, é possível converter facilmente para MSIX aplicativos em WPF, Windows Forms, WinUI 3 ou até mesmo aplicativos legados Win32 em C++.&lt;/p>
&lt;h3 id="guia-passo-a-passo">Guia passo a passo
&lt;/h3>&lt;ol>
&lt;li>&lt;strong>Adicionar o projeto WAP&lt;/strong>: Clique com o botão direito do mouse na solução existente do Visual Studio e selecione &amp;ldquo;Adicionar Novo Projeto&amp;rdquo; -&amp;gt; &amp;ldquo;Windows Application Packaging Project&amp;rdquo;.&lt;/li>
&lt;li>&lt;strong>Selecionar a plataforma de destino&lt;/strong>: Especifique a versão mínima e a versão de destino do Windows 10/11 suportada pelo aplicativo.&lt;/li>
&lt;li>&lt;strong>Referência do aplicativo&lt;/strong>: Clique com o botão direito do mouse no nó &amp;ldquo;Aplicativos&amp;rdquo; do projeto de empacotamento e, em &amp;ldquo;Adicionar Referência&amp;rdquo;, selecione o projeto principal que deseja empacotar (por exemplo, um projeto WPF).&lt;/li>
&lt;li>&lt;strong>Configuração do manifesto&lt;/strong>: Dê um duplo clique no arquivo &lt;code>Package.appxmanifest&lt;/code> para abrir o designer visual. Aqui, configure o nome de exibição, a descrição, a imagem do logotipo do aplicativo e, mais importante, o &amp;ldquo;Nome do Pacote (Identity Name)&amp;rdquo; e o &amp;ldquo;Fornecedor (Publisher)&amp;rdquo;.&lt;/li>
&lt;li>&lt;strong>Criação do pacote&lt;/strong>: Clique com o botão direito do mouse no projeto e selecione &amp;ldquo;Publicar&amp;rdquo; -&amp;gt; &amp;ldquo;Criar Pacotes de Aplicativos&amp;rdquo;. Ao selecionar &amp;ldquo;Sideloading&amp;rdquo; e escolher a arquitetura (x64, ARM64, etc.), o Visual Studio cuidará automaticamente da compilação, do empacotamento com o &lt;code>MakeAppx&lt;/code> e da geração de um certificado autoassinado junto com a assinatura.&lt;/li>
&lt;/ol>
&lt;p>É um processo muito fluido, mas se você usar o certificado autoassinado (Test Certificate) gerado automaticamente pelo Visual Studio aqui, você cairá na &amp;ldquo;armadilha&amp;rdquo; mencionada mais adiante.&lt;/p>
&lt;h2 id="4-abordagem-b-criando-usando-a-linha-de-comando-makeappxexe">4. Abordagem B: Criando usando a linha de comando (MakeAppx.exe)
&lt;/h2>&lt;p>As ferramentas de linha de comando são necessárias para automação em pipelines CI/CD ou ao reempacotar manualmente arquivos de um instalador existente. Se o Windows SDK estiver instalado no seu ambiente, você pode acessar as seguintes ferramentas através do prompt de comando do desenvolvedor.&lt;/p>
&lt;h3 id="1-preparação-do-arquivo-de-manifesto">1. Preparação do arquivo de manifesto
&lt;/h3>&lt;p>Crie um &lt;code>AppxManifest.xml&lt;/code> com as informações mínimas necessárias no diretório raiz do pacote.&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt"> 1
&lt;/span>&lt;span class="lnt"> 2
&lt;/span>&lt;span class="lnt"> 3
&lt;/span>&lt;span class="lnt"> 4
&lt;/span>&lt;span class="lnt"> 5
&lt;/span>&lt;span class="lnt"> 6
&lt;/span>&lt;span class="lnt"> 7
&lt;/span>&lt;span class="lnt"> 8
&lt;/span>&lt;span class="lnt"> 9
&lt;/span>&lt;span class="lnt">10
&lt;/span>&lt;span class="lnt">11
&lt;/span>&lt;span class="lnt">12
&lt;/span>&lt;span class="lnt">13
&lt;/span>&lt;span class="lnt">14
&lt;/span>&lt;span class="lnt">15
&lt;/span>&lt;span class="lnt">16
&lt;/span>&lt;span class="lnt">17
&lt;/span>&lt;span class="lnt">18
&lt;/span>&lt;span class="lnt">19
&lt;/span>&lt;span class="lnt">20
&lt;/span>&lt;span class="lnt">21
&lt;/span>&lt;span class="lnt">22
&lt;/span>&lt;span class="lnt">23
&lt;/span>&lt;span class="lnt">24
&lt;/span>&lt;span class="lnt">25
&lt;/span>&lt;span class="lnt">26
&lt;/span>&lt;span class="lnt">27
&lt;/span>&lt;span class="lnt">28
&lt;/span>&lt;span class="lnt">29
&lt;/span>&lt;span class="lnt">30
&lt;/span>&lt;span class="lnt">31
&lt;/span>&lt;span class="lnt">32
&lt;/span>&lt;span class="lnt">33
&lt;/span>&lt;span class="lnt">34
&lt;/span>&lt;span class="lnt">35
&lt;/span>&lt;span class="lnt">36
&lt;/span>&lt;span class="lnt">37
&lt;/span>&lt;span class="lnt">38
&lt;/span>&lt;span class="lnt">39
&lt;/span>&lt;span class="lnt">40
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-xml" data-lang="xml">&lt;span class="line">&lt;span class="cl">&lt;span class="cp">&amp;lt;?xml version=&amp;#34;1.0&amp;#34; encoding=&amp;#34;utf-8&amp;#34;?&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nt">&amp;lt;Package&lt;/span> &lt;span class="na">xmlns=&lt;/span>&lt;span class="s">&amp;#34;http://schemas.microsoft.com/appx/manifest/foundation/windows10&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="na">xmlns:uap=&lt;/span>&lt;span class="s">&amp;#34;http://schemas.microsoft.com/appx/manifest/uap/windows10&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="na">xmlns:rescap=&lt;/span>&lt;span class="s">&amp;#34;http://schemas.microsoft.com/appx/manifest/foundation/windows10/restrictedcapabilities&amp;#34;&lt;/span>&lt;span class="nt">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;Identity&lt;/span> &lt;span class="na">Name=&lt;/span>&lt;span class="s">&amp;#34;MyCompany.AwesomeApp&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="na">Publisher=&lt;/span>&lt;span class="s">&amp;#34;CN=MyCompany Self-Signed, O=MyCompany&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="na">Version=&lt;/span>&lt;span class="s">&amp;#34;1.0.0.0&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="na">ProcessorArchitecture=&lt;/span>&lt;span class="s">&amp;#34;x64&amp;#34;&lt;/span> &lt;span class="nt">/&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;Properties&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;DisplayName&amp;gt;&lt;/span>Awesome App&lt;span class="nt">&amp;lt;/DisplayName&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;PublisherDisplayName&amp;gt;&lt;/span>My Company&lt;span class="nt">&amp;lt;/PublisherDisplayName&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;Logo&amp;gt;&lt;/span>Assets\StoreLogo.png&lt;span class="nt">&amp;lt;/Logo&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;/Properties&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;Resources&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;Resource&lt;/span> &lt;span class="na">Language=&lt;/span>&lt;span class="s">&amp;#34;en-us&amp;#34;&lt;/span> &lt;span class="nt">/&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;Resource&lt;/span> &lt;span class="na">Language=&lt;/span>&lt;span class="s">&amp;#34;ja-jp&amp;#34;&lt;/span> &lt;span class="nt">/&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;/Resources&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;Dependencies&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;TargetDeviceFamily&lt;/span> &lt;span class="na">Name=&lt;/span>&lt;span class="s">&amp;#34;Windows.Desktop&amp;#34;&lt;/span> &lt;span class="na">MinVersion=&lt;/span>&lt;span class="s">&amp;#34;10.0.17763.0&amp;#34;&lt;/span> &lt;span class="na">MaxVersionTested=&lt;/span>&lt;span class="s">&amp;#34;10.0.22000.0&amp;#34;&lt;/span> &lt;span class="nt">/&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;/Dependencies&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;Capabilities&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;rescap:Capability&lt;/span> &lt;span class="na">Name=&lt;/span>&lt;span class="s">&amp;#34;runFullTrust&amp;#34;&lt;/span> &lt;span class="nt">/&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;/Capabilities&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;Applications&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;Application&lt;/span> &lt;span class="na">Id=&lt;/span>&lt;span class="s">&amp;#34;AwesomeApp&amp;#34;&lt;/span> &lt;span class="na">Executable=&lt;/span>&lt;span class="s">&amp;#34;AwesomeApp.exe&amp;#34;&lt;/span> &lt;span class="na">EntryPoint=&lt;/span>&lt;span class="s">&amp;#34;Windows.FullTrustApplication&amp;#34;&lt;/span>&lt;span class="nt">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;uap:VisualElements&lt;/span> &lt;span class="na">DisplayName=&lt;/span>&lt;span class="s">&amp;#34;Awesome App&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="na">Description=&lt;/span>&lt;span class="s">&amp;#34;The best app ever.&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="na">BackgroundColor=&lt;/span>&lt;span class="s">&amp;#34;transparent&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="na">Square150x150Logo=&lt;/span>&lt;span class="s">&amp;#34;Assets\Square150x150Logo.png&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="na">Square44x44Logo=&lt;/span>&lt;span class="s">&amp;#34;Assets\Square44x44Logo.png&amp;#34;&lt;/span>&lt;span class="nt">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;/uap:VisualElements&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;/Application&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;/Applications&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nt">&amp;lt;/Package&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>O importante aqui é que o valor de &lt;code>&amp;lt;Identity Publisher=&amp;quot;...&amp;quot; /&amp;gt;&lt;/code> deve corresponder exatamente ao Subject do certificado que será usado posteriormente para a assinatura.&lt;/p>
&lt;h3 id="2-empacotamento-com-o-makeappx">2. Empacotamento com o MakeAppx
&lt;/h3>&lt;p>Execute o seguinte comando no prompt de comando para consolidar o diretório em um arquivo MSIX.&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-cmd" data-lang="cmd">&lt;span class="line">&lt;span class="cl">MakeAppx.exe pack /d &lt;span class="s2">&amp;#34;C:\Path\To\AppFolder&amp;#34;&lt;/span> /p &lt;span class="s2">&amp;#34;C:\Path\To\Output\AwesomeApp_1.0.0.0_x64.msix&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>Isso concluirá a criação do arquivo MSIX não assinado, mas, nesse estado, ele não pode ser instalado no Windows.&lt;/p>
&lt;h2 id="5-assinatura-digital-e-contexto-matemático-da-criptografia">5. Assinatura digital e contexto matemático da criptografia
&lt;/h2>&lt;p>Para entender profundamente por que os pacotes MSIX precisam de assinatura, é necessário compreender o mecanismo criptográfico por trás da assinatura digital. A assinatura digital garante que o pacote &amp;ldquo;foi certamente criado pelo fornecedor especificado (autenticidade)&amp;rdquo; e &amp;ldquo;não foi adulterado por terceiros desde a sua criação até agora (integridade)&amp;rdquo;.&lt;/p>
&lt;p>A assinatura do MSIX geralmente usa uma combinação da criptografia RSA e SHA-256 (Secure Hash Algorithm 256-bit).&lt;/p>
&lt;h3 id="aplicação-da-função-hash">Aplicação da função hash
&lt;/h3>&lt;p>Primeiro, considere que todos os binários (conteúdo) do pacote MSIX sejam a mensagem $M$. A ferramenta de assinatura (SignTool.exe) aplica a função de hash criptográfico SHA-256 a esta mensagem $M$ para calcular um valor de hash $H(M)$ de comprimento fixo (256 bits).&lt;/p>
&lt;h3 id="geração-da-assinatura-fornecedor">Geração da assinatura (Fornecedor)
&lt;/h3>&lt;p>Em seguida, o fornecedor usa a sua própria &amp;ldquo;chave privada (Private Key)&amp;rdquo; $d$ para criptografar o valor do hash e gerar a assinatura digital $\sigma$. No contexto do algoritmo RSA, isso é expresso como uma exponenciação modular, da seguinte forma:&lt;/p>
$$ \sigma \equiv (H(M))^d \pmod n $$&lt;p>Aqui, $n$ é o módulo RSA (o produto de dois grandes números primos). Um certificado (no formato X.509) contendo esta assinatura $\sigma$ e a &amp;ldquo;chave pública (Public Key)&amp;rdquo; $e$ do fornecedor é incorporado como parte do pacote MSIX (&lt;code>AppxSignature.p7x&lt;/code>).&lt;/p>
&lt;h3 id="verificação-da-assinatura-sistema-operacional-windows">Verificação da assinatura (Sistema Operacional Windows)
&lt;/h3>&lt;p>Quando o usuário tenta instalar o MSIX, o sistema operacional Windows extrai a chave pública $e$ do certificado dentro do pacote e realiza o seguinte cálculo para restaurar o valor do hash $H'(M)$:&lt;/p>
$$ H'(M) \equiv \sigma^e \pmod n $$&lt;p>Simultaneamente, o sistema operacional recalcula o valor de hash $H(M)$ de todo o pacote MSIX baixado $M$ por conta própria.
Por fim, ele verifica se o valor do hash restaurado é igual ao valor do hash recalculado ($H(M) = H'(M)$). Se essa equação for verdadeira, está matematicamente provado que &amp;ldquo;o arquivo não foi adulterado nem em 1 bit após a assinatura&amp;rdquo;.&lt;/p>
&lt;h2 id="6-a-maior-barreira-a-armadilha-do-certificado-autoassinado">6. A maior barreira: &amp;ldquo;A armadilha do certificado autoassinado&amp;rdquo;
&lt;/h2>&lt;p>Mesmo que a prova matemática acima seja perfeita, o Windows 11 não permite a instalação apenas com isso. Isso ocorre porque é necessário verificar a &amp;ldquo;Cadeia de Confiança (Chain of Trust)&amp;rdquo;: &amp;ldquo;O proprietário da chave pública (certificado) é realmente a organização/pessoa segura que afirma ser?&amp;rdquo;&lt;/p>
&lt;p>Se o certificado for emitido por uma Autoridade de Certificação Raiz (Root CA) pública, previamente confiável pelo sistema operacional, como VeriSign ou DigiCert, ele pode ser instalado sem problemas (os aplicativos distribuídos via Microsoft Store também são igualmente confiáveis pelo certificado raiz da Microsoft).&lt;/p>
&lt;p>No entanto, em ferramentas exclusivas internas ou em desenvolvimento, onde o custo de compra de um certificado público não se justifica, o desenvolvedor emite o certificado por conta própria. Isso é o &amp;ldquo;certificado autoassinado (Self-Signed Certificate)&amp;rdquo;.&lt;/p>
&lt;p>O diagrama de sequência abaixo mostra o comportamento do sistema operacional ao tentar instalar um pacote MSIX assinado com um certificado autoassinado.&lt;/p>
&lt;pre class="mermaid">
sequenceDiagram
autonumber
participant U as &amp;#34;Usuário (Windows 11)&amp;#34;
participant P as &amp;#34;Instalador de Aplicativo MSIX&amp;#34;
participant C as &amp;#34;Repositório de Certificados do Windows&amp;#34;
U-&amp;gt;&amp;gt;P: &amp;#34;Duplo clique no arquivo .msix&amp;#34;
P-&amp;gt;&amp;gt;P: &amp;#34;Lê AppxSignature.p7x&amp;#34;
P-&amp;gt;&amp;gt;P: &amp;#34;Extrai Assinatura e Certificado&amp;#34;
P-&amp;gt;&amp;gt;P: &amp;#34;Verifica Matemática (Hashes coincidem?)&amp;#34;
P-&amp;gt;&amp;gt;C: &amp;#34;Verifica Confiança do Certificado do Fornecedor&amp;#34;
alt &amp;#34;O Certificado está no Repositório de CAs Raiz Confiáveis&amp;#34;
C--&amp;gt;&amp;gt;P: &amp;#34;Confiança Verificada com Sucesso&amp;#34;
P-&amp;gt;&amp;gt;U: &amp;#34;Solicita Instalação (O botão Instalar está ATIVO)&amp;#34;
U-&amp;gt;&amp;gt;P: &amp;#34;Clica em Instalar&amp;#34;
P-&amp;gt;&amp;gt;U: &amp;#34;Instalação Bem-sucedida&amp;#34;
else &amp;#34;O Certificado NÃO é Confiável (A Armadilha)&amp;#34;
C--&amp;gt;&amp;gt;P: &amp;#34;Falha na Verificação de Confiança (0x800B0109)&amp;#34;
P-&amp;gt;&amp;gt;U: &amp;#34;Exibe Erro: Cadeia de certificados processada, mas terminou num certificado raiz que não é confiável&amp;#34;
P-&amp;gt;&amp;gt;U: &amp;#34;O botão Instalar está DESATIVADO&amp;#34;
end
&lt;/pre>
&lt;p>Isso é exatamente a &amp;ldquo;armadilha&amp;rdquo;. Mesmo que o próprio desenvolvedor o tenha criado e assinado corretamente, o estado padrão do Windows 11 não conhece (não confia) nesse certificado autoassinado, de modo que a instalação é bloqueada com o código de erro &lt;code>0x800B0109&lt;/code>. O botão &amp;ldquo;Instalar&amp;rdquo; do instalador fica acinzentado e não pode ser pressionado.&lt;/p>
&lt;p>Muitos desenvolvedores se deparam com esse erro e caem no labirinto de reescrever o arquivo de manifesto várias vezes pensando &amp;ldquo;O MSIX está cheio de bugs&amp;rdquo; ou &amp;ldquo;Minhas configurações devem estar incorretas&amp;rdquo;, mas o problema não está na estrutura do pacote, e sim na presença ou ausência do registro no Repositório de Certificados (Certificate Store) do sistema operacional.&lt;/p>
&lt;h2 id="7-solução-criação-e-implantação-de-um-certificado-autoassinado-usando-powershell">7. Solução: Criação e implantação de um certificado autoassinado usando PowerShell
&lt;/h2>&lt;p>Para resolver esse problema, é necessário executar confiavelmente as duas etapas a seguir.&lt;/p>
&lt;ol>
&lt;li>Criar um certificado autoassinado válido e exportar o arquivo PFX contendo a chave privada.&lt;/li>
&lt;li>Instalar a parte da chave pública do certificado criado (arquivo CER) no repositório &lt;strong>&amp;ldquo;Autoridades de Certificação Raiz Confiáveis&amp;rdquo; (Trusted Root Certification Authorities) de todos os PCs de destino&lt;/strong>.&lt;/li>
&lt;/ol>
&lt;p>Isso pode ser feito de forma confiável e automática usando o PowerShell.&lt;/p>
&lt;h3 id="etapa-1-criação-e-exportação-do-certificado-autoassinado">Etapa 1: Criação e exportação do certificado autoassinado
&lt;/h3>&lt;p>Primeiro, inicie o PowerShell com privilégios de administrador e execute o script a seguir para criar o certificado. Aqui, iremos gerar um certificado especializado para assinatura de código (Code Signing).&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt"> 1
&lt;/span>&lt;span class="lnt"> 2
&lt;/span>&lt;span class="lnt"> 3
&lt;/span>&lt;span class="lnt"> 4
&lt;/span>&lt;span class="lnt"> 5
&lt;/span>&lt;span class="lnt"> 6
&lt;/span>&lt;span class="lnt"> 7
&lt;/span>&lt;span class="lnt"> 8
&lt;/span>&lt;span class="lnt"> 9
&lt;/span>&lt;span class="lnt">10
&lt;/span>&lt;span class="lnt">11
&lt;/span>&lt;span class="lnt">12
&lt;/span>&lt;span class="lnt">13
&lt;/span>&lt;span class="lnt">14
&lt;/span>&lt;span class="lnt">15
&lt;/span>&lt;span class="lnt">16
&lt;/span>&lt;span class="lnt">17
&lt;/span>&lt;span class="lnt">18
&lt;/span>&lt;span class="lnt">19
&lt;/span>&lt;span class="lnt">20
&lt;/span>&lt;span class="lnt">21
&lt;/span>&lt;span class="lnt">22
&lt;/span>&lt;span class="lnt">23
&lt;/span>&lt;span class="lnt">24
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-powershell" data-lang="powershell">&lt;span class="line">&lt;span class="cl">&lt;span class="c"># 1. Definição de parâmetros&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nv">$SubjectName&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="s2">&amp;#34;CN=MyCompany Self-Signed, O=MyCompany&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nv">$CertStoreLocation&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="s2">&amp;#34;Cert:\CurrentUser\My&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c"># 2. Geração do certificado autoassinado (Uso para Code Signing: 1.3.6.1.5.5.7.3.3)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nv">$Cert&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="nb">New-SelfSignedCertificate&lt;/span> &lt;span class="n">-Type&lt;/span> &lt;span class="n">Custom&lt;/span> &lt;span class="p">`&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">-Subject&lt;/span> &lt;span class="nv">$SubjectName&lt;/span> &lt;span class="p">`&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">-KeyUsage&lt;/span> &lt;span class="n">DigitalSignature&lt;/span> &lt;span class="p">`&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">-FriendlyName&lt;/span> &lt;span class="s2">&amp;#34;MyCompany MSIX Signing Cert&amp;#34;&lt;/span> &lt;span class="p">`&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">-CertStoreLocation&lt;/span> &lt;span class="nv">$CertStoreLocation&lt;/span> &lt;span class="p">`&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">-TextExtension&lt;/span> &lt;span class="vm">@&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;2.5.29.37={text}1.3.6.1.5.5.7.3.3&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s2">&amp;#34;2.5.29.19={text}&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">Write-Host&lt;/span> &lt;span class="s2">&amp;#34;Certificado gerado com sucesso. Thumbprint: &lt;/span>&lt;span class="p">$(&lt;/span>&lt;span class="nv">$Cert&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">Thumbprint&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c"># 3. Criação de senha para exportação do PFX (com chave privada)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nv">$Password&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="nb">ConvertTo-SecureString&lt;/span> &lt;span class="n">-String&lt;/span> &lt;span class="s2">&amp;#34;YourSecurePassword123!&amp;#34;&lt;/span> &lt;span class="n">-Force&lt;/span> &lt;span class="n">-AsPlainText&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c"># 4. Exportação do arquivo PFX (Para assinatura com SignTool)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nv">$PfxPath&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="s2">&amp;#34;C:\Path\To\Output\MyCompanyCert.pfx&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">Export-PfxCertificate&lt;/span> &lt;span class="n">-Cert&lt;/span> &lt;span class="nv">$Cert&lt;/span> &lt;span class="n">-FilePath&lt;/span> &lt;span class="nv">$PfxPath&lt;/span> &lt;span class="n">-Password&lt;/span> &lt;span class="nv">$Password&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c"># 5. Exportação do arquivo CER (Apenas chave pública, para instalação em PCs clientes)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nv">$CerPath&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="s2">&amp;#34;C:\Path\To\Output\MyCompanyCert.cer&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">Export-Certificate&lt;/span> &lt;span class="n">-Cert&lt;/span> &lt;span class="nv">$Cert&lt;/span> &lt;span class="n">-FilePath&lt;/span> &lt;span class="nv">$CerPath&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>Usaremos o arquivo &lt;code>$PfxPath&lt;/code> criado aqui para assinar o pacote MSIX.&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-cmd" data-lang="cmd">&lt;span class="line">&lt;span class="cl">SignTool.exe sign /fd SHA256 /a /f &lt;span class="s2">&amp;#34;C:\Path\To\Output\MyCompanyCert.pfx&amp;#34;&lt;/span> /p &lt;span class="s2">&amp;#34;YourSecurePassword123!&amp;#34;&lt;/span> &lt;span class="s2">&amp;#34;C:\Path\To\Output\AwesomeApp_1.0.0.0_x64.msix&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;h3 id="etapa-2-instalação-do-certificado-no-pc-cliente-desarmando-a-armadilha">Etapa 2: Instalação do certificado no PC cliente (Desarmando a armadilha)
&lt;/h3>&lt;p>Se você levar o MSIX assinado para outro PC (ou ambiente virtual) e simplesmente der um duplo clique, ele não será instalado, conforme mencionado antes. Previamente (ou simultaneamente), você deve instalar o arquivo &lt;code>$CerPath&lt;/code> exportado anteriormente nas &amp;ldquo;Autoridades de Certificação Raiz Confiáveis&amp;rdquo; do &amp;ldquo;Computador local&amp;rdquo;.&lt;/p>
&lt;p>Para fazer isso, abra o PowerShell com &lt;strong>privilégios de administrador&lt;/strong> no PC de destino e execute o seguinte comando.&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;span class="lnt">3
&lt;/span>&lt;span class="lnt">4
&lt;/span>&lt;span class="lnt">5
&lt;/span>&lt;span class="lnt">6
&lt;/span>&lt;span class="lnt">7
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-powershell" data-lang="powershell">&lt;span class="line">&lt;span class="cl">&lt;span class="c"># Caminho para o arquivo CER&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nv">$CerPath&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="s2">&amp;#34;C:\Path\To\Output\MyCompanyCert.cer&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c"># Importar para as &amp;#34;Autoridades de Certificação Raiz Confiáveis&amp;#34; da máquina local&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">Import-Certificate&lt;/span> &lt;span class="n">-FilePath&lt;/span> &lt;span class="nv">$CerPath&lt;/span> &lt;span class="n">-CertStoreLocation&lt;/span> &lt;span class="s2">&amp;#34;Cert:\LocalMachine\Root&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">Write-Host&lt;/span> &lt;span class="s2">&amp;#34;O certificado foi instalado nas Autoridades de Certificação Raiz Confiáveis.&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;blockquote>
&lt;p>[!CAUTION]
A adição ao repositório de autoridades de certificação raiz do &amp;ldquo;Computador local (&lt;code>LocalMachine&lt;/code>)&amp;rdquo; exige privilégios de administrador. Tenha cuidado, pois colocar no repositório individual do usuário (&lt;code>CurrentUser&lt;/code>) pode não ser reconhecido devido ao contexto de permissões do App Installer.&lt;/p>
&lt;/blockquote>
&lt;p>Logo após a execução bem-sucedida desse script, tente dar um duplo clique novamente no arquivo MSIX que apresentava erro. Como um passe de mágica, a mensagem de erro desaparecerá e um botão de &amp;ldquo;Instalar&amp;rdquo; ativo e azul brilhante deve ser exibido. Com isso, superamos completamente a &amp;ldquo;armadilha do certificado autoassinado&amp;rdquo;.&lt;/p>
&lt;h2 id="8-operação-e-melhores-práticas-em-ambiente-corporativo">8. Operação e melhores práticas em ambiente corporativo
&lt;/h2>&lt;p>Embora as etapas acima sejam suficientes para testes locais do desenvolvedor, quando se implementa um aplicativo de sideloading em dezenas ou centenas de PCs na empresa, fazer com que cada usuário execute o script de instalação do certificado é inviável e traz riscos de segurança.&lt;/p>
&lt;p>As melhores práticas em um ambiente corporativo são as seguintes:&lt;/p>
&lt;h3 id="1-utilização-de-políticas-de-grupo-do-active-directory-gpo">1. Utilização de Políticas de Grupo do Active Directory (GPO)
&lt;/h3>&lt;p>Se a sua empresa usa Active Directory, você pode usar as &amp;ldquo;Políticas de Chave Pública&amp;rdquo; da GPO para distribuir automaticamente certificados autoassinados (arquivos CER) para as &amp;ldquo;Autoridades de Certificação Raiz Confiáveis&amp;rdquo; de todos os PCs no domínio. Dessa forma, os funcionários podem instalar os aplicativos com um simples duplo clique no arquivo MSIX de uma pasta compartilhada, sem sequer precisarem se preocupar com os certificados.&lt;/p>
&lt;h3 id="2-implantação-através-do-microsoft-intune-mdm">2. Implantação através do Microsoft Intune (MDM)
&lt;/h3>&lt;p>Em ambientes modernos, o gerenciamento de dispositivos é feito usando o Microsoft Intune. Com o Intune, você pode usar o recurso de &amp;ldquo;Perfil de configuração&amp;rdquo; (Configuration Profile) para enviar o certificado confiável (.cer) aos endpoints via push. Em seguida, o próprio pacote MSIX pode ser implantado como uma instalação silenciosa, como um aplicativo LOB (Line of Business).&lt;/p>
&lt;h3 id="3-atualizações-automáticas-com-o-arquivo-app-installer-appinstaller">3. Atualizações automáticas com o arquivo App Installer (.appinstaller)
&lt;/h3>&lt;p>O MSIX possui um poderoso recurso integrado para automatizar atualizações de aplicativos. Ao criar um arquivo &lt;code>.appinstaller&lt;/code> baseado em XML e colocá-lo em um servidor web ou pasta compartilhada SMB, o aplicativo verificará automaticamente, em segundo plano durante a inicialização, a existência de novas versões do MSIX e aplicará a atualização automaticamente.&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt"> 1
&lt;/span>&lt;span class="lnt"> 2
&lt;/span>&lt;span class="lnt"> 3
&lt;/span>&lt;span class="lnt"> 4
&lt;/span>&lt;span class="lnt"> 5
&lt;/span>&lt;span class="lnt"> 6
&lt;/span>&lt;span class="lnt"> 7
&lt;/span>&lt;span class="lnt"> 8
&lt;/span>&lt;span class="lnt"> 9
&lt;/span>&lt;span class="lnt">10
&lt;/span>&lt;span class="lnt">11
&lt;/span>&lt;span class="lnt">12
&lt;/span>&lt;span class="lnt">13
&lt;/span>&lt;span class="lnt">14
&lt;/span>&lt;span class="lnt">15
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-xml" data-lang="xml">&lt;span class="line">&lt;span class="cl">&lt;span class="cp">&amp;lt;?xml version=&amp;#34;1.0&amp;#34; encoding=&amp;#34;utf-8&amp;#34;?&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nt">&amp;lt;AppInstaller&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="na">Uri=&lt;/span>&lt;span class="s">&amp;#34;https://internal.mycompany.com/apps/AwesomeApp.appinstaller&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="na">Version=&lt;/span>&lt;span class="s">&amp;#34;1.0.0.0&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="na">xmlns=&lt;/span>&lt;span class="s">&amp;#34;http://schemas.microsoft.com/appx/appinstaller/2018&amp;#34;&lt;/span>&lt;span class="nt">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;MainPackage&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="na">Name=&lt;/span>&lt;span class="s">&amp;#34;MyCompany.AwesomeApp&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="na">Publisher=&lt;/span>&lt;span class="s">&amp;#34;CN=MyCompany Self-Signed, O=MyCompany&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="na">Version=&lt;/span>&lt;span class="s">&amp;#34;1.0.0.0&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="na">ProcessorArchitecture=&lt;/span>&lt;span class="s">&amp;#34;x64&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="na">Uri=&lt;/span>&lt;span class="s">&amp;#34;https://internal.mycompany.com/apps/AwesomeApp_1.0.0.0_x64.msix&amp;#34;&lt;/span> &lt;span class="nt">/&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;UpdateSettings&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;OnLaunch&lt;/span> &lt;span class="na">HoursBetweenUpdateChecks=&lt;/span>&lt;span class="s">&amp;#34;0&amp;#34;&lt;/span> &lt;span class="nt">/&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;/UpdateSettings&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nt">&amp;lt;/AppInstaller&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>Ao distribuir e instalar este arquivo para os usuários, a partir desse momento, as atualizações de todos os usuários acontecerão automaticamente bastando substituir o arquivo MSIX no servidor e atualizar o número da versão no &lt;code>.appinstaller&lt;/code>.&lt;/p>
&lt;h2 id="9-solução-de-problemas-erros-comuns-relacionados-a-certificados">9. Solução de Problemas: Erros comuns relacionados a certificados
&lt;/h2>&lt;p>Por fim, aqui está um resumo de outros erros comuns que podem ocorrer em relação a certificados e assinaturas, juntamente com suas soluções.&lt;/p>
&lt;ul>
&lt;li>&lt;strong>0x800B0101&lt;/strong>: O certificado usado para a assinatura expirou. Emita um novo certificado ou certifique-se de usar um servidor de carimbo de data/hora (por exemplo, &lt;code>http://timestamp.digicert.com&lt;/code>) no momento da assinatura para comprovar que o arquivo foi assinado durante o período de validade do certificado (se você adicionar o carimbo de data/hora, a assinatura será considerada válida mesmo após o vencimento do próprio certificado).&lt;/li>
&lt;li>&lt;strong>0x80080204&lt;/strong>: O valor de &lt;code>Publisher&lt;/code> descrito no &lt;code>AppxManifest.xml&lt;/code> não corresponde exatamente ao valor de &lt;code>Subject&lt;/code> no certificado. Verifique rigorosamente a exatidão exata da string, incluindo a presença ou ausência de espaços após as vírgulas.&lt;/li>
&lt;li>&lt;strong>Verificando o Visualizador de Eventos (Event Viewer)&lt;/strong>: Para encontrar a causa mais detalhada de um erro, é extremamente importante abrir o Visualizador de Eventos do Windows e verificar os logs em &amp;ldquo;Logs de Aplicativos e Serviços&amp;rdquo; -&amp;gt; &amp;ldquo;Microsoft&amp;rdquo; -&amp;gt; &amp;ldquo;Windows&amp;rdquo; -&amp;gt; &amp;ldquo;AppxPackagingOM&amp;rdquo; ou &amp;ldquo;AppXDeployment-Server&amp;rdquo;.&lt;/li>
&lt;/ul>
&lt;h2 id="10-conclusão">10. Conclusão
&lt;/h2>&lt;p>O empacotamento MSIX para o Windows 11 é uma tecnologia poderosa que melhora dramaticamente a gestão do ciclo de vida dos aplicativos. Liberta os utilizadores do Win Rot e do Inferno de DLLs, proporcionando um ambiente limpo e seguro.&lt;/p>
&lt;p>Por outro lado, como o modelo de segurança se tornou mais rigoroso, é essencial um profundo entendimento de assinaturas digitais e da &amp;ldquo;cadeia de confiança&amp;rdquo; dos certificados. A &amp;ldquo;armadilha do certificado autoassinado&amp;rdquo; é um obstáculo enfrentado por quase todos os desenvolvedores ao entrar em contato com as tecnologias do MSIX pela primeira vez. Compreendendo os mecanismos de geração, exportação e importação de certificados para o repositório adequado explicados neste artigo, e usando scripts ou GPO para automação, você conseguirá realizar uma implantação tranquila, maximizando todo o potencial do MSIX.&lt;/p>
&lt;p>Use esse conhecimento e crie o ambiente de distribuição limpo de aplicativos Windows da próxima geração.&lt;/p></description></item><item><title>Conhecimentos Básicos do Registro do Windows e Métodos de Edição Segura e Programável</title><link>http://kenji.blog/pt/p/windows-registry-safe-programmable-editing/</link><pubDate>Sat, 12 Sep 2026 12:00:00 +0900</pubDate><guid>http://kenji.blog/pt/p/windows-registry-safe-programmable-editing/</guid><description>&lt;img src="http://kenji.blog/p/windows-registry-safe-programmable-editing/img/eyecatch.jpg" alt="Featured image of post Conhecimentos Básicos do Registro do Windows e Métodos de Edição Segura e Programável" />&lt;h1 id="conhecimentos-básicos-do-registro-do-windows-e-métodos-de-edição-segura-e-programável">Conhecimentos Básicos do Registro do Windows e Métodos de Edição Segura e Programável
&lt;/h1>&lt;p>No sistema operacional Windows, o &amp;ldquo;Registro&amp;rdquo; (Registry) é um enorme banco de dados hierárquico que armazena várias configurações do sistema e de aplicativos. Neste artigo, explicaremos detalhadamente a arquitetura básica do Registro do Windows, bem como métodos programáveis e seguros de edição do registro usando PowerShell e C#.&lt;/p>
&lt;h2 id="1-introdução-história-e-evolução-do-registro-do-windows">1. Introdução: História e Evolução do Registro do Windows
&lt;/h2>&lt;p>Nas versões iniciais do Windows (era do Windows 3.x), as configurações do sistema e de aplicativos eram salvas principalmente em arquivos &lt;code>.ini&lt;/code> (arquivos de inicialização). No entanto, inúmeros arquivos INI para cada aplicativo começaram a se espalhar por todo o sistema, tornando o gerenciamento extremamente complexo. Além disso, como os arquivos INI são baseados em texto simples, era difícil salvar dados binários e não existia um mecanismo de controle de acesso (segurança). A velocidade de análise (parsing) dos arquivos também era lenta, tornando-os inadequados para armazenar configurações em larga escala.&lt;/p>
&lt;p>Para resolver fundamentalmente esses problemas, o &amp;ldquo;Registro&amp;rdquo; foi adotado integralmente como um banco de dados centralizado de configurações a partir do Windows NT e Windows 95. O registro é um banco de dados hierárquico que oferece tipagem forte, suporte a dados binários e recursos robustos de segurança por meio de listas de controle de acesso (ACL). Com isso, todos os componentes, desde o kernel do sistema operacional até os aplicativos no espaço do usuário, passaram a poder ler e escrever configurações por meio de uma interface unificada (o grupo de funções &lt;code>Reg*&lt;/code> da API Win32).&lt;/p>
&lt;p>Até o atual Windows 11, o registro continua a funcionar como o coração do sistema operacional. Metadados essenciais para o funcionamento do sistema, como configurações de hardware, ordem de carregamento de drivers de dispositivo, ambiente de área de trabalho do usuário e lista de softwares instalados, estão todos centralizados no registro.&lt;/p>
&lt;h2 id="2-profundezas-da-arquitetura-a-verdadeira-natureza-dos-hives-do-registro-e-mapeamento-de-memória">2. Profundezas da Arquitetura: A Verdadeira Natureza dos Hives do Registro e Mapeamento de Memória
&lt;/h2>&lt;p>Embora o registro pareça logicamente uma única estrutura de árvore enorme, ele é fisicamente dividido em vários arquivos chamados de &amp;ldquo;Hives&amp;rdquo; salvos no disco. Isso separa as configurações de todo o sistema das configurações específicas do usuário, permitindo um carregamento eficiente.&lt;/p>
&lt;p>Os principais arquivos de hive geralmente residem no diretório &lt;code>%SystemRoot%\System32\config&lt;/code>.&lt;/p>
&lt;ul>
&lt;li>&lt;code>SYSTEM&lt;/code>: Configurações críticas necessárias para a inicialização do sistema operacional (drivers, serviços, configurações de inicialização, etc.).&lt;/li>
&lt;li>&lt;code>SOFTWARE&lt;/code>: Configurações de todo o sistema para o software instalado. A maioria das configurações de aplicativos de terceiros entra aqui.&lt;/li>
&lt;li>&lt;code>SAM&lt;/code>: Security Accounts Manager (contas de usuários locais e hashes de senhas).&lt;/li>
&lt;li>&lt;code>SECURITY&lt;/code>: Política de segurança local e atribuições de privilégios.&lt;/li>
&lt;li>&lt;code>DEFAULT&lt;/code>: Perfil do usuário padrão (modelo ao criar um novo usuário).&lt;/li>
&lt;/ul>
&lt;p>Os arquivos de hive individuais do usuário existem como arquivos ocultos no diretório de perfil do usuário (ex: &lt;code>C:\Users\Username&lt;/code>).&lt;/p>
&lt;ul>
&lt;li>&lt;code>NTUSER.DAT&lt;/code>: Configurações básicas daquele usuário (a maior parte do HKCU).&lt;/li>
&lt;li>&lt;code>UsrClass.dat&lt;/code>: Configurações de associação de extensão de arquivo daquele usuário (localizado em &lt;code>AppData\Local\Microsoft\Windows&lt;/code>).&lt;/li>
&lt;/ul>
&lt;p>Esses arquivos são mapeados para a memória pool paginável do kernel (kernel page pool) pelo &amp;ldquo;Configuration Manager (CM)&amp;rdquo; do kernel durante a inicialização do sistema operacional. O Configuration Manager é o componente de modo kernel que processa as solicitações de leitura e gravação no registro.&lt;/p>
&lt;p>O que vale ressaltar é que nem todos os dados do registro existem no disco. Por exemplo, o hive &lt;code>HARDWARE&lt;/code> é volátil (Volatile) e não é salvo em nenhum arquivo no disco. Ele é reconstruído dinamicamente na memória cada vez que o sistema operacional é inicializado e o gerenciador Plug and Play (PnP) detecta o hardware.&lt;/p>
&lt;p>Além disso, o registro nos Windows mais recentes implementa log de transações para aumentar a confiabilidade. As alterações nos arquivos hive não são gravadas diretamente no arquivo de dados, mas são primeiro registradas no log de transações (&lt;code>.log1&lt;/code>, &lt;code>.log2&lt;/code>). Isso evita a corrupção de dados durante perda de energia repentina ou travamento do sistema durante a gravação, garantindo a integridade do banco de dados quase como propriedades ACID.&lt;/p>
&lt;h2 id="3-estrutura-hierárquica-de-chaves-e-valores-do-registro">3. Estrutura Hierárquica de Chaves e Valores do Registro
&lt;/h2>&lt;p>O registro tem uma estrutura hierárquica muito semelhante a um sistema de arquivos. O nó raiz é chamado de &amp;ldquo;chave raiz&amp;rdquo; (Root Key) ou &amp;ldquo;hive&amp;rdquo;, sob o qual são armazenadas &amp;ldquo;chaves&amp;rdquo; (Keys), &amp;ldquo;subchaves&amp;rdquo; (Subkeys) e os dados reais que são os &amp;ldquo;valores&amp;rdquo; (Values). Fica mais fácil entender se você pensar que chaves equivalem a diretórios e valores equivalem a arquivos.&lt;/p>
&lt;p>As principais chaves raiz são classificadas nas cinco seguintes:&lt;/p>
&lt;ol>
&lt;li>&lt;strong>HKEY_LOCAL_MACHINE (HKLM)&lt;/strong>: Armazena as configurações de sistema e de software que se aplicam a todo o computador (a todos os usuários). Alterações requerem privilégios de administrador.&lt;/li>
&lt;li>&lt;strong>HKEY_CURRENT_USER (HKCU)&lt;/strong>: Armazena as configurações específicas do usuário atualmente conectado. Na verdade, este não é um banco de dados independente, mas apenas um link simbólico (alias) para a chave do SID (Identificador de Segurança) do respectivo usuário sob &lt;code>HKEY_USERS&lt;/code>.&lt;/li>
&lt;li>&lt;strong>HKEY_CLASSES_ROOT (HKCR)&lt;/strong>: Armazena associações de extensão de arquivo, informações de registro de classes COM (Component Object Model) e extensões de shell. Essa chave é especial, sendo uma visão virtual gerada pela mescla (merge) do Configuration Manager entre &lt;code>HKLM\SOFTWARE\Classes&lt;/code> (sistema inteiro) e &lt;code>HKCU\Software\Classes&lt;/code> (usuário atual). Em caso de conflito, a configuração específica do usuário (HKCU) tem precedência.&lt;/li>
&lt;li>&lt;strong>HKEY_USERS (HKU)&lt;/strong>: Armazena as configurações de todos os perfis de usuário do sistema (os que estão atualmente carregados na memória). É hierarquizado com base no SID.&lt;/li>
&lt;li>&lt;strong>HKEY_CURRENT_CONFIG (HKCC)&lt;/strong>: Configurações relacionadas ao perfil de hardware atual. A verdadeira localização é um link para &lt;code>HKLM\SYSTEM\CurrentControlSet\Hardware Profiles\Current&lt;/code>.&lt;/li>
&lt;/ol>
&lt;p>Visualizando essa complexa estrutura hierárquica e a relação de links, temos o seguinte:&lt;/p>
&lt;pre class="mermaid">
mindmap
root((&amp;#34;Registro do Windows&amp;#34;))
HKLM((&amp;#34;HKEY_LOCAL_MACHINE&amp;#34;))
SAM((&amp;#34;SAM (Contas de Segurança)&amp;#34;))
SECURITY((&amp;#34;SEGURANÇA&amp;#34;))
SOFTWARE((&amp;#34;SOFTWARE&amp;#34;))
SYSTEM((&amp;#34;SISTEMA&amp;#34;))
HARDWARE((&amp;#34;HARDWARE (Volátil)&amp;#34;))
HKCU((&amp;#34;HKEY_CURRENT_USER (Link)&amp;#34;))
AppEvents((&amp;#34;Eventos de Aplicativos&amp;#34;))
Console((&amp;#34;Console&amp;#34;))
Software((&amp;#34;Software&amp;#34;))
System((&amp;#34;Sistema&amp;#34;))
HKCR((&amp;#34;HKEY_CLASSES_ROOT (Visão Mesclada)&amp;#34;))
HKU((&amp;#34;HKEY_USERS&amp;#34;))
SID((&amp;#34;SIDs de Usuários...&amp;#34;))
HKCC((&amp;#34;HKEY_CURRENT_CONFIG (Link)&amp;#34;))
&lt;/pre>
&lt;h2 id="4-tipos-de-dados-do-registro-explicação-detalhada">4. Tipos de Dados do Registro (Explicação Detalhada)
&lt;/h2>&lt;p>Os &amp;ldquo;valores&amp;rdquo; do registro têm tipos de dados estritamente definidos. Ao manipular programaticamente o registro, é essencial entender esses tipos corretamente e gravar dados no tipo apropriado. Escrever com o tipo incorreto pode causar o lançamento de exceções por parte de aplicativos ou fazer com que funcionalidades do sistema operacional parem de funcionar.&lt;/p>
&lt;ul>
&lt;li>&lt;strong>REG_SZ (Valor de String)&lt;/strong>: O tipo de dado mais comum. Armazena uma string Unicode terminada em NULL (UTF-16LE). É usado para caminhos de arquivos, URLs, nomes de exibição na interface, etc.&lt;/li>
&lt;li>&lt;strong>REG_DWORD (Valor Inteiro de 32 bits)&lt;/strong>: Valor inteiro sem sinal de 32 bits (4 bytes). Frequentemente utilizado para valores booleanos (0=desativado, 1=ativado), valores de tempo limite em milissegundos, definições de códigos de erro, etc. Como a arquitetura do Windows é little-endian, ele é salvo no disco começando pelo byte de ordem inferior (Ex: 0x12345678 é salvo como &lt;code>78 56 34 12&lt;/code>).&lt;/li>
&lt;li>&lt;strong>REG_QWORD (Valor Inteiro de 64 bits)&lt;/strong>: Valor inteiro de 64 bits (8 bytes). Com a popularização da arquitetura de 64 bits, é usado para armazenar grandes valores numéricos (como cotas de disco e tamanhos de grandes quantidades de memória) e configurações de tamanho de ponteiro.&lt;/li>
&lt;li>&lt;strong>REG_MULTI_SZ (Valor de String de Múltiplas Linhas)&lt;/strong>: Armazena sequencialmente múltiplas strings terminadas em NULL e finaliza o formato com outro caractere vazio terminado em NULL (duplo NULL) no final. Adequado para armazenar dados do tipo matriz, como lista de endereços IP, lista de serviços dependentes, ordem de vinculação (bindings), etc.&lt;/li>
&lt;li>&lt;strong>REG_EXPAND_SZ (Valor de String Expansível)&lt;/strong>: Um tipo de string especial que contém strings de variáveis de ambiente não expandidas, como &lt;code>%USERPROFILE%&lt;/code> ou &lt;code>%SystemRoot%&lt;/code>. Ele é dinamicamente expandido para o caminho absoluto real pelo sistema operacional quando um aplicativo o lê por meio da API &lt;code>RegQueryValueEx&lt;/code> ou ao chamar a API &lt;code>ExpandEnvironmentStrings&lt;/code>.&lt;/li>
&lt;li>&lt;strong>REG_BINARY (Valor Binário)&lt;/strong>: Um fluxo arbitrário de dados binários brutos. São armazenadas senhas criptografadas (como LSA Secrets), certificados digitais, e dados serializados ou estruturas complexas específicas de aplicativos.&lt;/li>
&lt;li>&lt;strong>REG_NONE&lt;/strong>: Dados de tipo não definido. É muito raro, mas usado em áreas reservadas para chaves de criptografia, entre outros.&lt;/li>
&lt;li>&lt;strong>REG_RESOURCE_LIST&lt;/strong> / &lt;strong>REG_FULL_RESOURCE_DESCRIPTOR&lt;/strong>: Tipos avançados dedicados ao kernel usados ​​por drivers de dispositivo para registrar informações de alocação de recursos de hardware (IRQ, portas de E/S, canais DMA).&lt;/li>
&lt;/ul>
&lt;h2 id="5-modelo-matemático-e-desempenho-do-registro-no-sistema-operacional">5. Modelo Matemático e Desempenho do Registro no Sistema Operacional
&lt;/h2>&lt;p>Como o registro afeta diretamente o desempenho do sistema operacional (especialmente o tempo de inicialização e a velocidade de inicialização do processo), ele é internamente otimizado usando uma estrutura de dados avançada chamada &amp;ldquo;Cell Index&amp;rdquo;, semelhante a uma B-Tree (Árvore B).&lt;/p>
&lt;h3 id="complexidade-de-tempo-da-pesquisa-time-complexity">Complexidade de Tempo da Pesquisa (Time Complexity)
&lt;/h3>&lt;p>A complexidade de tempo $T_{\text{search}}$ ao pesquisar por uma chave (caminho) específica no registro depende da profundidade da árvore e do número de nós em cada nível. Ao pesquisar uma subchave na profundidade $d$ (ex: &lt;code>A\B\C\D&lt;/code> implica $d=4$), a complexidade pode ser teoricamente modelada da seguinte forma:&lt;/p>
$$
T_{\text{search}}(d, L) = \sum_{i=1}^{d} O(\log(C_i) \cdot L_i)
$$&lt;p>Aqui, $C_i$ é o número de nós filhos (subchaves ou valores) na profundidade $i$, e $L_i$ é o comprimento da string (número de caracteres) a ser comparada. Dentro do arquivo hive que constitui o próprio registro, a lista de subchaves é mantida como um índice classificado pelo valor de hash do nome ou pela ordem alfabética. Por conta disso, uma pesquisa binária $O(\log(C_i))$ é possível em vez de uma simples pesquisa linear $O(C_i)$, alcançando assim um acesso extremamente rápido, mesmo que dezenas de milhares de subchaves existam sob uma única chave.&lt;/p>
&lt;h3 id="uso-de-armazenamento-space-complexity">Uso de Armazenamento (Space Complexity)
&lt;/h3>&lt;p>O tamanho total do registro (espaço ocupado no disco físico) é calculado como a soma de cada hive.&lt;/p>
$$
\text{Size}_{\text{Total}} = \sum_{h \in \text{Hives}} \left( N_{h} \times S_{\text{key\_metadata}} + \sum_{v \in h} S_{\text{value}}(v) \right) + S_{\text{overhead}}
$$&lt;p>Onde $N_h$ é o número de chaves dentro do hive $h$, $S_{\text{key\_metadata}}$ é o tamanho dos metadados por chave (como carimbo de data/hora de última gravação, ponteiro para descritor de segurança, ponteiro para chave pai, etc.), e $S_{\text{value}}(v)$ é o tamanho útil (payload) do valor $v$. As sobrecargas (overhead) $S_{\text{overhead}}$ causadas por logs de transação e células vazias não mais necessárias (fragmentação) também estão incluídas. Se os dados desnecessários (como os restos de um software que não pôde ser completamente desinstalado) forem deixados no registro por um longo período, esse uso de armazenamento aumentará, podendo pressionar a memória do pool paginado do sistema operacional e levar à degradação do desempenho.&lt;/p>
&lt;h2 id="6-o-risco-da-edição-manual-que-ameaça-a-robustez-do-sistema-e-as-probabilidades-de-corrupção">6. O Risco da Edição Manual que Ameaça a Robustez do Sistema e as Probabilidades de Corrupção
&lt;/h2>&lt;p>A edição manual através do Editor do Registro (&lt;code>regedit.exe&lt;/code>) deve ser considerada um último recurso de administração do sistema. O registro não possui uma função de &amp;ldquo;Desfazer (Undo)&amp;rdquo; incorporada como editores de documentos comuns, e alterações de valores ou exclusões de chaves são refletidas imediatamente no sistema por meio do Configuration Manager.&lt;/p>
&lt;p>Em particular, se um único caractere for editado ou excluído por engano de uma chave crítica, essencial para a inicialização do sistema (por exemplo, configurações do driver de controlador de disco sob &lt;code>HKLM\SYSTEM\CurrentControlSet\Services&lt;/code>, ou o valor &lt;code>Userinit&lt;/code> em &lt;code>HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon&lt;/code>), existe um risco fatal de o sistema operacional travar com a Tela Azul da Morte (BSoD) e se tornar ininicializável, ou o sistema parar em uma tela preta após a tela de login.&lt;/p>
&lt;h3 id="modelo-matemático-da-probabilidade-de-corrupção">Modelo Matemático da Probabilidade de Corrupção
&lt;/h3>&lt;p>Vamos considerar a probabilidade de ocorrência de uma falha no sistema caso chaves dentro do registro sejam acidentalmente alteradas ou deletadas. O conjunto de chaves críticas vitais para o funcionamento normal do sistema será $C$, e o total das mesmas será $N_c = |C|$. Consideramos $N_{\text{total}}$ como o número total de chaves do registro.
Se alterarmos aleatoriamente ou deletarmos $k$ chaves, a probabilidade $P_{\text{failure}}$ de que pelo menos uma chave crítica seja corrompida, calculada através de amostragem sem reposição (Sampling without replacement), é expressa por:&lt;/p>
$$
P_{\text{failure}} = 1 - \frac{\binom{N_{\text{total}} - N_c}{k}}{\binom{N_{\text{total}}}{k}} = 1 - \prod_{i=0}^{k-1} \left( 1 - \frac{N_c}{N_{\text{total}} - i} \right)
$$&lt;p>A contagem total de chaves $N_{\text{total}}$ em todo o registro está na ordem de centenas de milhares a milhões, mas $N_c$ também existe na ordem de dezenas de milhares. Matematicamente, mesmo nas operações aleatórias, se $k$ aumentar, a taxa de falha saltará subitamente. Na edição manual do mundo real, o usuário não edita &amp;ldquo;aleatoriamente&amp;rdquo;, pelo contrário, ele intencionalmente manipula áreas diretamente relacionadas às configurações do sistema e ao comportamento do software (geralmente acompanhando sites de tutoriais), então a chance de tocar em uma chave crítica é muito maior do que esse valor teórico.&lt;/p>
&lt;h2 id="7-virtualização-de-registro-e-a-arquitetura-wow64">7. Virtualização de Registro e a Arquitetura WOW64
&lt;/h2>&lt;p>O Windows implementa alguns mecanismos avançados de &amp;ldquo;Virtualização&amp;rdquo; (Redirecionamento) de acesso ao registro para manter a compatibilidade com aplicativos legados (Legacy Applications). Não entender isso durante a programação é uma causa para defeitos (bugs) substanciais.&lt;/p>
&lt;h3 id="virtualização-de-registro-uac-registry-virtualization">Virtualização de Registro UAC (Registry Virtualization)
&lt;/h3>&lt;p>O Controle de Conta de Usuário (UAC) foi introduzido a partir do Windows Vista. Quando um aplicativo antigo criado na era do Windows XP (que roda com privilégios de usuário padrão) tenta gravar em chaves protegidas como &lt;code>HKLM\SOFTWARE&lt;/code> que normalmente exigiriam direitos de administrador, para evitar que o programa trave com erro de Acesso Negado (Access Denied), o Windows silenciosamente redireciona essa gravação à Loja Virtual (Virtual Store) dentro do perfil do usuário em &lt;code>HKCU\Software\Classes\VirtualStore\MACHINE\SOFTWARE&lt;/code>. Nas leituras, a chave original e a Virtual Store também são unidas (mescladas) e retornadas. Isso permite que os aplicativos continuem executando normalmente, sem que os erros sejam perceptíveis a eles.
No entanto, quando se cria um utilitário programável que faça mudanças globais, você deve especificar &lt;code>&amp;lt;requestedExecutionLevel level=&amp;quot;requireAdministrator&amp;quot; /&amp;gt;&lt;/code> no arquivo de manifesto, e então essa virtualização deve ser desativada.&lt;/p>
&lt;h3 id="o-redirecionamento-wow64-windows-32-bit-on-windows-64-bit">O Redirecionamento WOW64 (Windows 32-bit on Windows 64-bit)
&lt;/h3>&lt;p>Ao rodar um aplicativo mais velho de 32 bits em uma edição 64 bits do Windows (a principal atualmente), as chaves de registro também sofrem um redirecionamento automático para prevenir que aplicativos de 32 bits sobrescrevam acidentalmente o sistema nativo de 64 bits ou carreguem DLLs incompatíveis de 64 bits.
Por exemplo, se o aplicativo de 32 bits tentar ler ou alterar &lt;code>HKLM\SOFTWARE\Vendor\App&lt;/code>, o sistema operacional fará transparentemente o redirecionamento para &lt;code>HKLM\SOFTWARE\WOW6432Node\Vendor\App&lt;/code>.&lt;/p>
&lt;pre class="mermaid">
flowchart TD
App32[&amp;#34;Aplicativo de 32 bits&amp;#34;]
App64[&amp;#34;Aplicativo de 64 bits&amp;#34;]
RegAPI[&amp;#34;API do Registro (Advapi32.dll)&amp;#34;]
CM[&amp;#34;Configuration Manager (Kernel)&amp;#34;]
HKLM_Soft[&amp;#34;HKLM\\SOFTWARE&amp;#34;]
HKLM_WOW64[&amp;#34;HKLM\\SOFTWARE\\WOW6432Node&amp;#34;]
App32 --&amp;gt;| RegOpenKeyEx() | RegAPI
App64 --&amp;gt;| RegOpenKeyEx() | RegAPI
RegAPI --&amp;gt; CM
CM --&amp;gt;| Se Processo de 64 bits | HKLM_Soft
CM --&amp;gt;| Se Processo de 32 bits (Redirecionamento) | HKLM_WOW64
&lt;/pre>
&lt;p>Ao editar o registro através de scripts PowerShell ou aplicativos C#, é indispensável que se saiba que tipo de arquitetura do processo em execução (se 32 ou 64 bits). Senão, problemas irritantes do tipo &amp;ldquo;A configuração que salvei não aparece no Editor do Registro (foi salva em outro lugar)&amp;rdquo; poderão ocorrer.&lt;/p>
&lt;h2 id="8-edição-segura-e-programável-via-powershell">8. Edição Segura e Programável via PowerShell
&lt;/h2>&lt;p>Para minimizar os riscos de editar manualmente os registros, as práticas mais modernas sugerem realizar operações no registro usando scripts do PowerShell, codificando as operações (Infrastructure as Code) a fim de garantir automação, reprodutibilidade e testabilidade.
O PowerShell possui um &amp;ldquo;Registry Provider&amp;rdquo;, de modo que é capaz de realizar manipulações de forma transparente via comandos idênticos aos do sistema de arquivos (como no drive &lt;code>C:&lt;/code>), como &lt;code>Get-ChildItem&lt;/code>, &lt;code>Get-ItemProperty&lt;/code> e &lt;code>New-Item&lt;/code>.&lt;/p>
&lt;p>No PowerShell, drives específicos como &lt;code>HKLM:&lt;/code> e &lt;code>HKCU:&lt;/code> (como letras de unidade) são montados por padrão.&lt;/p>
&lt;h3 id="operações-básicas-de-crud">Operações Básicas de CRUD
&lt;/h3>&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt"> 1
&lt;/span>&lt;span class="lnt"> 2
&lt;/span>&lt;span class="lnt"> 3
&lt;/span>&lt;span class="lnt"> 4
&lt;/span>&lt;span class="lnt"> 5
&lt;/span>&lt;span class="lnt"> 6
&lt;/span>&lt;span class="lnt"> 7
&lt;/span>&lt;span class="lnt"> 8
&lt;/span>&lt;span class="lnt"> 9
&lt;/span>&lt;span class="lnt">10
&lt;/span>&lt;span class="lnt">11
&lt;/span>&lt;span class="lnt">12
&lt;/span>&lt;span class="lnt">13
&lt;/span>&lt;span class="lnt">14
&lt;/span>&lt;span class="lnt">15
&lt;/span>&lt;span class="lnt">16
&lt;/span>&lt;span class="lnt">17
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-powershell" data-lang="powershell">&lt;span class="line">&lt;span class="cl">&lt;span class="c"># 1. Verificação de Existência (Read)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nv">$keyPath&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="s2">&amp;#34;HKCU:\Software\MyCustomApp&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">if&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="o">-Not&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="nb">Test-Path&lt;/span> &lt;span class="n">-Path&lt;/span> &lt;span class="nv">$keyPath&lt;/span>&lt;span class="p">))&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c"># 2. Criação de nova chave (Create)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">New-Item&lt;/span> &lt;span class="n">-Path&lt;/span> &lt;span class="s2">&amp;#34;HKCU:\Software&amp;#34;&lt;/span> &lt;span class="n">-Name&lt;/span> &lt;span class="s2">&amp;#34;MyCustomApp&amp;#34;&lt;/span> &lt;span class="n">-Force&lt;/span> &lt;span class="p">|&lt;/span> &lt;span class="nb">Out-Null&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">Write-Host&lt;/span> &lt;span class="s2">&amp;#34;Chave criada.&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c"># 3. Gravação e Atualização de Valores (Update) - Gravando 1 como REG_DWORD&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">Set-ItemProperty&lt;/span> &lt;span class="n">-Path&lt;/span> &lt;span class="nv">$keyPath&lt;/span> &lt;span class="n">-Name&lt;/span> &lt;span class="s2">&amp;#34;EnableDebug&amp;#34;&lt;/span> &lt;span class="n">-Value&lt;/span> &lt;span class="mf">1&lt;/span> &lt;span class="n">-Type&lt;/span> &lt;span class="n">DWord&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c"># 4. Leitura de Valor (Read)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nv">$debugFlag&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="nb">Get-ItemProperty&lt;/span> &lt;span class="n">-Path&lt;/span> &lt;span class="nv">$keyPath&lt;/span>&lt;span class="p">).&lt;/span>&lt;span class="py">EnableDebug&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">Write-Host&lt;/span> &lt;span class="s2">&amp;#34;Sinalizador de depuração atual: &lt;/span>&lt;span class="nv">$debugFlag&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c"># 5. Remoção de Valor (Delete)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">Remove-ItemProperty&lt;/span> &lt;span class="n">-Path&lt;/span> &lt;span class="nv">$keyPath&lt;/span> &lt;span class="n">-Name&lt;/span> &lt;span class="s2">&amp;#34;EnableDebug&amp;#34;&lt;/span> &lt;span class="n">-Force&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;h3 id="exemplo-prático-1-configuração-automática-do-ambiente-de-desenvolvimento-adição-da-variável-de-ambiente-path">Exemplo Prático 1: Configuração Automática do Ambiente de Desenvolvimento (Adição da variável de ambiente PATH)
&lt;/h3>&lt;p>O seguinte script é uma automação para quando um desenvolvedor está configurando uma nova máquina Windows e precisa adicionar, com segurança, um diretório de ferramentas personalizadas à variável de ambiente de usuário &lt;code>PATH&lt;/code>.&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt"> 1
&lt;/span>&lt;span class="lnt"> 2
&lt;/span>&lt;span class="lnt"> 3
&lt;/span>&lt;span class="lnt"> 4
&lt;/span>&lt;span class="lnt"> 5
&lt;/span>&lt;span class="lnt"> 6
&lt;/span>&lt;span class="lnt"> 7
&lt;/span>&lt;span class="lnt"> 8
&lt;/span>&lt;span class="lnt"> 9
&lt;/span>&lt;span class="lnt">10
&lt;/span>&lt;span class="lnt">11
&lt;/span>&lt;span class="lnt">12
&lt;/span>&lt;span class="lnt">13
&lt;/span>&lt;span class="lnt">14
&lt;/span>&lt;span class="lnt">15
&lt;/span>&lt;span class="lnt">16
&lt;/span>&lt;span class="lnt">17
&lt;/span>&lt;span class="lnt">18
&lt;/span>&lt;span class="lnt">19
&lt;/span>&lt;span class="lnt">20
&lt;/span>&lt;span class="lnt">21
&lt;/span>&lt;span class="lnt">22
&lt;/span>&lt;span class="lnt">23
&lt;/span>&lt;span class="lnt">24
&lt;/span>&lt;span class="lnt">25
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-powershell" data-lang="powershell">&lt;span class="line">&lt;span class="cl">&lt;span class="nv">$envKey&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="s2">&amp;#34;HKCU:\Environment&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nv">$newPath&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="s2">&amp;#34;C:\tools\bin&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c"># Obter estado do PATH atual (suprimir o erro para buscar com segurança)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nv">$currentPathInfo&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="nb">Get-ItemProperty&lt;/span> &lt;span class="n">-Path&lt;/span> &lt;span class="nv">$envKey&lt;/span> &lt;span class="n">-Name&lt;/span> &lt;span class="s2">&amp;#34;Path&amp;#34;&lt;/span> &lt;span class="n">-ErrorAction&lt;/span> &lt;span class="n">SilentlyContinue&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nv">$currentPath&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="k">if&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="nv">$currentPathInfo&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span> &lt;span class="nv">$currentPathInfo&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="py">Path&lt;/span> &lt;span class="p">}&lt;/span> &lt;span class="k">else&lt;/span> &lt;span class="p">{&lt;/span> &lt;span class="s2">&amp;#34;&amp;#34;&lt;/span> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c"># Analisar por meio de Expressões Regulares para ver se já está incluso&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">if&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="nv">$currentPath&lt;/span> &lt;span class="o">-notmatch&lt;/span> &lt;span class="p">[&lt;/span>&lt;span class="no">regex&lt;/span>&lt;span class="p">]::&lt;/span>&lt;span class="n">Escape&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nv">$newPath&lt;/span>&lt;span class="p">))&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c"># Adicionar o ponto e vírgula caso falte no final&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="nv">$currentPath&lt;/span> &lt;span class="o">-and&lt;/span> &lt;span class="nv">$currentPath&lt;/span> &lt;span class="o">-notmatch&lt;/span> &lt;span class="s2">&amp;#34;;$&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nv">$currentPath&lt;/span> &lt;span class="p">+=&lt;/span> &lt;span class="s2">&amp;#34;;&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nv">$updatedPath&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="nv">$currentPath&lt;/span> &lt;span class="p">+&lt;/span> &lt;span class="nv">$newPath&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c"># Gravar como o tipo REG_EXPAND_SZ (importante)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">Set-ItemProperty&lt;/span> &lt;span class="n">-Path&lt;/span> &lt;span class="nv">$envKey&lt;/span> &lt;span class="n">-Name&lt;/span> &lt;span class="s2">&amp;#34;Path&amp;#34;&lt;/span> &lt;span class="n">-Value&lt;/span> &lt;span class="nv">$updatedPath&lt;/span> &lt;span class="n">-Type&lt;/span> &lt;span class="n">ExpandString&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">Write-Host&lt;/span> &lt;span class="s2">&amp;#34;A variável de ambiente PATH foi atualizada para: &lt;/span>&lt;span class="nv">$newPath&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c"># Alertar da mudança nas variáveis de ambiente aos processos em execução (WM_SETTINGCHANGE)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c"># Graças a isso, é refletido no novo explorador e etc. sem necessidade de reiniciar.&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">[&lt;/span>&lt;span class="no">Environment&lt;/span>&lt;span class="p">]::&lt;/span>&lt;span class="n">SetEnvironmentVariable&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;Path&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="nv">$updatedPath&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="p">[&lt;/span>&lt;span class="no">EnvironmentVariableTarget&lt;/span>&lt;span class="p">]::&lt;/span>&lt;span class="n">User&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span> &lt;span class="k">else&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">Write-Host&lt;/span> &lt;span class="s2">&amp;#34;O PATH já foi adicionado anteriormente.&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;h3 id="exemplo-prático-2-incluir-ações-personalizadas-no-menu-de-contexto">Exemplo Prático 2: Incluir Ações Personalizadas no Menu de Contexto
&lt;/h3>&lt;p>A intenção é integrar no menu de contexto ao clicar com o botão direito num diretório ou plano de fundo um item personalizado chamado &amp;ldquo;Abrir com My IDE&amp;rdquo;.&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt"> 1
&lt;/span>&lt;span class="lnt"> 2
&lt;/span>&lt;span class="lnt"> 3
&lt;/span>&lt;span class="lnt"> 4
&lt;/span>&lt;span class="lnt"> 5
&lt;/span>&lt;span class="lnt"> 6
&lt;/span>&lt;span class="lnt"> 7
&lt;/span>&lt;span class="lnt"> 8
&lt;/span>&lt;span class="lnt"> 9
&lt;/span>&lt;span class="lnt">10
&lt;/span>&lt;span class="lnt">11
&lt;/span>&lt;span class="lnt">12
&lt;/span>&lt;span class="lnt">13
&lt;/span>&lt;span class="lnt">14
&lt;/span>&lt;span class="lnt">15
&lt;/span>&lt;span class="lnt">16
&lt;/span>&lt;span class="lnt">17
&lt;/span>&lt;span class="lnt">18
&lt;/span>&lt;span class="lnt">19
&lt;/span>&lt;span class="lnt">20
&lt;/span>&lt;span class="lnt">21
&lt;/span>&lt;span class="lnt">22
&lt;/span>&lt;span class="lnt">23
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-powershell" data-lang="powershell">&lt;span class="line">&lt;span class="cl">&lt;span class="c"># Caminho do menu para o clique direito no plano de fundo do diretório&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nv">$menuPath&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="s2">&amp;#34;HKCR:\Directory\Background\shell\OpenWithMyIDE&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nv">$commandPath&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="nv">$menuPath&lt;/span>&lt;span class="s2">\command&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">try&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c"># Crie uma subchave pai do menu&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">New-Item&lt;/span> &lt;span class="n">-Path&lt;/span> &lt;span class="nv">$menuPath&lt;/span> &lt;span class="n">-Force&lt;/span> &lt;span class="n">-ErrorAction&lt;/span> &lt;span class="n">Stop&lt;/span> &lt;span class="p">|&lt;/span> &lt;span class="nb">Out-Null&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c"># O valor (default) é o nome exibido&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">Set-ItemProperty&lt;/span> &lt;span class="n">-Path&lt;/span> &lt;span class="nv">$menuPath&lt;/span> &lt;span class="n">-Name&lt;/span> &lt;span class="s2">&amp;#34;(default)&amp;#34;&lt;/span> &lt;span class="n">-Value&lt;/span> &lt;span class="s2">&amp;#34;Abrir com My IDE&amp;#34;&lt;/span> &lt;span class="n">-Type&lt;/span> &lt;span class="n">String&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c"># Configurar um ícone (Opcional)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">Set-ItemProperty&lt;/span> &lt;span class="n">-Path&lt;/span> &lt;span class="nv">$menuPath&lt;/span> &lt;span class="n">-Name&lt;/span> &lt;span class="s2">&amp;#34;Icon&amp;#34;&lt;/span> &lt;span class="n">-Value&lt;/span> &lt;span class="s2">&amp;#34;C:\Program Files\MyIDE\ide.exe,0&amp;#34;&lt;/span> &lt;span class="n">-Type&lt;/span> &lt;span class="n">String&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c"># Crie a subchave command e defina a linha de comando a ser executada&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c"># A variável %V expande para o caminho do diretório atual&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">New-Item&lt;/span> &lt;span class="n">-Path&lt;/span> &lt;span class="nv">$commandPath&lt;/span> &lt;span class="n">-Force&lt;/span> &lt;span class="n">-ErrorAction&lt;/span> &lt;span class="n">Stop&lt;/span> &lt;span class="p">|&lt;/span> &lt;span class="nb">Out-Null&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">Set-ItemProperty&lt;/span> &lt;span class="n">-Path&lt;/span> &lt;span class="nv">$commandPath&lt;/span> &lt;span class="n">-Name&lt;/span> &lt;span class="s2">&amp;#34;(default)&amp;#34;&lt;/span> &lt;span class="n">-Value&lt;/span> &lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="se">`&amp;#34;&lt;/span>&lt;span class="s2">C:\Program Files\MyIDE\ide.exe&lt;/span>&lt;span class="se">`&amp;#34;&lt;/span>&lt;span class="s2"> &lt;/span>&lt;span class="se">`&amp;#34;&lt;/span>&lt;span class="s2">%V&lt;/span>&lt;span class="se">`&amp;#34;&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span> &lt;span class="n">-Type&lt;/span> &lt;span class="n">String&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">Write-Host&lt;/span> &lt;span class="s2">&amp;#34;Menu de contexto adicionado.&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span> &lt;span class="k">catch&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">Write-Error&lt;/span> &lt;span class="s2">&amp;#34;Falha ao alterar o registro. Verifique se você está executando com privilégios de administrador. Erro: &lt;/span>&lt;span class="nv">$_&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;h3 id="sequência-interna-de-acesso-ao-registro-via-powershell">Sequência Interna de Acesso ao Registro via PowerShell
&lt;/h3>&lt;p>Esse diagrama de sequência mostra como o acesso ao registro via scripts do PowerShell funciona no sistema operacional:&lt;/p>
&lt;pre class="mermaid">
sequenceDiagram
participant U as &amp;#34;Admin / PowerShell&amp;#34;
participant PS as &amp;#34;Registry Provider (.NET)&amp;#34;
participant CM as &amp;#34;Configuration Manager (Kernel)&amp;#34;
participant Disk as &amp;#34;Hive Files on NTFS&amp;#34;
U-&amp;gt;&amp;gt;PS: &amp;#34;Set-ItemProperty -Path ... -Value ...&amp;#34;
PS-&amp;gt;&amp;gt;PS: &amp;#34;Fazer o Parse do Caminho e Validar Tipos de Dados&amp;#34;
PS-&amp;gt;&amp;gt;CM: &amp;#34;NtSetValueKey (Chamada de Sistema)&amp;#34;
CM-&amp;gt;&amp;gt;CM: &amp;#34;Verificar Token de Acesso contra ACL da Chave&amp;#34;
alt &amp;#34;Acesso Concedido (Token de Admin)&amp;#34;
CM-&amp;gt;&amp;gt;CM: &amp;#34;Alocar Célula no Cache Volátil&amp;#34;
CM-&amp;gt;&amp;gt;Disk: &amp;#34;Descarregar para o Log de Transação (.log1)&amp;#34;
Disk--&amp;gt;&amp;gt;CM: &amp;#34;Log Gravado com Sucesso&amp;#34;
CM-&amp;gt;&amp;gt;Disk: &amp;#34;Gravação Tardia no Arquivo de Dados Hive (Segundo Plano)&amp;#34;
CM--&amp;gt;&amp;gt;PS: &amp;#34;STATUS_SUCCESS (0x00000000)&amp;#34;
PS--&amp;gt;&amp;gt;U: &amp;#34;Comando Concluído&amp;#34;
else &amp;#34;Acesso Negado (Usuário Padrão)&amp;#34;
CM--&amp;gt;&amp;gt;PS: &amp;#34;STATUS_ACCESS_DENIED (0xC0000022)&amp;#34;
PS--&amp;gt;&amp;gt;U: &amp;#34;UnauthorizedAccessException Lançada&amp;#34;
end
&lt;/pre>
&lt;h2 id="9-acesso-robusto-ao-registro-com-c-net">9. Acesso Robusto ao Registro com C# (.NET)
&lt;/h2>&lt;p>Ao acessar o registro a partir de aplicativos .NET (como C#), você usa as classes &lt;code>Microsoft.Win32.Registry&lt;/code> e &lt;code>RegistryKey&lt;/code>.
A maior vantagem de usar o C# é o robusto tratamento de erros por meio de tratamento de exceção (&lt;code>try-catch&lt;/code>), verificação rigorosa de tipos e a possibilidade de designar explicitamente a visão de 32 bits/64 bits usando a enumeração &lt;code>RegistryView&lt;/code>.&lt;/p>
&lt;p>Abaixo está um exemplo de código C# onde você faz leitura/gravação segura em ambiente de SO de 64 bits garantindo pular o redirecionamento (WOW6432Node) na área nativa do registro 64-bits:&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt"> 1
&lt;/span>&lt;span class="lnt"> 2
&lt;/span>&lt;span class="lnt"> 3
&lt;/span>&lt;span class="lnt"> 4
&lt;/span>&lt;span class="lnt"> 5
&lt;/span>&lt;span class="lnt"> 6
&lt;/span>&lt;span class="lnt"> 7
&lt;/span>&lt;span class="lnt"> 8
&lt;/span>&lt;span class="lnt"> 9
&lt;/span>&lt;span class="lnt">10
&lt;/span>&lt;span class="lnt">11
&lt;/span>&lt;span class="lnt">12
&lt;/span>&lt;span class="lnt">13
&lt;/span>&lt;span class="lnt">14
&lt;/span>&lt;span class="lnt">15
&lt;/span>&lt;span class="lnt">16
&lt;/span>&lt;span class="lnt">17
&lt;/span>&lt;span class="lnt">18
&lt;/span>&lt;span class="lnt">19
&lt;/span>&lt;span class="lnt">20
&lt;/span>&lt;span class="lnt">21
&lt;/span>&lt;span class="lnt">22
&lt;/span>&lt;span class="lnt">23
&lt;/span>&lt;span class="lnt">24
&lt;/span>&lt;span class="lnt">25
&lt;/span>&lt;span class="lnt">26
&lt;/span>&lt;span class="lnt">27
&lt;/span>&lt;span class="lnt">28
&lt;/span>&lt;span class="lnt">29
&lt;/span>&lt;span class="lnt">30
&lt;/span>&lt;span class="lnt">31
&lt;/span>&lt;span class="lnt">32
&lt;/span>&lt;span class="lnt">33
&lt;/span>&lt;span class="lnt">34
&lt;/span>&lt;span class="lnt">35
&lt;/span>&lt;span class="lnt">36
&lt;/span>&lt;span class="lnt">37
&lt;/span>&lt;span class="lnt">38
&lt;/span>&lt;span class="lnt">39
&lt;/span>&lt;span class="lnt">40
&lt;/span>&lt;span class="lnt">41
&lt;/span>&lt;span class="lnt">42
&lt;/span>&lt;span class="lnt">43
&lt;/span>&lt;span class="lnt">44
&lt;/span>&lt;span class="lnt">45
&lt;/span>&lt;span class="lnt">46
&lt;/span>&lt;span class="lnt">47
&lt;/span>&lt;span class="lnt">48
&lt;/span>&lt;span class="lnt">49
&lt;/span>&lt;span class="lnt">50
&lt;/span>&lt;span class="lnt">51
&lt;/span>&lt;span class="lnt">52
&lt;/span>&lt;span class="lnt">53
&lt;/span>&lt;span class="lnt">54
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-csharp" data-lang="csharp">&lt;span class="line">&lt;span class="cl">&lt;span class="k">using&lt;/span> &lt;span class="nn">System&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">using&lt;/span> &lt;span class="nn">System.Security&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">using&lt;/span> &lt;span class="nn">Microsoft.Win32&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">class&lt;/span> &lt;span class="nc">RegistryEditor&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kd">static&lt;/span> &lt;span class="k">void&lt;/span> &lt;span class="n">Main&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">// Caminho da chave sob HKLM (Requer permissões de administrador)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kt">string&lt;/span> &lt;span class="n">keyPath&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="s">@&amp;#34;SOFTWARE\MyEnterpriseApp\Settings&amp;#34;&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">// Usando RegistryView.Registry64 para abrir a visão nativa de 64 bits&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">// A instrução using é usada para garantir a liberação do identificador da chave de registro (recurso não gerenciado)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">try&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">using&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="n">RegistryKey&lt;/span> &lt;span class="n">baseKey&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="n">RegistryKey&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">OpenBaseKey&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">RegistryHive&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">LocalMachine&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">RegistryView&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">Registry64&lt;/span>&lt;span class="p">))&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">// Abrir a chave com permissão de gravação (writable: true). Cria se não existir.&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">using&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="n">RegistryKey&lt;/span> &lt;span class="n">subKey&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="n">baseKey&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">CreateSubKey&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">keyPath&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">writable&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="kc">true&lt;/span>&lt;span class="p">))&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="n">subKey&lt;/span> &lt;span class="p">!=&lt;/span> &lt;span class="kc">null&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">// Gravando o valor como REG_DWORD&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">subKey&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">SetValue&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s">&amp;#34;MaxConnections&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="m">100&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">RegistryValueKind&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">DWord&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">// Gravando o valor como REG_SZ&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">subKey&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">SetValue&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s">&amp;#34;ApiEndpoint&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s">&amp;#34;https://api.example.com&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">RegistryValueKind&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">String&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">// Gravando como valor binário REG_BINARY usando Matriz de Bytes&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kt">byte&lt;/span>&lt;span class="p">[]&lt;/span> &lt;span class="n">secretData&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="p">{&lt;/span> &lt;span class="m">0x01&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="m">0x02&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="m">0x0A&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="m">0xFF&lt;/span> &lt;span class="p">};&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">subKey&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">SetValue&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s">&amp;#34;BinarySecret&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">secretData&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">RegistryValueKind&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">Binary&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">Console&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">WriteLine&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s">&amp;#34;A gravação no registro foi concluída com sucesso.&amp;#34;&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">catch&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="n">UnauthorizedAccessException&lt;/span> &lt;span class="n">ex&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">// Ocorre frequentemente quando não executado como Administrador&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">Console&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">WriteLine&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s">$&amp;#34;Erro de permissão: Execute o programa como \&amp;#34;&lt;/span>&lt;span class="n">Administrador&lt;/span>&lt;span class="err">\&lt;/span>&lt;span class="s">&amp;#34;. Detalhes: {ex.Message}&amp;#34;&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">catch&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="n">SecurityException&lt;/span> &lt;span class="n">ex&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">// Ocorreu um bloqueio da segurança de acesso de código do .NET (CAS)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">Console&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">WriteLine&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s">$&amp;#34;Exceção de segurança: {ex.Message}&amp;#34;&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">catch&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="n">Exception&lt;/span> &lt;span class="n">ex&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">// Outros erros imprevisíveis de IO, etc.&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">Console&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">WriteLine&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s">$&amp;#34;Erro inesperado: {ex.Message}&amp;#34;&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>O &amp;ldquo;identificador (handle)&amp;rdquo; retornado do SO quando você abre uma chave de registro é um recurso não gerenciado que consome memória e recursos do sistema. Portanto, uma regra de ferro na programação C# é usar um bloco &lt;code>using&lt;/code> ou chamar &lt;code>.Dispose()&lt;/code> (ou &lt;code>.Close()&lt;/code>) explicitamente no bloco &lt;code>finally&lt;/code> para evitar, com certeza, o vazamento de memória (handle leak).&lt;/p>
&lt;h2 id="10-métodos-de-backup-e-restauração-do-registro">10. Métodos de Backup e Restauração do Registro
&lt;/h2>&lt;p>Mesmo se houver automações usando scripts e programas, é de extrema importância ter um backup criado antes da gravação nos ambientes críticos do registro.&lt;/p>
&lt;h3 id="backup-e-importação-por-arquivos-reg">Backup e Importação por arquivos .reg
&lt;/h3>&lt;p>A abordagem mais clássica e universal é exportar para um arquivo &lt;code>.reg&lt;/code>. Esse arquivo tem um formato próprio em texto básico, e se estrutura da seguinte maneira:&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;span class="lnt">3
&lt;/span>&lt;span class="lnt">4
&lt;/span>&lt;span class="lnt">5
&lt;/span>&lt;span class="lnt">6
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Windows Registry Editor Version 5.00
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">[HKEY_CURRENT_USER\Software\MyCustomApp]
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&amp;#34;EnableDebug&amp;#34;=dword:00000001
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&amp;#34;ApiEndpoint&amp;#34;=&amp;#34;https://api.example.com&amp;#34;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&amp;#34;BinaryData&amp;#34;=hex:01,02,0a,ff
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>&lt;em>Nota: Dados Binários são formados começando com &amp;ldquo;hex:&amp;rdquo; e separados por vírgulas sob a notação hexadecimal.&lt;/em>&lt;/p>
&lt;p>Você pode usar o aplicativo via comando de linha &lt;code>reg.exe&lt;/code> dentro de scripts Batch para implementar backups automáticos.&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;span class="lnt">3
&lt;/span>&lt;span class="lnt">4
&lt;/span>&lt;span class="lnt">5
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-cmd" data-lang="cmd">&lt;span class="line">&lt;span class="cl">&lt;span class="c1">REM Exportar a chave especificada de backup (subchaves também são recursivamente exportadas)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">reg export HKLM\SOFTWARE\MyEnterpriseApp C:\backup\myapp_backup.reg /y
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">REM Restaurando um arquivo de Backup&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">reg import C:\backup\myapp_backup.reg
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;h3 id="método-avançado-de-backup-usando-powershell">Método Avançado de Backup usando PowerShell
&lt;/h3>&lt;p>Ao invés de mantê-lo apenas como um simples texto, com o uso guiado da orientação por objetos no PowerShell, você consegue extrair objetos do Registro e guardá-los e exportá-los em um salvamento puro de XML (CliXml). Com isso, no ato da restauração do registro você não vai contar somente com uma conversão baseada em strings em formato de texto, pois os dados são recuperados puros de fábrica contendo suas naturezas originais do banco tipadas.&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;span class="lnt">3
&lt;/span>&lt;span class="lnt">4
&lt;/span>&lt;span class="lnt">5
&lt;/span>&lt;span class="lnt">6
&lt;/span>&lt;span class="lnt">7
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-powershell" data-lang="powershell">&lt;span class="line">&lt;span class="cl">&lt;span class="c"># Realizando Backup (Salvar as propriedades como XML)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">Get-ItemProperty&lt;/span> &lt;span class="n">-Path&lt;/span> &lt;span class="s2">&amp;#34;HKCU:\Software\MyCustomApp&amp;#34;&lt;/span> &lt;span class="p">|&lt;/span> &lt;span class="nb">Export-Clixml&lt;/span> &lt;span class="n">-Path&lt;/span> &lt;span class="s2">&amp;#34;C:\backup\reg_backup.xml&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c"># Conceito da Restauração&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nv">$backup&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="nb">Import-Clixml&lt;/span> &lt;span class="n">-Path&lt;/span> &lt;span class="s2">&amp;#34;C:\backup\reg_backup.xml&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c"># Em $backup está armazenado o customizado PSObject restaurado.&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c"># Então pode-se fazer loops de propriedades aplicando a função de retorno `Set-ItemProperty` novamente.&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;h2 id="11-solução-de-problemas-com-sysinternals-process-monitor-procmon">11. Solução de Problemas com Sysinternals Process Monitor (Procmon)
&lt;/h2>&lt;p>Nos casos em que você não sabe em qual local um programa vai buscar os registros ou deseja investigar a causa do &amp;ldquo;Acesso Negado&amp;rdquo; (Access Denied), o utilitário grátis e distribuído de forma nativa da Microsoft na suíte Sysinternals, chamado &lt;strong>Process Monitor (Procmon)&lt;/strong> é extremamente formidável.
Quando você utiliza o Procmon, são capturados ao vivo todos os processamentos que envolvem as APIs da manipulação contínua do Registro (tais quais &lt;code>RegOpenKey&lt;/code>, &lt;code>RegQueryValue&lt;/code> e &lt;code>RegSetValue&lt;/code>), possibilitando filtros incríveis de solução de problema como estes abaixo:&lt;/p>
&lt;ul>
&lt;li>&lt;code>Process Name&lt;/code> is &lt;code>powershell.exe&lt;/code>&lt;/li>
&lt;li>&lt;code>Operation&lt;/code> begins with &lt;code>Reg&lt;/code>&lt;/li>
&lt;li>&lt;code>Result&lt;/code> is &lt;code>ACCESS DENIED&lt;/code>&lt;/li>
&lt;/ul>
&lt;p>Isso permite identificar, em um instante, quais chaves carecem de configurações de ACL ou se foram incorretamente redirecionadas ao WOW6432Node.&lt;/p>
&lt;h2 id="12-segurança-e-melhores-práticas">12. Segurança e Melhores Práticas
&lt;/h2>&lt;p>Para concluir, vamos resumir as principais regras e melhores práticas de design da manipulação e uso base do registro.&lt;/p>
&lt;ol>
&lt;li>&lt;strong>Princípio de Privilégio Mínimo Aplicado:&lt;/strong> É o adequado e mandatório que os ajustes em aplicativos bem como em sistemas sejam direcionados em grande forma sob local do usuário &lt;code>HKCU&lt;/code> sob a raiz do &lt;code>Software&lt;/code>. Um simples acesso e a escrita requisitados aos subdiretórios sob níveis como o &lt;code>HKLM&lt;/code> vão requisitar e aumentar restrições como as elevações aos direitos de Administrador a mando da janela do UAC. Estendendo com essa atitude as vulnerabilidades, pois expande áreas do tipo &amp;ldquo;Attack Surface&amp;rdquo; nos dados alvos ao invés de simplesmente manter o conforto da operação base.&lt;/li>
&lt;li>&lt;strong>Ativação da Auditoria (Auditing):&lt;/strong> A certas chaves essenciais com permissão vital local (como a chave automática de auto-start &lt;code>Run&lt;/code>, diretórios que formam os registros via sistemas nos serviços, etc) exija que o registro passe pelos caminhos chamados SACL (System Access Control List), apontando de onde, quem e em qual dia a exclusão foi originada sendo essas salva no evento interno contido das observações base, localizadas dentro das opções sobre o utilitário nativo interno chamado Visualizador de Eventos em Registro de Auditorias (Log de Segurança).&lt;/li>
&lt;li>&lt;strong>Gerenciando Depreciações Voltadas a Base Dos Registros Nas Transações:&lt;/strong> As inovações presentes originárias na implementação nos tempos passados sob os comandos das configurações em Kernels pela manipulação base sob TxR &amp;ldquo;Kernel Transaction Manager (KTM)&amp;rdquo;, agora encontram problemas de suportes, vindo a ser depreciadas integralmente (Deprecated) pelo OS atual depois do Windows 10 e seus remanescentes. Requer agora, para os programadores da corporação e em seus desenvolvimentos contínuos uma manipulação ou modelo em memória ou manual local de salvamento interno via lógicas nas rotinas (Como fazer leituras preventivas aos valores velhos guardando uma cópia viva em arrays locais contidos dentro do software, entre outros Rollbacks nativos a serem implementados via programação base pelo dev).&lt;/li>
&lt;li>&lt;strong>Cuidado ao Conflitar a Base via GPO nas Redes Diretório de Organizações Globais:&lt;/strong> Não atue usando scripts ou alterações nativas no campo das chaves &lt;code>HKLM\SOFTWARE\Policies&lt;/code> junto do perfil das pastas &lt;code>HKCU\Software\Policies&lt;/code>, sendo esses dois controlados ou atualizados puramente sob base do sistema por &amp;ldquo;Diretivas dos Grupos&amp;rdquo;. Scripts forçados nessas áreas são apagados de tempos a tempos (a cada 90 ou mais de 120 minutos base de rotina do background) no controlador principal de Domain Controller em back-end sem nenhuma perpetuidade nativa em configurações reais dos computadores que compõem essas modificações sem fim.&lt;/li>
&lt;/ol>
&lt;h2 id="conclusões-finais">Conclusões Finais
&lt;/h2>&lt;p>Nesse tutorial verificou-se o quão vasto as áreas nos registros do seu Windows possuem de um banco que compõe regras à integridade central do Software ao Ambiente Nativo que baseiam a área visual dos sistemas de rotina nos computadores base da plataforma e aplicações e processos de usuários em todo um sistema. Operar modificações via meios visuais locais pelo Editor das configurações ao ambiente é uma medida insegura às possibilidades severas do OS com a alta chance real constatada base em equações na corrupção de subpastas a certas chaves que prejudicam todo os processos naturais integrativos Windows e sua própria viabilização do ambiente sem travamentos (O famoso BSoD). Para evitar prejuízos graves que custem a quebra da máquina é muito mais que essencial os processos através dos recursos pautáveis nativamente pela automação no uso como do C# via scripts ou uso integral do moderno e viável interpretador local de base no próprio &amp;ldquo;PowerShell&amp;rdquo;, obedecendo aos parâmetros puros essenciais (O Princípio local - Infrastructure as Code / IaC) das organizações. De modos reprodutíveis nos códigos locais limpos ou testáveis via comandos isolados e ambientes propícios a manipulação robusta, viável para a execução assertiva. Se as noções das profundezas apresentadas pautadas aos conhecimentos das raízes em Arquitetura da base que apresentados nesta matéria ficarem fixadas as formas das seguras de execuções de registro ficará na marca integral ao gerenciamento da Base Dos Registros aos mais seguros cenários nas configurações base nativa das Máquinas.&lt;/p></description></item></channel></rss>