Back-End

9 dez, 2016

C# – Trabalhando com variáveis de ambiente

Publicidade

Neste artigo, vou apresentar conceitos relacionados às variáveis de ambiente e mostrar como podemos tratá-las em um programa usando a linguagem C#.

A classe Environment pode ser usada para para obter informações sobre o ambiente atual da plataforma na qual estamos trabalhando.

Ela pode ser usada para recuperar informações como argumentos de linha de comando, o código de saída, as configurações de variável de ambiente, conteúdo da pilha de chamadas, tempo desde a última inicialização do sistema e a versão do Common Language Runtime (CLR).

O método GetEnvironmentVariable(String) recupera uma variável de ambiente do bloco de ambiente do processo atual, o qual inclui as seguintes variáveis de ambiente:

  • Todas as variáveis de ambiente por máquina (Machine) que são definidas no momento em que o processo é criado, junto com seus valores;
  • Todas as variáveis de ambiente por usuário (User) que são definidas no momento do processo é criado, junto com seus valores;
  • Qualquer variável adicionada ao bloco do processo enquanto o processo estiver sendo executado pela chamada de SetEnvironmentVariable(String, String) ou SetEnvironmentVariable(String, String, EnvironmentVariableTarget) com um valor alvo de EnvironmentVariableTarget.Process.

Para recuperar todas as variáveis de ambiente junto com seus valores, chame o método GetEnvironmentVariables (nomes de variável de ambiente não diferenciam maiúsculas de minúsculas).

A enumeração EnvironmentVariableTarget pode ser usada por determinadas sobrecargas dos métodos SetEnvironmentVariable, GetEnvironmentVariable, e GetEnvironmentVariables para especificar o local ou o destino, onde o nome e o valor de uma variável de ambiente são armazenados ou recuperados.

O destino pode ser um dos três locais:

  • O bloco de ambiente associado com o processo atual;
  • A chave de registro do sistema operacional Windows reservada para variáveis de ambiente associadas ao usuário atual;
  • A chave de registro reservada para variáveis de ambiente associadas a todos os usuários na máquina local.

Neste artigo, vamos criar um exemplo que mostra como usar esses recursos para editar caminhos de variáveis de ambiente.

Recursos usados:

Criando o projeto no VS 2015 Community

Abra o VS Community 2015 e clique em New Project.

Selecione a linguagem Visual C# e o template Windows Forms Application.

Informe o nome PathEditor e clique no botão OK.

No formulário form1.cs, inclua a partir da ToolBox os seguintes controles:

  • 1 GroupBox
  • 3 RadioButtons : radUser, radProcess e radMachine
  • 1 Listbox – lbEntradas
  • 1 TextBox – txtValorAtual
  • 1 Button – btnProcurar
  • 6 Buttons – btnExportar , btnAtualizar, btnDeletar, btnIncluir, btnOK e btnCancelar
  • 1 FolderBrowserDialog

Disponha os controles conforme o leiaute da figura abaixo:

1

A seguir, vamos definir 3 métodos no formulário form1.cs:

  • ObtemCaminhoVariavel – usa o método GetEnvironmentVariable() para recuperar as variáveis de ambiente do bloco de ambiente do processo atual.
  • DefineCaminhoVariavel – usa o método SetEnvironmentVariable() para criar, modificar ou excluir uma variável de ambiente armazenada no processo atual.
  • CriarCaminhoVariavel – Obtém o caminho da variável.
   private void ObtemCaminhoVariavel()
    {
      string valor = "";     

      try
      {
        valor = Environment.GetEnvironmentVariable("Path", Alvo);
      }
      catch (SecurityException)
      {
        MessageBox.Show("Você não tem permissão para realizar esta operação.\nExecute o programa como Administrador");
      }
      if (valor != "")
      {
        string[] item = valor.Split(new char[]{Path.PathSeparator}, StringSplitOptions.RemoveEmptyEntries);      
        lblEntradas.Items.Clear();
        lblEntradas.Items.AddRange(item);
        lblEntradas.SelectedIndex = 0;
      }
    }

    private void DefineCaminhoVariavel()
    {
      string valor = CriarCaminhoVariavel();

      try
      {
        Environment.SetEnvironmentVariable("Path", valor, Alvo);
      }
      catch (SecurityException)
      {
          MessageBox.Show("Você não tem permissão para realizar esta operação.\nExecute o programa como Administrador");
      }
    }

    private string CriarCaminhoVariavel()
    {
      string value = String.Empty;

      foreach (Object o in lblEntradas.Items)
        value += o.ToString() + Path.PathSeparator;

      return value;
    }

