Anda di halaman 1dari 7

Colabora: Acceder al Registro por WMI

Pgina 1 de 7

el Guille, la Web del Visual Basic, C#, .NET y ms...


Lo+ - WinFX - .NET - ADO.NET - ASP.NET - Cmo... - Colabora - VB6 - API - HTML - Vista Links - Foros

Reglate mi libro de Visual Basic 2005 Y ten la base suficiente para aprovechar mi nuevo libro: Novedades de Visual Basic 9.0

Acceder al Registro por WMI


[Otra Forma de Acceder al Registro]
Fecha: 21/Nov/2005 (17-11-2005) Autor: Pol Florez Viciana polflorez56@hotmail.com

A continuacin muestro una forma de acceder al Registro de Windows a travs de la WMI de Windows. ( Windows Management Instrumentation )

El ejemplo esta bastante explicado ( al menos eso creo ) y de todas formas arriba tenis mi e-mail por si queris alguna aclaracin del ejemplo ( Adems de tener abajo el Fichero Zip con el Ejemplo ). En el ejemplo hay un formulario en el que hay un Control ComboBox, un TextBox y dos ListBox los cuales nos servirn para introducir y Recibir los Datos. Tambin hay un Modulo que eh llamado Registry en el cual estn los tipos, enumeraciones y funciones de acceso para poder leer y escribir datos en el Registro. Si queris mas informacin de esto visitad el sitio de Microsoft ya que yo saque la informacin de cmo hacer esto de la librera de MSDN. El sitio es el Siguiente: http://msdn.microsoft.com/library/default.asp?url=/library/en-us/wmisdk/wmi/win32_registry.asp Si el enlace hubiera cambiado de direccin, realizar una Bsqueda indicando Win32_Registry y lo encontrareis. Sin mucho mas que decir pasaremos al ejemplo: El cdigo del Formulario ( Form1 ) es el siguiente:

http://www.elguille.info/colabora/vb2005/PolFlo_Acceder_Registro_WMI.htm

05/03/2008

Colabora: Acceder al Registro por WMI


Option Explicit Private Sub Command1_Click() ' Lo 1 antes de leer valores es asegurarnos de que los ' datos son correctos If Tipos.Text = vbNullString Then MsgBox "Elija el Parametro del Listado" Exit Sub End If Dim P As RegistryParameter Select Case Tipos.Text Case "hKeyLocalMachine" P = RegLocalMachine Case "hKeyCurrentUser" P = RegCurrentUser Case "hKeyUsers" P = RegUsers Case "hKeyCurrentConfig" P = RegCurrentConfig Case "hKeyDynData" P = RegDynData Case Else P = RegLocalMachine End Select ' Para Leer Valores lo 1 que tenemos que hacer es ' Crear 2 Variables de Tipos ' 1 Var de SubClaves Dim SubClaves As RegistryKeysList ' 2 Var de SubArboles Dim SubArboles As RegistrySubFolderKeysList ' y ahora pasamos a las Instrucciones ' Establecemos SubClaves SubClaves = Registry.ReadSubKeys(P, Nombre.Text) ' Establecemos SubArboles SubArboles = Registry.ReadSubFolders(P, Nombre.Text) Dim Man As Integer SubClavesList.Clear SubArbolesList.Clear ' Si hay SubClaves las ponemos en el Listado If SubClaves.Count > 0 Then ' Lo podemos hacer asi ' For Man = LBound(SubClaves.SubKey) _ ' To UBound(SubClaves.SubKey) ' Pero de esta manera es mas corto For Man = 0 To SubClaves.Count - 1 SubClavesList.AddItem _ SubClaves.SubKey(Man).NameKey Next End If ' Si hay SubArboles los ponemos en el Listado If SubArboles.Count > 0 Then ' Lo podemos hacer asi ' For Man = LBound(SubArboles.SubKey) _ ' To UBound(SubArboles.SubKey) ' Pero de esta manera es mas corto For Man = 0 To SubArboles.Count - 1 SubArbolesList.AddItem SubArboles.SubFolderKey(Man) Next End If End Sub Private Sub Form_Load() ' Cuando se inicia la Aplicacion establecemos el tipo ' de Parametro hKeyLocalMachine Por defecto Tipos.Text = Tipos.List(0) End Sub

Pgina 2 de 7

Y ahora el cdigo del Modulo:

http://www.elguille.info/colabora/vb2005/PolFlo_Acceder_Registro_WMI.htm

05/03/2008

Colabora: Acceder al Registro por WMI


Option Explicit '************************************************************** ' Objeto Relacionado con los Valores del Registro ' ' ' ' ' ' By: Pol Florez Viciana '************************************************************** ' Constantes de Referencia a Numeros Private Const Cero = 0 Private Const Uno = 1 Private Const Dos = 2 Private Const Tres = 3 Private Const Cuatro = 4 Private Const Cinco = 5 Private Const Seis = 6 Private Const Siete = 7 Private Private Private Private Const Const Const Const DosPuntos As String * Barra As String * Uno Contrabarra As String Punto As String * Uno Uno = ":" = "/" * Uno = "\" = "."

