Hola
No se si @Elektro te responderá a si que a ver si este cambio te sirve.
(
no te servirá por la razón que verás más abajos - usas Net Framework anterior a 4.0-)
Dim ClaveRaíz As Microsoft.Win32.RegistryHive = Microsoft.Win32.RegistryHive.LocalMachine ' HKEY_LOCAL_MACHINE
' Crea un puntero de clave de Registro para HKEY_LOCAL_MACHINE en la máquina actual
Dim Clave = Microsoft.Win32.RegistryKey.OpenBaseKey(ClaveRaíz, Microsoft.Win32.RegistryView.Registry64) '<-- Para x64
Dim Dato As Byte() = New Byte() {&H43, &H61, &H63, &H61, &H72, &H72, &H75,
&H74, &H61, &H20, &H64, &H65, &H20, &H70,
&H6F, &H6C, &H6C, &H6F}
' Crea las claves y valores en la localización especificada
Using key As Microsoft.Win32.RegistryKey = Clave.CreateSubKey("SOFTWARE\CacarrutaDePollo\",
Microsoft.Win32.RegistryKeyPermissionCheck.ReadWriteSubTree)
key.SetValue("Valor_DWORD", 1, Microsoft.Win32.RegistryValueKind.DWord) 'Valor DWORD
key.SetValue("Valor_Binario", Dato, Microsoft.Win32.RegistryValueKind.Binary) 'Valor Binario
key.SetValue("Valor_String", "Hola mundo", Microsoft.Win32.RegistryValueKind.String) 'Valor String
End Using
OpenRemoteBaseKey es para un equipo remoto.
Dim Clave = Microsoft.Win32.RegistryKey.OpenRemoteBaseKey(ClaveRaíz, Environment.MachineName, RegistryView.Registry64) '<-- Para x64
Lo de que Microsoft.Win32 no está declarado es porque debes importar la clase primero.
Imports Microsoft.Win32
Public Class Form1
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
End Sub
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
Dim ClaveRaíz As RegistryHive = RegistryHive.LocalMachine ' HKEY_LOCAL_MACHINE
' Crea un puntero de clave de Registro para HKEY_LOCAL_MACHINE en la máquina actual
Dim Clave = RegistryKey.OpenBaseKey(ClaveRaíz, RegistryView.Registry64) '<-- Para x64
Dim Dato As Byte() = New Byte() {&H43, &H61, &H63, &H61, &H72, &H72, &H75,
&H74, &H61, &H20, &H64, &H65, &H20, &H70,
&H6F, &H6C, &H6C, &H6F}
' Crea las claves y valores en la localización especificada
Using key As RegistryKey = Clave.CreateSubKey("SOFTWARE\CacarrutaDePollo\",
RegistryKeyPermissionCheck.ReadWriteSubTree)
key.SetValue("Valor_DWORD", 1, RegistryValueKind.DWord) 'Valor DWORD
key.SetValue("Valor_Binario", Dato, RegistryValueKind.Binary) 'Valor Binario
key.SetValue("Valor_String", "Hola mundo", RegistryValueKind.String) 'Valor String
End Using
End Sub
End Class
O bien ponerlo como te lo he puesto yo
Dim ClaveRaíz As Microsoft.Win32.RegistryHive = Microsoft.Win32.RegistryHive.LocalMachine
...
He estado mirando la razón por la cual te aparece el error de que OpenBaseKey no es miembro de
Microsoft.Win32.RegistryKeyEso es debido a que estás usando .Net Framework anterior 4.0. Si usas Framework 3.5 por ejemplo solo dispones de la función
OpenRemoteBaseKey.
Usando Framework 3.5 lo he estado testando y puedes hacerlo de la siguiente manera usando
OpenRemoteBaseKey en lugar de OpenBaseKey:
Dim ClaveRaíz As Microsoft.Win32.RegistryHive = Microsoft.Win32.RegistryHive.LocalMachine ' HKEY_LOCAL_MACHINE
' Crea un puntero de clave de Registro para HKEY_LOCAL_MACHINE en la máquina actual
Dim Clave = Microsoft.Win32.RegistryKey.OpenRemoteBaseKey(ClaveRaíz,
Environment.MachineName) '<-- Para x64 '<-- Para x64
Dim Dato As Byte() = New Byte() {&H43, &H61, &H63, &H61, &H72, &H72, &H75,
&H74, &H61, &H20, &H64, &H65, &H20, &H70,
&H6F, &H6C, &H6C, &H6F}
Clave.CreateSubKey("SOFTWARE\CacarrutaDePollo").
SetValue("Valor_DWORD", 1, Microsoft.Win32.RegistryValueKind.DWord)
Clave.CreateSubKey("SOFTWARE\CacarrutaDePollo").
SetValue("Valor_Binario", Dato, Microsoft.Win32.RegistryValueKind.Binary)
Clave.CreateSubKey("SOFTWARE\CacarrutaDePollo").
SetValue("Valor_String", "Hola mundo", Microsoft.Win32.RegistryValueKind.String)
Clave.Close()
con Using;
Imports Microsoft.Win32
Public Class Form1
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
Dim ClaveRaíz As RegistryHive = RegistryHive.LocalMachine ' HKEY_LOCAL_MACHINE
' Crea un puntero de clave de Registro para HKEY_LOCAL_MACHINE en la máquina actual
Dim Clave = RegistryKey.OpenRemoteBaseKey(ClaveRaíz, Environment.MachineName) '<-- Para x64
Dim Dato As Byte() = New Byte() {&H43, &H61, &H63, &H61, &H72, &H72, &H75,
&H74, &H61, &H20, &H64, &H65, &H20, &H70,
&H6F, &H6C, &H6C, &H6F}
' Crea las claves y valores en la localización especificada
Using key As RegistryKey = Clave.CreateSubKey("SOFTWARE\CacarrutaDePollo\",
RegistryKeyPermissionCheck.ReadWriteSubTree)
key.SetValue("Valor_DWORD", 1, RegistryValueKind.DWord) 'Valor DWORD
key.SetValue("Valor_Binario", Dato, RegistryValueKind.Binary) 'Valor Binario
key.SetValue("Valor_String", "Hola mundo", RegistryValueKind.String) 'Valor String
End Using
End Sub
End Class
ACCESO AL REGISTRO MEDIANTE VBSCRIPTVBScript está obsoleto y como nos ha mostrado @Elektro Net dispone de funciones para acceder al registro. Sin embargo si lo prefieres puedes usar VBScript, que además es compatible con cualquier versión de Framework que uses incluso el 2.0.
La verdad es que quise hacerlo como lo hacía en VB6, per no funciona en modo
Option Sctrit en
ON. No encontré nada de nada por mucho que busqué, pero sí un método para poder ejecutar funciones de VBScript en Net y con Option Strict activado y con
System.Reflection.
Aplicando dicho método he creado el siguiente código:
Option Strict On
Imports System.Runtime.InteropServices
Imports System.Reflection
Public Class Form1
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
Dim Shell As Object = Nothing
Dim WSHType As Type = Type.GetTypeFromProgID("WScript.Shell")
If Not WSHType Is Nothing Then
Shell = Activator.CreateInstance(WSHType)
End If
If Not Shell Is Nothing Then
'Introduce un dato en el valor predeterminado de la clave
WSHType.InvokeMember("RegWrite", BindingFlags.InvokeMethod Or BindingFlags.Public Or BindingFlags.Instance, Nothing, Shell,
New String() {"HKEY_LOCAL_MACHINE\SOFTWARE\MiClave\", "Dato_Predeterminado", "REG_SZ"})
'Crea un Valor String
WSHType.InvokeMember("RegWrite", BindingFlags.InvokeMethod, Nothing, Shell,
New String() {"HKEY_LOCAL_MACHINE\SOFTWARE\MiClave\Valor_String",
"Hola mundo",
"REG_SZ"})
'Crea un Valor EXPAND
WSHType.InvokeMember("RegWrite", BindingFlags.InvokeMethod, Nothing, Shell,
New String() {"HKEY_LOCAL_MACHINE\SOFTWARE\MiClave\Valor_EXPAND",
"Hola mundo",
"REG_EXPAND_SZ"})
'Crea un valor DWORD
WSHType.InvokeMember("RegWrite", BindingFlags.InvokeMethod, Nothing, Shell,
New String() {"HKEY_LOCAL_MACHINE\SOFTWARE\MiClave\Valor_DWORD",
"25",
"REG_DWORD"})
Marshal.ReleaseComObject(Shell)
End If
End Sub
End Class
Sólo que no tengo muy claro que marcador de enlace usar. He usado
BindingFlags.InvokeMethod, podría usar BindingFlags.Public o BindingFlags.Instance, y muchos más.
Además se pueden combinar
WSHType.InvokeMember("RegWrite",
BindingFlags.InvokeMethod Or
BindingFlags.Public Or
BindingFlags.Instance, Nothing, Shell,
New String() {"HKEY_LOCAL_MACHINE\SOFTWARE\MiClave\Valor_String", "Hola mundo", "REG_SZ"})
El inconveniente son los datos binarios que sólo admite 4 valores "43 61 63 61" por ejemplo. Quizás si que se pueda añadir más, no se. La forma de escribir los datos binarios es extraña. Hay que invertir los valores y unirlos, formando un nuevo valor hexadecimal compuesto por los anteriores e invertido -->61636143. Luego hay que convertirlo a un valor decimal entero 1633902915 y este dato es el que se escribe en el registro, pero quedará registrado como "43 61 63 61".
Option Strict On
Imports System.Runtime.InteropServices
Imports System.Reflection
Public Class Form1
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
Dim Shell As Object = Nothing
Dim WSHType As Type = Type.GetTypeFromProgID("WScript.Shell")
If Not WSHType Is Nothing Then
Shell = Activator.CreateInstance(WSHType)
End If
If Not Shell Is Nothing Then
'Crea un valor Binario
Dim Dato As Byte() = New Byte() {&H43, &H61, &H63, &H61}
Dim InvertByte As String = Nothing
For N As Integer = 0 To 3
InvertByte = CStr(Conversion.Hex(Dato(N))) & InvertByte '&H61636143
Next N
Dim intValueBinary As Integer = Convert.ToInt32(InvertByte, 16) ' -->1633902915
WSHType.InvokeMember("RegWrite", BindingFlags.InvokeMethod, Nothing, Shell,
New Object() {"HKEY_LOCAL_MACHINE\SOFTWARE\MiClave\Valor_Binario",
intValueBinary,
"REG_BINARY"})
Marshal.ReleaseComObject(Shell)
End If
End Sub
End Class
Para leer usar RegRead
Dim Shell As Object = Nothing
Dim WSHType As Type = Type.GetTypeFromProgID("WScript.Shell")
If Not WSHType Is Nothing Then
Shell = Activator.CreateInstance(WSHType)
End If
If Not Shell Is Nothing Then
Try
MessageBox.Show(CStr(WSHType.InvokeMember("RegRead",
System.Reflection.BindingFlags.InvokeMethod,
Nothing,
Shell,
New String() {"HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProductName"})))
System.Runtime.InteropServices.Marshal.ReleaseComObject(Shell)
Catch ex As Exception
MessageBox.Show("no hay ningún valor")
End Try
End If
No hace falta decir que también se puede hacer, aunque innecesariamente, con funciones API,