Compartilhar via


Solucionando problemas de exceções de segurança de acesso ao código

O controle das permissões que o código tem permissão de fazer e não fazer. No momento em que um aplicativo é executado, ele recebe um conjunto de permissões em tempo de execução. Se ele tiver permissões suficientes, será executado corretamente; caso contrário, ocorrerá uma exceção de segurança.

As permissões que o código recebe são determinadas pelo local do qual o aplicativo foi iniciado (por exemplo, a Internet, intranet ou computador local) e pelas configurações de segurança no computador no qual o aplicativo está sendo executado. Como essas configurações podem diferir de um computador para outro, nem sempre é possível prever se o código receberá as permissões adequadas.

Solicitar permissões garante que o código seja executado se a política de segurança no computador local assim o permitir. Se você não solicitar as permissões necessárias, correrá o risco de o código não ser executado. Para obter mais informações sobre permissões do acesso a código e como solicitá-las, consulte Permissões de acesso de código ou Requesting Permissions. Para obter mais informações sobre bloqueios Try...Catch, consulte Instrução Try...Catch...Finally (Visual Basic).

Os aplicativos do ClickOnce podem solicitar permissões adicionais, se for necessário, usando a Página de Segurança no Designer de Aplicativo. Para obter mais informações, consulte Como definir permissões personalizadas para um aplicativo ClickOnce.

As possíveis causas de exceções de segurança de acesso a código incluem:

  • Área de transferência. Colar da área de transferência programaticamente é um recurso restrito do código gerenciado, porque a área de transferência pode conter informações confidenciais.

  • Acesso ao Registro ou ao sistema de arquivos. O acesso ao sistema de arquivos local é restrito. Se você estiver acessando um arquivo ou um recurso que tenha sido implantado com o assembly, use o código Assembly.GetExecutingAssembly.Location para obter o caminho para o assembly.

  • Acesso de rede. Verifique se seu assembly usa o mesmo protocolo com o qual o assembly foi carregado. Geralmente, uma comunicação de rede é permitida somente para a URL que foi a origem do assembly.

  • Imprimindo. O software em execução na área da Internet pode imprimir somente usando uma caixa de diálogo comum. É restrita para uso da impressora padrão apenas se usar uma caixa de diálogo comum para permitir que o usuário selecione uma impressora.

  • Serialização. A capacidade de recriar um objeto de dados arbitrários está restrita ao código em execução com confiança total. Para a serialização XML, o tipo XmlSerializer tecnicamente deve ser útil pelo código parcialmente confiável. Para obter mais informações sobre o tipo XmlSerializer, consulte Classe XmlSerializer.

  • Reflexão. Muitos dos recursos relacionados à reflexão do tempo de execução são restritos de uso pelo código parcialmente confiável.

Testando o código para determinar se ele gerará um acesso a código SecurityException

Se você tiver um bloco de código com o potencial de gerar uma CodeAccessSecurityException, use um bloco Try...Catch para permitir que o código seja executado se puder, e para resolver a falha se não puder.

Às vezes você pode querer criar seu aplicativo para ajustar seu comportamento dependendo das permissões que o sistema do host concedeu. Por exemplo, você pode querer desabilitar um comando de impressão em um menu se o aplicativo não tiver permissões de impressão.

Para testar isso, você pode criar uma instância de uma classe derivada de CodeAccessPermission, por exemplo, FileIOPermission. Em seguida, você pode executar o método Demand na permissão dentro de um bloco Try...Catch. Se a exceção for gerada, então o assembly não terá permissão.

O exemplo a seguir testa se o assembly tem permissão EventLogPermission executando ou criando um EventLogPermission e executando o método Demand dentro de um bloco Try...Catch para determinar se Demand foi bem-sucedido.

Try
    Dim MyPermission As New EventLogPermission
    MyPermission.Demand()
    MsgBox(MyPermission.ToString())
Catch ex As Exception
    MsgBox("Assembly lacks EventLogPermission.")
End Try

Consulte também

Conceitos

Permissões de acesso de código

Noções básicas da segurança de acesso do código

Outros recursos

Requesting Permissions