Como: acesso e modificar arquivos de configuração ASP.NET remotamente

Os tipos System.Configuration e System.Web.Configuration permitem que seu aplicativo acesse os arquivos de configuração em um servidor remoto.Em particular, você pode abrir e modificar o Machine.config ou um arquivo Web.config em qualquer aplicativo Serviços de Informações da Internet (IIS) da Microsoft, ou suas pastas filho em um servidor remoto.Este tópico:

  • Demonstra como definir o servidor remoto para permitir que um computador cliente acesse os arquivos de configuração do servidor.

  • Fornece um aplicativo de console, para ser executado no computador cliente, que pode ler ou modificar os arquivos de configuração do servidor.

  • Descreve as considerações de segurança para levar em conta.

Para acessar arquivos de configuração em um servidor remoto, o computador cliente deve ser capaz de se comunicar com o servidor.Para ativar essa comunicação, um componente de configuração remoto deve ser instalado no servidor.

O computador cliente, em seguida, acessa os arquivos de configuração do servidor chamando o API da configuração ASP.NET por meio do componente de configuração remoto.Para obter mais informações, consulte Editando Arquivos de Configuração remotos do ASP.NET.

Observação:

Se o arquivo de configuração solicitado não existir, o .NET Framework, em execução no servidor, retornara um arquivo de configuração consistindo inteiramente de configurações herdadas que se aplicam ao caminho especificado.Se seu aplicativo solicita uma atualização, um novo arquivo é criado.Ao executar o aplicativo de console, insira um nome de servidor válido.Isso ocorre porque o ASP.NET passa esse nome diretamente para o sistema operacional.Você deve digitar um nome de usuário totalmente qualificado com o prefixo nome de domínio da mesma forma.

Para configurar o servidor remoto

  1. Instale o componente remoto de configuração no servidor usando a ferramenta de registro do IIS do ASP.NET (Aspnet_regiis.exe) com o comando config+, conforme mostrado no código o seguir.

    Aspnet_regiis config+
    
  2. Por meio de programação ou manualmente, certifique-se de que o arquivo web.config do "Site da Web Padrão" do servidor IIS contenha valores semelhantes aos seguinte:

    <appSettings>
        <add key="keyName1", value = "this entry value"/>
        <add key="keyName2", value = "this entry value"/>
        <add key="keyName3", value = "this entry value"/>
    </appSettings>
    

Para atualizar os arquivos de configuração remoto usando um aplicativo de console

  • Execute o aplicativo de console fornecido no exemplo de código abaixo para atualizar o arquivo web.config do site da Web padrão no servidor remoto.Este exemplo assume que o usuário que está executando o aplicativo cliente tem privilégios administrativos sobre o servidor remoto.Você pode usar um desses dois comandos.

    >remoteconfiguration machineName
    >remoteconfiguration machineName domainName\userName password
    

Exemplo

Imports System
Imports System.Configuration
Imports System.Web.Configuration
Imports System.Collections.Specialized


' This example dDemonstrates how to access and modify remote 
' configuration files