Pgina 3 de 7

' Enumeracion de Parametros de Registro ' ( Inicio de Clave ) Public Enum RegistryParameter RegClassesRoot = &H80000000 RegCurrentUser = &H80000001 RegLocalMachine = &H80000002 RegUsers = &H80000003 RegCurrentConfig = &H80000005 RegDynData = &H80000006 End Enum ' Enumeracion de Tipos de Claves que se pueden Crear Public Enum RegistryKeyTypes RegSZ = Uno RegExpandSZ = Dos RegBINARY = Tres RegDWORD = Cuatro RegMultiSZ = Siete End Enum ' Tipo devuelto por la Funcion ReadSubKeys ' ( Es una Parte de lo que devuelve ) = 1 SubKey Public Type RegistryKey NameKey As String PathKey As String TypeKey As RegistryKeyTypes End Type ' Tipo devuelto por la Funcion ReadSubKeys Public Type RegistryKeysList SubKey() As RegistryKey ' Varias SubKeys Count As Integer ' Cuenta de SubKeys End Type ' Tipo Devuelto por la Funcion ReadSubFolders Public Type RegistrySubFolderKeysList SubFolderKey() As Variant SubFolderPath() As Variant Count As Integer End Type Public Function ReadSubKeys(RegParameter As RegistryParameter, _ ByVal RegKey As String) As RegistryKeysList ' Esta Funcion Devuelve un Array de Nombres ' de Subclaves de un Arbol del registro On Error Resume Next Dim ObjReg As Object Dim ArrStrings() As Variant Dim ArrTypes() As Variant Static Man As Integer, Tempo As String

http://www.elguille.info/colabora/vb2005/PolFlo_Acceder_Registro_WMI.htm

05/03/2008

Colabora: Acceder al Registro por WMI


' Accedemos a un Objeto de Registro definido en la WMI Set ObjReg = GetObject("winmgmts:" & _ "{impersonationLevel=impersonate}!\\" & _ ".\root\default:StdRegProv") ' Y llamamos a la Funcion EnumKey del Objeto ObjReg.EnumValues RegParameter, RegKey, _ ArrStrings, ArrTypes ' Si no hay SubClaves Salimos If UBound(ArrStrings) = Cero Then Exit Function ' De no ser asi establecemos los Valores a devolver ReadSubKeys.Count = UBound(ArrStrings) ReDim ReadSubKeys.SubKey(LBound(ArrStrings) To UBound(ArrStrings)) ' Ahora vamos estableciendo Valores Clave por Clave For Man = LBound(ArrStrings) To UBound(ArrStrings) ReadSubKeys.SubKey(Man).NameKey = ArrStrings(Man) ReadSubKeys.SubKey(Man).TypeKey = ArrTypes(Man) 'Tempo = ParameterNameKey(RegParameter) & _ ' Contrabarra & RegKey & _ ' Contrabarra & ReadSubKeys.SubKey(Man).NameKey 'ReadSubKeys.SubKey(Man).ValueKey = ReadKey(Tempo) Next ' Por Ultimo descargamos el Objeto Creado al Principio Set ObjReg = Nothing End Function Public Function ReadSubFolders(RegParameter As RegistryParameter, _ ByVal RegKey As String) _ As RegistrySubFolderKeysList ' Esta Funcion devuelve un Array de SubArboles de la ' Clave del Registro Indicada On Error Resume Next Dim ObjReg As Object Dim arrSubKeys As Variant Dim SubKey As Variant Dim Cuenta As Integer ' Accedemos a un Objeto de Registro definido en la WMI Set ObjReg = GetObject("winmgmts:" & _ "{impersonationLevel=impersonate}!\\" & _ ".\root\default:StdRegProv") ' Y llamamos a la Funcion EnumKey del Objeto ObjReg.EnumKey RegParameter, RegKey, arrSubKeys ' Contamos todos los Valores Devueltos del Array For Each SubKey In arrSubKeys If SubKey = vbNullString Then Exit For Cuenta = Cuenta + Uno Next ' Si Cuenta = 0 Salimos porque no hay valores en esa ' Clave de Registro If Cuenta = Cero Then Exit Function ' De no ser asi establecemos el valor de Count y ' redimensionamos el Array para ir estableciendo Valores ReadSubFolders.Count = Cuenta ReDim ReadSubFolders.SubFolderKey(Cero To Cuenta - Uno) ' A continuacion Leemos Valor por Valor y lo ' establecemos en el Array Cuenta = Cero For Each SubKey In arrSubKeys ReadSubFolders.SubFolderKey(Cuenta) = SubKey ReadSubFolders.SubFolderPath(Cuenta) = _ ParameterNameKey(RegParameter) & Contrabarra & _ RegKey & Contrabarra & SubKey Cuenta = Cuenta + Uno Next ' Por Ultimo descargamos el Objeto Creado al Principio Set ObjReg = Nothing End Function

Pgina 4 de 7

http://www.elguille.info/colabora/vb2005/PolFlo_Acceder_Registro_WMI.htm

05/03/2008

