Neste artigo
ToggleOlá pessoal,
Boa tarde!
No post de hoje, vou demonstrar como gerenciar (ler, listar, criar, alterar e apagar) chaves do registro do Windows (Windows Registry) através do banco de dados, utilizando o SQL CLR e a linguagem de programação C# (CSharp), que nos permite estender em muito, as capacidades e funcionalidades do banco de dados SQL Server.
Esse tipo de funcionalidade é muito útil quando você precisa consultar rapidamente alguma informação no registro do Windows de algum servidor ou realizar alguma alteração no registro sem precisar conectar no servidor, apenas executando uma Stored Procedure, ou mesmo para aplicar uma alteração de registro em várias máquinas ou servidores de forma automatizada.
Vale lembrar que eu já havia feito um post (SQL Server – Consultando informações da instância no Windows Registry utilizando sys.dm_server_registry e xp_instance_regread) onde era possÃvel ler algumas informações do registro do Windows sem utilizar o CLR, mas relativos apenas a informações da instância do SQL Server e não a leitura geral de qualquer chave do registro e muito menos a manipulação dessas informações, o que me motivou a criar este novo post para essa necessidade.
Algumas Stored Procedures abaixo requerem o uso da classe Retorno, que utilizo para enviar mensagens de alerta e/ou erro do CLR para o banco de dados. O código-fonte dessa classe pode ser visualizado no post SQL Server – Como enviar avisos e mensagens de erro para o banco pelo CLR (C#)
Como ler e listar chaves de registros do WindowsComo ler e listar chaves de registros do Windows
Para listar os registros do Windows, vou utilizar a classe RegistryRow, que encapsula vários métodos da biblioteca Microsoft.Win32.RegistryKey e a utilizo na função table-valued fncRegEdit_Listar, conforme exemplo acima, onde informo como parâmetros, o nome da máquina e a chave de registro que será lida.
RegEdit.cs
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 |
using System; using System.Collections; using Microsoft.Win32; namespace Bibliotecas.Model { public class RegistryRow { public string Tipo; public string Chave; public string Valor; public RegistryRow(string tipo, string chave, string valor) { Tipo = tipo; Chave = chave; Valor = valor; } public static ArrayList RegEdit_Listar(string Ds_Servidor, string Ds_Chave) { var RegistryRowCollection = new ArrayList(); if (string.IsNullOrEmpty(Ds_Servidor)) Ds_Servidor = Environment.MachineName; var registryHive = RegistryHive.LocalMachine; if (Ds_Chave.Substring(0, 5).ToUpper() == "HKEY_") { var palavras = Ds_Chave.Split('\\'); var raiz = palavras[0]; switch (raiz) { case "HKEY_CURRENT_CONFIG": registryHive = RegistryHive.CurrentConfig; break; case "HKEY_CURRENT_USER": registryHive = RegistryHive.CurrentUser; break; case "HKEY_USERS": registryHive = RegistryHive.Users; break; case "HKEY_CLASSES_ROOT": registryHive = RegistryHive.ClassesRoot; break; case "HKEY_LOCAL_MACHINE": default: registryHive = RegistryHive.LocalMachine; break; } Ds_Chave = string.Join("\\", palavras, 1, palavras.Length - 1); } var myRegChave = RegistryKey.OpenRemoteBaseKey(registryHive, Ds_Servidor).OpenSubKey(Ds_Chave); var subKeys = myRegChave?.GetSubKeyNames(); if (subKeys != null) { foreach (var key in subKeys) { try { RegistryRowCollection.Add(new RegistryRow( "Chave", key, "" )); } catch (Exception e) { // ignored } } } myRegChave = RegistryKey.OpenRemoteBaseKey(registryHive, Ds_Servidor).OpenSubKey(Ds_Chave); var valorNames = myRegChave?.GetValueNames(); if (valorNames == null) return RegistryRowCollection; foreach (var chave in valorNames) { try { var valor = myRegChave.GetValue(chave).ToString(); RegistryRowCollection.Add(new RegistryRow( "Valor", chave, valor )); } catch (Exception e) { // ignored } } return RegistryRowCollection; } } } |
fncRegEdit_Listar.cs
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
using System.Collections; using System.Data.SqlTypes; using Bibliotecas.Model; public partial class UserDefinedFunctions { [Microsoft.SqlServer.Server.SqlFunction( FillRowMethodName = "FillRegistryRow", TableDefinition = "Ds_Tipo nvarchar(50), Ds_Chave nvarchar(max), Ds_Valor nvarchar(max)" )] public static IEnumerable fncRegEdit_Listar(string Ds_Servidor, string Ds_Chave) { var RegistryRowCollection = RegistryRow.RegEdit_Listar(Ds_Servidor, Ds_Chave); return RegistryRowCollection; } protected static void FillRegistryRow(object objRegistryRow, out SqlString tipo, out SqlString key, out SqlString value) { var registryRow = (RegistryRow) objRegistryRow; tipo = registryRow.Tipo; key = registryRow.Chave; value = registryRow.Valor; } } |
Como criar pastas de registros do Windows
Para criar pastas nos registros do Windows, eu utilizo a Stored Procedure stpRegEdit_Pasta_Criar, conforme no exemplo acima, que permite criar diretórios em uma chave de registro do Windows.
stpRegEdit_Pasta_Criar.cs
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 |
using System; using System.Data.SqlTypes; using Bibliotecas.Model; using Microsoft.Win32; public partial class StoredProcedures { [Microsoft.SqlServer.Server.SqlProcedure] public static void stpRegEdit_Pasta_Criar(SqlString Ds_Servidor, SqlString Ds_Caminho, SqlString Ds_Chave) { try { if (Ds_Servidor.IsNull) Retorno.Erro("Favor informar o servidor"); if (Ds_Caminho.IsNull) Retorno.Erro("Favor informar o caminho"); if (Ds_Chave.IsNull) Retorno.Erro("Favor informar a chave"); var caminho = Ds_Caminho.Value; var registryHive = RegistryHive.LocalMachine; if (caminho.Substring(0, 5).ToUpper() == "HKEY_") { var palavras = caminho.Split('\\'); var raiz = palavras[0]; switch (raiz) { case "HKEY_CURRENT_CONFIG": registryHive = RegistryHive.CurrentConfig; break; case "HKEY_CURRENT_USER": registryHive = RegistryHive.CurrentUser; break; case "HKEY_USERS": registryHive = RegistryHive.Users; break; case "HKEY_CLASSES_ROOT": registryHive = RegistryHive.ClassesRoot; break; case "HKEY_LOCAL_MACHINE": default: registryHive = RegistryHive.LocalMachine; break; } caminho = string.Join("\\", palavras, 1, palavras.Length - 1); } var registro = RegistryKey.OpenRemoteBaseKey(registryHive, Ds_Servidor.Value).OpenSubKey(caminho, true); registro?.CreateSubKey(Ds_Chave.Value); registro?.Close(); } catch (Exception e) { Retorno.Erro("Erro : " + e.Message); } } } |
Como apagar pastas de registros do Windows
Para apagar pastas nos registros do Windows, eu utilizo a Stored Procedure stpRegEdit_Pasta_Apagar, conforme no exemplo acima, que permite apagar diretórios do registro do Windows. A flag binária @Fl_Recursivo = 1, permite apagar as chaves e sub-diretórios recursivamente de um determinado diretório.
Caso a flag @Fl_Recursivo = 0, só será possÃvel apagar diretórios que não possuem sem sub-diretórios e se você tentar, irá se deparar a com a mensagem de erro “System.ApplicationException: Erro : Registry key has subkeys and recursive removes are not supported by this method.”.
stpRegEdit_Pasta_Apagar.cs
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 |
using System; using System.Data.SqlTypes; using Bibliotecas.Model; using Microsoft.Win32; public partial class StoredProcedures { [Microsoft.SqlServer.Server.SqlProcedure] public static void stpRegEdit_Pasta_Criar(SqlString Ds_Servidor, SqlString Ds_Caminho, SqlString Ds_Chave) { try { if (Ds_Servidor.IsNull) Retorno.Erro("Favor informar o servidor"); if (Ds_Caminho.IsNull) Retorno.Erro("Favor informar o caminho"); if (Ds_Chave.IsNull) Retorno.Erro("Favor informar a chave"); var caminho = Ds_Caminho.Value; var registryHive = RegistryHive.LocalMachine; if (caminho.Substring(0, 5).ToUpper() == "HKEY_") { var palavras = caminho.Split('\\'); var raiz = palavras[0]; switch (raiz) { case "HKEY_CURRENT_CONFIG": registryHive = RegistryHive.CurrentConfig; break; case "HKEY_CURRENT_USER": registryHive = RegistryHive.CurrentUser; break; case "HKEY_USERS": registryHive = RegistryHive.Users; break; case "HKEY_CLASSES_ROOT": registryHive = RegistryHive.ClassesRoot; break; case "HKEY_LOCAL_MACHINE": default: registryHive = RegistryHive.LocalMachine; break; } caminho = string.Join("\\", palavras, 1, palavras.Length - 1); } var registro = RegistryKey.OpenRemoteBaseKey(registryHive, Ds_Servidor.Value).OpenSubKey(caminho, true); registro?.CreateSubKey(Ds_Chave.Value); registro?.Close(); } catch (Exception e) { Retorno.Erro("Erro : " + e.Message); } } } |
Como criar/alterar chaves de registros do Windows
Como criar chaves e valores no Registro do Windows:
Como alterar chaves e valores no Registro do Windows:
Para criar/alterar os registros do Windows, eu utilizo a Stored Procedure stpRegEdit_Chave_Criar, conforme exemplificado acima e o código-fonte está disponÃvel logo abaixo:
stpRegEdit_Chave_Criar.cs
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 |
using System; using System.Data.SqlTypes; using Bibliotecas.Model; using Microsoft.Win32; public partial class StoredProcedures { [Microsoft.SqlServer.Server.SqlProcedure] public static void stpRegEdit_Chave_Criar(SqlString Ds_Servidor, SqlString Ds_Caminho, SqlString Ds_Chave, SqlString Ds_Valor) { try { if (Ds_Servidor.IsNull) Retorno.Erro("Favor informar o servidor"); if (Ds_Caminho.IsNull) Retorno.Erro("Favor informar o caminho"); if (Ds_Chave.IsNull) Retorno.Erro("Favor informar a chave"); if (Ds_Valor.IsNull) Retorno.Erro("Favor informar o valor"); var caminho = Ds_Caminho.Value; var registryHive = RegistryHive.LocalMachine; if (caminho.Substring(0, 5).ToUpper() == "HKEY_") { var palavras = caminho.Split('\\'); var raiz = palavras[0]; switch (raiz) { case "HKEY_CURRENT_CONFIG": registryHive = RegistryHive.CurrentConfig; break; case "HKEY_CURRENT_USER": registryHive = RegistryHive.CurrentUser; break; case "HKEY_USERS": registryHive = RegistryHive.Users; break; case "HKEY_CLASSES_ROOT": registryHive = RegistryHive.ClassesRoot; break; case "HKEY_LOCAL_MACHINE": default: registryHive = RegistryHive.LocalMachine; break; } caminho = string.Join("\\", palavras, 1, palavras.Length - 1); } var registro = RegistryKey.OpenRemoteBaseKey(registryHive, Ds_Servidor.Value).OpenSubKey(caminho, true); registro?.SetValue(Ds_Chave.Value, Ds_Valor.Value); registro?.Close(); } catch (Exception e) { Retorno.Erro("Erro : " + e.Message); } } } |
Como apagar chaves de registros do Windows
Para apagar as chaves de registros do Windows, utilizo a Stored Procedure stpRegEdit_Chave_Apagar, no mesmos padrões das Stored Procedures acima.
stpRegEdit_Chave_Apagar.cs
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 |
using System; using System.Data.SqlTypes; using Bibliotecas.Model; using Microsoft.Win32; public partial class StoredProcedures { [Microsoft.SqlServer.Server.SqlProcedure] public static void stpRegEdit_Chave_Apagar(SqlString Ds_Servidor, SqlString Ds_Caminho, SqlString Ds_Chave) { try { if (Ds_Servidor.IsNull) Retorno.Erro("Favor informar o servidor"); if (Ds_Caminho.IsNull) Retorno.Erro("Favor informar o caminho"); if (Ds_Chave.IsNull) Retorno.Erro("Favor informar a chave"); var caminho = Ds_Caminho.Value; var registryHive = RegistryHive.LocalMachine; if (caminho.Substring(0, 5).ToUpper() == "HKEY_") { var palavras = caminho.Split('\\'); var raiz = palavras[0]; switch (raiz) { case "HKEY_CURRENT_CONFIG": registryHive = RegistryHive.CurrentConfig; break; case "HKEY_CURRENT_USER": registryHive = RegistryHive.CurrentUser; break; case "HKEY_USERS": registryHive = RegistryHive.Users; break; case "HKEY_CLASSES_ROOT": registryHive = RegistryHive.ClassesRoot; break; case "HKEY_LOCAL_MACHINE": default: registryHive = RegistryHive.LocalMachine; break; } caminho = string.Join("\\", palavras, 1, palavras.Length - 1); } var registro = RegistryKey.OpenRemoteBaseKey(registryHive, Ds_Servidor.Value).OpenSubKey(caminho, true); registro?.DeleteValue(Ds_Chave.Value); registro?.Close(); } catch (Exception e) { Retorno.Erro("Erro : " + e.Message); } } } |
Caso você não sabia o que é o CLR e gostaria de saber mais sobre o assunto, visite o meu post Introdução ao SQL CLR (Common Language Runtime) no SQL Server.
And that's it, folks!
Até o próximo post.
sql server c# csharp access acessar listar list view visualizar read registro do windows registry regedit
sql server c# csharp access acessar listar list view visualizar read registro do windows registry regedit