Public Class RemoteConfiguration


    ' The application entry point.
    Public Shared Sub Main(ByVal args() As String) 

        ' This string  contains the name of 
        ' the remote server.
        Dim machineName As String = String.Empty

        ' Get the user's input.
        If args.Length > 0 Then
            ' Get the name of the remote server.
            ' The machine name must be in the format
            ' accepted by the operating system.
            machineName = args(0)

            ' Get the user name and password.
            If args.Length > 1 Then
                Dim userName As String = args(1)
                Dim password As String = String.Empty
                If args.Length > 2 Then
                    password = args(2)
                End If 
                ' Update the site configuration.
                UpdateConfiguration(machineName, userName, password)
            Else
                ' Update the site configuration.
                UpdateConfiguration(machineName)
            End If
        Else
            Console.WriteLine("Enter a valid server name.")
        End If

    End Sub 'Main


    ' Update the configuration file using the credentials
    ' of the user running this application. Tthen,
    ' call the routine that reads the configuration 
    ' settings.
    ' Note that the system issues an error if the user
    ' does not have administrative privileges on the server.
    Public Overloads Shared Sub _
    UpdateConfiguration(ByVal machineName As String)
        Try
            Console.WriteLine("MachineName:  [{0}]", machineName)
            Console.WriteLine("UserDomainName:  [{0}]", _
                Environment.UserDomainName)
            Console.WriteLine("UserName:  [{0}]", _
                Environment.UserName)

            ' Get the configuration.
            Dim config As Configuration = _
                WebConfigurationManager.OpenWebConfiguration("/", _
                "Default Web Site", Nothing, machineName)

            ' Add a new key/value pair to appSettings.
            Dim count As String = _
                config.AppSettings.Settings.Count.ToString()
            config.AppSettings.Settings.Add("key_" + count, _
                "value_" + count)

            ' Save changes to the file.
            config.Save()

            ' Read the new appSettings.
            ReadAppSettings(config)
        Catch err As Exception
            Console.WriteLine(err.ToString())
        End Try

    End Sub 'UpdateConfiguration


    ' Update the configuration file using the credentials
    ' of the passed user,  then call the routine that reads 
    ' the configuration settings.
    ' Note that the system issues an error if the user
    ' does not have administrative privileges on the server.
    Public Overloads Shared Sub UpdateConfiguration(ByVal _
        machineName As String, ByVal userName As String, ByVal _
        password As String)
        Try
            Console.WriteLine("MachineName:  [{0}]", machineName)
            Console.WriteLine("UserName:  [{0}]", userName)
            Console.WriteLine("Password:  [{0}]", password)

            ' Get the configuration.
            Dim config As Configuration = _
                WebConfigurationManager.OpenWebConfiguration("/", _
                "Default Web Site", Nothing, machineName, _
                userName, password)


            ' Add a new key/value pair to appSettings
            Dim count As String = _
                config.AppSettings.Settings.Count.ToString()
            config.AppSettings.Settings.Add("key_" + _
                count, "value_" + count)
            ' Save to the file,
            config.Save()

            ' Read the new appSettings.
            ReadAppSettings(config)

        Catch err As Exception
            Console.WriteLine(err.ToString())
        End Try

    End Sub 'UpdateConfiguration


    ' Read the appSettings on the remote server.
    Public Shared Sub ReadAppSettings(ByVal config As Configuration) 
        Try
            Console.WriteLine("--- Printing appSettings at [{0}] ---", _
                config.FilePath)
            Console.WriteLine("Count: [{0}]", _
                config.AppSettings.Settings.Count)
            Dim key As String
            For Each key In  config.AppSettings.Settings.AllKeys
                Console.WriteLine("  [{0}] = [{1}]", _
                    key, config.AppSettings.Settings(key).Value)
            Next key
            Console.WriteLine()

        Catch err As Exception
            Console.WriteLine(err.ToString())
        End Try

    End Sub 'ReadAppSettings
End Class 'RemoteConfiguration

using System;
using System.Configuration;
using System.Web.Configuration;
using System.Collections.Specialized;

namespace Samples.AspNet
{
    // This example dDemonstrates how to access and modify remote 
   // configuration files
    public class RemoteConfiguration
    {

        // The application entry point.
        public static void Main(string[] args)
        {
            // This string  contains the name of 
            // the remote server.
            string machineName = string.Empty;

            // Get the user's input.
            if (args.Length > 0)
            {
                // Get the name of the remote server.
                // The machine name must be in the format
                // accepted by the operating system.
                machineName = args[0];

                // Get the user name and password.
                if (args.Length > 1)     
                {                
                    string userName = args[1];
                    string password = string.Empty;
                    if (args.Length > 2)
                        password = args[2];

                    // Update the site configuration.
                    UpdateConfiguration(machineName, userName, 
                        password);
                }
                else
                { 
                    // Update the site configuration.
                    UpdateConfiguration(machineName);
                }
            }
            else
            {
                Console.WriteLine("Enter a valid server name.");
            }
        }