Colabora: Acceder al Registro por WMI


Public Function ExistKey(ByVal KeyPath As String) As Boolean ' Comprobar si existe una Clave en el Registro On Error Resume Next ' Devuelve un Variant Dim D As Variant Dim ObjRegistro As Object ' Creamos un Objeto de Registro Set ObjRegistro = CreateObject("WScript.Shell") ' y accedemos a su valor D = ObjRegistro.RegRead(KeyPath) ' Si hay un error es que la Clave no existe If Err.Number = Cero Then ExistKey = True Else Exit Function ' Descargamos el Objeto Set ObjRegistro = Nothing End Function Public Function ReadKey(ByVal KeyPath As String) As Variant ' Leer una Clave del Registro On Error Resume Next Dim ObjRegistro As Object ' Creamos un Objeto de Registro Set ObjRegistro = CreateObject("WScript.Shell") ' y accedemos a su valor para Devolverlo como Resultado ReadKey = ObjRegistro.RegRead(KeyPath) ' Descargamos el Objeto Set ObjRegistro = Nothing End Function Public Function DeleteKey(ByVal KeyPath As String) As ErrObject ' Eliminar una Clave del Registro On Error Resume Next Dim ObjRegistro As Object ' Creamos un Objeto de Registro Set ObjRegistro = CreateObject("WScript.Shell") ' y nos cargamos la Clave ( Exista o No ) ObjRegistro.RegDelete KeyPath ' Descargamos el Objeto Set ObjRegistro = Nothing ' Si ha havido algun error lo sabremos ya que devolvemos ' como parametro el error que hayamos encontrado Set DeleteKey = Err End Function Public Function CreateKey(KeyPath As String, _ KeyValue As Variant, _ RegType As RegistryKeyTypes) As ErrObject ' Crear una Nueva Clave en el Registro On Error Resume Next Dim D As String Dim ObjRegistro As Object ' Creamos un Objeto de Registro Set ObjRegistro = CreateObject("WScript.Shell") ' Miramos cual es el caso de RegType Select Case RegType Case RegBINARY D = "REG_BINARY" Case RegDWORD D = "REG_DWORD" Case RegSZ D = "REG_SZ" Case RegMultiSZ D = "REG_MULTI_SZ" Case RegExpandSZ D = "REG_EXPAND_SZ" End Select ' y ahora ponemos o Creamos la Clave en su sition

Pgina 5 de 7

http://www.elguille.info/colabora/vb2005/PolFlo_Acceder_Registro_WMI.htm

05/03/2008

Colabora: Acceder al Registro por WMI


ObjRegistro.RegWrite KeyPath, KeyValue, D ' Descargamos el Objeto Set ObjRegistro = Nothing ' si ha havido algun error lo sabremos porque ' lo devolvemos como valor Set CreateKey = Err End Function Public Function CreateFolderKey(KeyPath As String) As ErrObject ' Crear una Nueva Rama en el Registro On Error Resume Next Dim D As String Dim ObjRegistro As Object ' Creamos un Objeto de Registro Set ObjRegistro = CreateObject("WScript.Shell") ' examinamos si el nuevo Arbol finaliza en contrabarra = "\" If Right(KeyPath, Uno) = Contrabarra Then D = KeyPath Else D = KeyPath & Contrabarra End If ' para crear un arbol el RegType a de ser BINARY ObjRegistro.RegWrite D, Uno, "REG_BINARY" ' Descargamos el Objeto Set ObjRegistro = Nothing ' si ha havido algun error lo sabremos porque ' lo devolvemos como valor Set CreateFolderKey = Err End Function

Pgina 6 de 7

Public Function ParameterNameKey(RegParameterA As RegistryParameter) As String ' Esta funcion nos servira para saber el Nombre del Parametro ' en la que se establecera o leera el/la arbol/Clave If RegParameterA = RegClassesRoot Then ParameterNameKey = "HKEY_CLASSES_ROOT" Exit Function End If If RegParameterA = RegCurrentConfig Then ParameterNameKey = "HKEY_CURRENT_CONFIG" Exit Function End If If RegParameterA = RegCurrentUser Then ParameterNameKey = "HKEY_CURRENT_USER" Exit Function End If If RegParameterA = RegDynData Then ParameterNameKey = "HKEY_DYN_DATA" Exit Function End If If RegParameterA = RegLocalMachine Then ParameterNameKey = "HKEY_LOCAL_MACHINE" Exit Function End If If RegParameterA = RegUsers Then ParameterNameKey = "HKEY_USERS" Exit Function End If End Function

Seguro que este ejemplo le resuelve a mas de uno sus dudas.

http://www.elguille.info/colabora/vb2005/PolFlo_Acceder_Registro_WMI.htm

05/03/2008

Colabora: Acceder al Registro por WMI


Fichero con el cdigo de ejemplo: PolFlo_Acceder_al_Registro_por_WMI.zip - 4,74 KB

Pgina 7 de 7

http://www.elguille.info/colabora/vb2005/PolFlo_Acceder_Registro_WMI.htm

05/03/2008

Anda mungkin juga menyukai