Nota: A classe Split retorna um array de única dimensão contendo o número de substrings separadas no processo dependendo do critério e delimitador usado.

A seguir, vamos definir o método Alvo que retorna o tipo de processo sobre o qual as informações serão retornadas – Machine, Process ou User:

   public EnvironmentVariableTarget Alvo
    {
      get
      {
        if (radMachine.Checked)
          return EnvironmentVariableTarget.Machine;
        else if (radProcess.Checked)
          return EnvironmentVariableTarget.Process;
        else
          return EnvironmentVariableTarget.User;
      }
    }

A seguir, vamos tratar os eventos dos controles usados no formulário.

Evento Click do botão Procurar

  private void btnProcurar_Click(object sender, EventArgs e)
   {
      if (folderBrowserDialog.ShowDialog() == DialogResult.OK)
        txtValorAtual.Text = folderBrowserDialog.SelectedPath;
    }

Evento Click do botão Atualizar

   private void btnAtualizar_Click(object sender, EventArgs e)
    {
      int idx = lblEntradas.SelectedIndex;

      if (idx != -1)
           lblEntradas.Items[idx] = txtValorAtual.Text;
    }

Evento Click do botão Deletar

   private void btnDeletar_Click(object sender, EventArgs e)
    {
      int idx = lblEntradas.SelectedIndex;
      if (idx != -1)
      {
        lblEntradas.Items.RemoveAt(idx);
        idx--;
        if (idx < 0)
        {
          idx = 0;
        }
        lblEntradas.SelectedIndex = idx;
      }
    }

Evento Click do botão Incluir

  private void btnIncluir_Click(object sender, EventArgs e)
    {
      if (!String.IsNullOrEmpty(txtValorAtual.Text))
        lblEntradas.Items.Add(txtValorAtual.Text);
    }

Evento Click do botão OK

  private void btnOk_Click(object sender, EventArgs e)
    {
        DefineCaminhoVariavel();
        Close();
    }

Evento Click do botão Cancelar

   private void btnCancelar_Click(object sender, EventArgs e)
    {
      Close();
    }

Evento Click do botão Exportar

    private void btnExportar_Click(object sender, EventArgs e)
    {
      using(SaveFileDialog sfd = new SaveFileDialog())
      {
        sfd.Filter = "Arquivos Textos (*.txt)|*.txt";
        sfd.Title = "Salvar Variável de ambiente para o disco";
        sfd.FileName = "ValorCaminhoAntigo.txt";
        sfd.DefaultExt = ".txt";

         if (sfd.ShowDialog() == DialogResult.OK)
             File.WriteAllText(sfd.FileName, CriarCaminhoVariavel());
      }
    }

Evento MouseUp do Listbox

  private void lbEntradas_MouseUp(object sender, MouseEventArgs e)
    {
         txtValorAtual.Text = lblEntradas.SelectedItem.ToString();
    }

Evento CheckedChanged do RadioButton Process

  private void radProcess_CheckedChanged(object sender, EventArgs e)
    {
        ObtemCaminhoVariavel();
    }

Executando o projeto, iremos obter:

2

Pegue o projeto completo aqui: PathEditor.zip.