        // Update the configuration file using the credentials
        // of the user running this application then
        // call the routine that reads the configuration 
        // settings.
        // Note that the system issues an error if the user
        // does not have administrative privileges on the server.
        public static void UpdateConfiguration(string machineName)
        {
            try
            {
                Console.WriteLine("MachineName:  [{0}]", machineName);
                Console.WriteLine("UserDomainName:  [{0}]", 
                    Environment.UserDomainName);
                Console.WriteLine("UserName:  [{0}]", 
                    Environment.UserName);

                // Get the configuration.
                Configuration config = 
                    WebConfigurationManager.OpenWebConfiguration(
                    "/", "Default Web Site", null, machineName);

                // Add a new key/value pair to appSettings.
                string count = 
                    config.AppSettings.Settings.Count.ToString();
                config.AppSettings.Settings.Add("key_" + count, "value_" + count);
                // Save to the file,
                config.Save();

                // Read the new appSettings.
                ReadAppSettings(config);
            }
            catch (Exception err)
            {
                Console.WriteLine(err.ToString());
            }
        }

         // Update the configuration file using the credentials
         // of the passed user. Tthen,
     // call the routine that reads the configuration settings.
        // Note that the system issues an error if the user
        // does not have administrative privileges on the server.
        public static void UpdateConfiguration(string machineName, 
            string userName, string password)
        {
            try
            {
                Console.WriteLine("MachineName:  [{0}]", machineName);
                Console.WriteLine("UserName:  [{0}]", userName);
                Console.WriteLine("Password:  [{0}]", password);

                // Get the configuration.
                Configuration config = 
                    WebConfigurationManager.OpenWebConfiguration(
                    "/", "Default Web Site", null, 
                    machineName, userName, password);


                // Add a new key/value pair to appSettings
                string count =
                    config.AppSettings.Settings.Count.ToString();
                config.AppSettings.Settings.Add("key_" + count, "value_" + count);

             // Save changes to the file.
                config.Save();

                // Read the new appSettings.
                ReadAppSettings(config);

            }
            catch (Exception err)
            {
                Console.WriteLine(err.ToString());
            }
        }

        // Read the appSettings on the remote server.
        public static void ReadAppSettings(
            Configuration config)
        {
            try
            {
                Console.WriteLine("--- Printing appSettings at [{0}] ---", 
                    config.FilePath);
                Console.WriteLine("Count: [{0}]", 
                    config.AppSettings.Settings.Count);
                foreach (string key in config.AppSettings.Settings.AllKeys)
                {
                    Console.WriteLine("  [{0}] = [{1}]", 
                        key, config.AppSettings.Settings[key].Value);
                }
                Console.WriteLine();

            }           
            catch (Exception err)
            {
                Console.WriteLine(err.ToString());
            }
        }
    }

}

O exemplo de código anterior lê e modifica os valores do elemento AppSettings configurado para o site da Web padrão do servidor.Em seguida, os valores são exibidos no console.

O código usa os seguintes métodos:

  • OpenWebConfiguration, para abrir o arquivo de configuração do aplicativo da Web como um objeto Configuration.Observe que o usuário implícito deve ter privilégios administrativos sobre o servidor remoto.

  • OpenWebConfiguration, para abrir o arquivo de configuração do aplicativo da Web como um objeto Configuration.Observe que o usuário especificado na lista de parâmetros deve ter privilégios administrativos sobre o servidor remoto.

  • AppSettings, para acessar a seção de sites relacionados padrão.

  • GetSection, para acessar a seção de identidade de sites padrão.

Compilando o código

Para compilar o aplicativo de console, você deve use o comando a seguir.

vbc /out:RemoteConfiguration.exe /t:exe RemoteConfiguration.vb
/r:System.Web.dll /r:System.Configuration.dll
csc /out: RemoteConfiguration.exe /t:exe RemoteConfiguration.cs
/r:System.Web.dll /r:System.Configuration.dll

Segurança

Para acessar um arquivo de configuração em um servidor remoto, seu aplicativo deve ter privilégios administrativos naquele servidor remoto.

Observação:

Esse é um requisito mais estrito do que aquele necessário para acessar os arquivos de configuração local.Para acessar arquivos locais, o aplicativo precisa apenas de privilégios de leitura/gravação e acesso de leitura para a meta base do IIS para resolver o caminho.

Consulte também

Conceitos

Editando Arquivos de Configuração remotos do ASP.NET

Usando as Classes de Configuração

Visão Geral da Configuração ASP.NET

Referência

System.Configuration

System.Web.Configuration

Ferramenta de registro ASP.NET IIS (Aspnet_regiis.exe)

Outros recursos

Configurando aplicativos