elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Usando Git para manipular el directorio de trabajo, el índice y commits (segunda parte)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  .NET (C#, VB.NET, ASP) (Moderador: kub0x)
| | | |-+  Modificar registro de windows a 64 bits
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Modificar registro de windows a 64 bits  (Leído 6,799 veces)
Tomas1982

Desconectado Desconectado

Mensajes: 48



Ver Perfil
Modificar registro de windows a 64 bits
« en: 5 Enero 2017, 19:54 pm »

Estoy tratando de modificar una clave de registro en windows 10 64b,

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Windows

pero la que me modifica es esta otra

HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows
NT\CurrentVersion\Windows

como pudiera solucionar este problema
Este es el código
Código
  1. My.Computer.Registry.SetValue("HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Windows", "Spooler", "no,")
  2.  

Saludos y gracias ante todo...


En línea

okik


Desconectado Desconectado

Mensajes: 462


Ver Perfil
Re: Modificar registro de windows a 64 bits
« Respuesta #1 en: 6 Enero 2017, 08:26 am »

Tienes que compilar el programa como aplicación de 64bits.

Supongo que lo debes tener en AnyCPU, pues lo cambias a x64.




En propiedades del proyecto, ves a 'COMPILAR' o 'BUILD' en inglés y luego en CPU selecciona x64


por cierto, deberías quitar la coma en "no,"



Por curiosidad ¿Para qué este cambio? ¿para que és "Spooler"?

Código:
My.Computer.Registry.SetValue("HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Windows", "Spooler", "no")



« Última modificación: 6 Enero 2017, 08:37 am por okik » En línea

Eleкtro
Ex-Staff
*
Desconectado Desconectado

Mensajes: 9.788



Ver Perfil
Re: Modificar registro de windows a 64 bits
« Respuesta #2 en: 7 Enero 2017, 01:15 am »

Hola.

En realidad no es necesario que modifiques las propiedades de tu proyecto para compilarlo explicitamente a arquitectura de 64 Bits, puedes seguir compilando a modo neutral ("AnyCPU", con o sin preferencia por 32 Bits) o incluso a arquitectura x86. Simplemente debes dejar de utilizar los métodos de la infraestructura My, ya que son miembros con limitaciones, destinados a ser usados para tareas básicas que no requieran un control avanzado.

En su lugar, puedes usar la class Microsoft.Win32.RegistryKey, en la que podrás especificar el modo de representación del registro (32/64 Bit):

Código
  1. Dim root As RegistryHive = RegistryHive.LocalMachine
  2. Dim subkey As String = "SOFTWARE\Microsoft\Windows NT\CurrentVersion\Windows"
  3. Dim value As String = "spooler"
  4. Dim data As String = "no"
  5.  
  6. Using key As RegistryKey = RegistryKey.OpenBaseKey(root, RegistryView.Registry64)
  7.    key.CreateSubKey(subkey, RegistryKeyPermissionCheck.ReadWriteSubTree).
  8.        SetValue(value, data, RegistryValueKind.String)
  9. End Using

Si en el algoritmo de arriba modificas RegistryView.Registry64 por RegistryView.Registry32, entonces escribirá el valor en la clave HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\Windows NT\CurrentVersion\Windows. Teoricamente esto que acabo de decir no debería tener ningú efecto si inicias el executable compilado bajo un Windows de 32 Bits, me refiero, elijas el modo/visor que elijas el valor siempre se debería escribir en la clave HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Windows bajo un Windows de 32 Bits.

Saludos!



Por curiosidad ¿Para qué este cambio? ¿para que és "Spooler"?

El término spooler suele hacer referencia a la cola de impresión de la impresora, eso debería dar una pista junto al valor asignable yes/no. Yo tampoco se exactamente para que sirve ese cambio, no lo he buscado (seguro que habrá miles de resultados en Google xD), pero supongo que servirá para simular que no haya impresora conectada, o algo relacionado.

Saludos!
« Última modificación: 7 Enero 2017, 01:41 am por Eleкtro » En línea

okik


Desconectado Desconectado

Mensajes: 462


Ver Perfil
Re: Modificar registro de windows a 64 bits
« Respuesta #3 en: 7 Enero 2017, 16:07 pm »

En realidad no es necesario que modifiques las propiedades de tu proyecto para compilarlo explicitamente a arquitectura de 64 Bits

Respetando las formas del usuario que ha usado My, en tal caso debe compilar como x64. Que tras probar su ejemplo comprobé que era por eso, por compilar como AnyCPU. En realidad, esa es la razón por la cual  se modifica esta clave

HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows
NT\CurrentVersion\Windows

y no esta otra

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Windows

como  pregunta @Tomas1982

El término spooler suele hacer referencia a la cola de impresión de la impresora, eso debería dar una pista junto al valor asignable yes/no. Yo tampoco se exactamente para que sirve ese cambio, no lo he buscado (seguro que habrá miles de resultados en Google xD), pero supongo que servirá para simular que no haya impresora conectada, o algo relacionado.

Sí, lo busqué en Google, pero lo que he encontrado efectivamente hace referencia a la cola de impresión, como dices, pero me sale en otros puntos de registro sin el valor "spooler" y no en [..\CurrentVersion\Windows], además de hacer referencias a servicios de impresora. Por defecto está en Yes, pero vamos, ni idea de para qué.

El servicio de cola de impresión se llama Spooler, y el proceso del servicio es [C:\Windows\System32\spoolsv.exe]. Tras deshabilitar este servicio el valor seguía en YES. Así que probé con gpedit.msc, estuve habilitando y deshabilitando valores relacionados con la impresión y el registro no cambiaba el valor.



En línea

Tomas1982

Desconectado Desconectado

Mensajes: 48



Ver Perfil
Re: Modificar registro de windows a 64 bits
« Respuesta #4 en: 8 Enero 2017, 00:29 am »

OkiK:  Lo que me recomendaste me pincho elegante, pero estuve viendo la opción que propone Elektro y me parece que me va mejor.

Pregunto: esta variante me permitiera con un if utilizar  RegistryView.Registry64 o RegistryView.Registry32 en dependencia del SO 32 o 64.

En cuanto al ejemplo que pone Elektro me da 2 errors 

RegistryKey.OpenBaseKey Me dice que no es un miembro de Microsoft.Win32.RegistryKey y
(root, RegistryView.Registry64) Me dice que no esta declarado.   
En línea

okik


Desconectado Desconectado

Mensajes: 462


Ver Perfil
Re: Modificar registro de windows a 64 bits
« Respuesta #5 en: 8 Enero 2017, 15:51 pm »

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-)


Código
  1.             Dim ClaveRaíz As Microsoft.Win32.RegistryHive = Microsoft.Win32.RegistryHive.LocalMachine    ' HKEY_LOCAL_MACHINE
  2.        ' Crea un puntero de clave de Registro para HKEY_LOCAL_MACHINE en la máquina actual
  3.        Dim Clave = Microsoft.Win32.RegistryKey.OpenBaseKey(ClaveRaíz, Microsoft.Win32.RegistryView.Registry64) '<-- Para x64
  4.  
  5.  
  6.        Dim Dato As Byte() = New Byte() {&H43, &H61, &H63, &H61, &H72, &H72, &H75,
  7.                         &H74, &H61, &H20, &H64, &H65, &H20, &H70,
  8.                         &H6F, &H6C, &H6C, &H6F}
  9.  
  10.        ' Crea las claves y valores en la localización especificada
  11.        Using key As Microsoft.Win32.RegistryKey = Clave.CreateSubKey("SOFTWARE\CacarrutaDePollo\",
  12.                                                      Microsoft.Win32.RegistryKeyPermissionCheck.ReadWriteSubTree)
  13.  
  14.            key.SetValue("Valor_DWORD", 1, Microsoft.Win32.RegistryValueKind.DWord) 'Valor DWORD
  15.            key.SetValue("Valor_Binario", Dato, Microsoft.Win32.RegistryValueKind.Binary) 'Valor Binario
  16.            key.SetValue("Valor_String", "Hola mundo", Microsoft.Win32.RegistryValueKind.String) 'Valor String
  17.        End Using
  18.  
  19.  


OpenRemoteBaseKey es para un equipo remoto.
Código
  1.    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.

Código:
Imports  Microsoft.Win32


Código
  1. Imports Microsoft.Win32
  2.  
  3. Public Class Form1
  4.  
  5.    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
  6.    End Sub
  7.  
  8.    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
  9.        Dim ClaveRaíz As RegistryHive = RegistryHive.LocalMachine    ' HKEY_LOCAL_MACHINE
  10.        ' Crea un puntero de clave de Registro para HKEY_LOCAL_MACHINE en la máquina actual
  11.        Dim Clave = RegistryKey.OpenBaseKey(ClaveRaíz, RegistryView.Registry64) '<-- Para x64
  12.  
  13.  
  14.        Dim Dato As Byte() = New Byte() {&H43, &H61, &H63, &H61, &H72, &H72, &H75,
  15.                         &H74, &H61, &H20, &H64, &H65, &H20, &H70,
  16.                         &H6F, &H6C, &H6C, &H6F}
  17.  
  18.        ' Crea las claves y valores en la localización especificada
  19.        Using key As RegistryKey = Clave.CreateSubKey("SOFTWARE\CacarrutaDePollo\",
  20.                                                      RegistryKeyPermissionCheck.ReadWriteSubTree)
  21.  
  22.            key.SetValue("Valor_DWORD", 1, RegistryValueKind.DWord) 'Valor DWORD
  23.            key.SetValue("Valor_Binario", Dato, RegistryValueKind.Binary) 'Valor Binario
  24.            key.SetValue("Valor_String", "Hola mundo", RegistryValueKind.String) 'Valor String
  25.        End Using
  26.    End Sub
  27.  
  28. End Class
  29.  

O bien ponerlo como te lo he puesto yo
Código
  1.                Dim ClaveRaíz As Microsoft.Win32.RegistryHive = Microsoft.Win32.RegistryHive.LocalMachine
  2. ...



He estado mirando la razón por la cual te aparece el error de que OpenBaseKey no es miembro de Microsoft.Win32.RegistryKey

Eso 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:


Código
  1.  
  2.        Dim ClaveRaíz As Microsoft.Win32.RegistryHive = Microsoft.Win32.RegistryHive.LocalMachine    ' HKEY_LOCAL_MACHINE
  3.        ' Crea un puntero de clave de Registro para HKEY_LOCAL_MACHINE en la máquina actual
  4.        Dim Clave = Microsoft.Win32.RegistryKey.OpenRemoteBaseKey(ClaveRaíz,
  5.                                                                  Environment.MachineName) '<-- Para x64 '<-- Para x64
  6.  
  7.  
  8.        Dim Dato As Byte() = New Byte() {&H43, &H61, &H63, &H61, &H72, &H72, &H75,
  9.                         &H74, &H61, &H20, &H64, &H65, &H20, &H70,
  10.                         &H6F, &H6C, &H6C, &H6F}
  11.  
  12.        Clave.CreateSubKey("SOFTWARE\CacarrutaDePollo").
  13.            SetValue("Valor_DWORD", 1, Microsoft.Win32.RegistryValueKind.DWord)
  14.  
  15.        Clave.CreateSubKey("SOFTWARE\CacarrutaDePollo").
  16.            SetValue("Valor_Binario", Dato, Microsoft.Win32.RegistryValueKind.Binary)
  17.  
  18.        Clave.CreateSubKey("SOFTWARE\CacarrutaDePollo").
  19.            SetValue("Valor_String", "Hola mundo", Microsoft.Win32.RegistryValueKind.String)
  20.  
  21.       Clave.Close()
  22.  
  23.  

con Using;

Código
  1. Imports Microsoft.Win32
  2.  
  3. Public Class Form1
  4.    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
  5.   Dim ClaveRaíz As RegistryHive = RegistryHive.LocalMachine    ' HKEY_LOCAL_MACHINE
  6.        ' Crea un puntero de clave de Registro para HKEY_LOCAL_MACHINE en la máquina actual
  7.        Dim Clave = RegistryKey.OpenRemoteBaseKey(ClaveRaíz, Environment.MachineName) '<-- Para x64
  8.        Dim Dato As Byte() = New Byte() {&H43, &H61, &H63, &H61, &H72, &H72, &H75,
  9.                         &H74, &H61, &H20, &H64, &H65, &H20, &H70,
  10.                         &H6F, &H6C, &H6C, &H6F}
  11.  
  12.        ' Crea las claves y valores en la localización especificada
  13.        Using key As RegistryKey = Clave.CreateSubKey("SOFTWARE\CacarrutaDePollo\",
  14.                                                      RegistryKeyPermissionCheck.ReadWriteSubTree)
  15.  
  16.            key.SetValue("Valor_DWORD", 1, RegistryValueKind.DWord) 'Valor DWORD
  17.            key.SetValue("Valor_Binario", Dato, RegistryValueKind.Binary) 'Valor Binario
  18.            key.SetValue("Valor_String", "Hola mundo", RegistryValueKind.String) 'Valor String
  19.        End Using
  20.  
  21.  End Sub
  22.  End Class



ACCESO AL REGISTRO MEDIANTE VBSCRIPT

VBScript 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:

Código
  1. Option Strict On
  2.  
  3. Imports System.Runtime.InteropServices
  4. Imports System.Reflection
  5.  
  6. Public Class Form1
  7.    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
  8.        Dim Shell As Object = Nothing
  9.        Dim WSHType As Type = Type.GetTypeFromProgID("WScript.Shell")
  10.        If Not WSHType Is Nothing Then
  11.            Shell = Activator.CreateInstance(WSHType)
  12.        End If
  13.        If Not Shell Is Nothing Then
  14.            'Introduce un dato en el valor predeterminado de la clave
  15.            WSHType.InvokeMember("RegWrite", BindingFlags.InvokeMethod Or BindingFlags.Public Or BindingFlags.Instance, Nothing, Shell,
  16.   New String() {"HKEY_LOCAL_MACHINE\SOFTWARE\MiClave\", "Dato_Predeterminado", "REG_SZ"})
  17.  
  18.            'Crea un Valor String
  19.            WSHType.InvokeMember("RegWrite", BindingFlags.InvokeMethod, Nothing, Shell,
  20.                                 New String() {"HKEY_LOCAL_MACHINE\SOFTWARE\MiClave\Valor_String",
  21.                                  "Hola mundo",
  22.                                  "REG_SZ"})
  23.  
  24.            'Crea un Valor EXPAND
  25.            WSHType.InvokeMember("RegWrite", BindingFlags.InvokeMethod, Nothing, Shell,
  26.            New String() {"HKEY_LOCAL_MACHINE\SOFTWARE\MiClave\Valor_EXPAND",
  27.              "Hola mundo",
  28.              "REG_EXPAND_SZ"})
  29.  
  30.            'Crea un valor DWORD
  31.            WSHType.InvokeMember("RegWrite", BindingFlags.InvokeMethod, Nothing, Shell,
  32.               New String() {"HKEY_LOCAL_MACHINE\SOFTWARE\MiClave\Valor_DWORD",
  33.                 "25",
  34.                 "REG_DWORD"})
  35.  
  36.            Marshal.ReleaseComObject(Shell)
  37.        End If
  38.  
  39.  
  40.    End Sub
  41. End Class
  42.  


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

Código
  1.            WSHType.InvokeMember("RegWrite",
  2.                                 BindingFlags.InvokeMethod Or
  3.                                 BindingFlags.Public Or
  4.                                 BindingFlags.Instance, Nothing, Shell,
  5.        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".

Código
  1. Option Strict On
  2.  
  3. Imports System.Runtime.InteropServices
  4. Imports System.Reflection
  5.  
  6. Public Class Form1
  7.    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
  8.        Dim Shell As Object = Nothing
  9.        Dim WSHType As Type = Type.GetTypeFromProgID("WScript.Shell")
  10.        If Not WSHType Is Nothing Then
  11.            Shell = Activator.CreateInstance(WSHType)
  12.        End If
  13.        If Not Shell Is Nothing Then
  14.            'Crea un valor Binario
  15.            Dim Dato As Byte() = New Byte() {&H43, &H61, &H63, &H61}
  16.            Dim InvertByte As String = Nothing
  17.            For N As Integer = 0 To 3
  18.                InvertByte = CStr(Conversion.Hex(Dato(N))) & InvertByte '&H61636143
  19.            Next N
  20.  
  21.            Dim intValueBinary As Integer = Convert.ToInt32(InvertByte, 16) ' -->1633902915
  22.            WSHType.InvokeMember("RegWrite", BindingFlags.InvokeMethod, Nothing, Shell,
  23.               New Object()  {"HKEY_LOCAL_MACHINE\SOFTWARE\MiClave\Valor_Binario",
  24.                 intValueBinary,
  25.                 "REG_BINARY"})
  26.  
  27.            Marshal.ReleaseComObject(Shell)
  28.  
  29.        End If
  30.    End Sub
  31. End Class
  32.  


Para leer usar RegRead

Código
  1.  
  2.     Dim Shell As Object = Nothing
  3.        Dim WSHType As Type = Type.GetTypeFromProgID("WScript.Shell")
  4.        If Not WSHType Is Nothing Then
  5.            Shell = Activator.CreateInstance(WSHType)
  6.        End If
  7.        If Not Shell Is Nothing Then
  8.            Try
  9.                MessageBox.Show(CStr(WSHType.InvokeMember("RegRead",
  10.                                                          System.Reflection.BindingFlags.InvokeMethod,
  11.                                                          Nothing,
  12.                                                          Shell,
  13.                       New String() {"HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProductName"})))
  14.                System.Runtime.InteropServices.Marshal.ReleaseComObject(Shell)
  15.            Catch ex As Exception
  16.                MessageBox.Show("no hay ningún valor")
  17.            End Try
  18.        End If
  19.  
  20.  



No hace falta  decir que también se puede hacer, aunque innecesariamente, con funciones API,

« Última modificación: 9 Enero 2017, 10:59 am por okik » En línea

Tomas1982

Desconectado Desconectado

Mensajes: 48



Ver Perfil
Re: Modificar registro de windows a 64 bits
« Respuesta #6 en: 12 Enero 2017, 21:15 pm »

Mi hermano me resulto de mucho lo que me facilitaste.
En línea

okik


Desconectado Desconectado

Mensajes: 462


Ver Perfil
Re: Modificar registro de windows a 64 bits
« Respuesta #7 en: 13 Enero 2017, 14:19 pm »

Se me ha olvidado comentar que con VBScript para modificar claves protegidas hay que cambiar a X64 en 64bits como comenté en un principio. Por ejemplo si se quiere añadir un valor a:

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion

De lo contrario se creará en:

HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows NT\CurrentVersion


Si no se quiere hacer esto pues hay que hacer lo que comentó @Elektro y usar
la clase Microsoft.Win32. A no ser que alguien conozca alguna forma, yo he estado probando sin éxito.


chau
En línea

Eleкtro
Ex-Staff
*
Desconectado Desconectado

Mensajes: 9.788



Ver Perfil
Re: Modificar registro de windows a 64 bits
« Respuesta #8 en: 15 Enero 2017, 04:16 am »

Respetando las formas del usuario que ha usado My, en tal caso debe compilar como x64. Que tras probar su ejemplo comprobé que era por eso, por compilar como AnyCPU.

Hola.

Pero vamos a ver, ¿yo hablo en Chino y no se me entiende?, jeje  :P. Como ya mencioné, los miembros de My.Computer.Registry son limitados, poco o nada personalizables, motivo por el cual esa metodología no funcionará;
una solución sería reemplazar su uso por la class Microsoft.Win32.RegistryKey, metodología que si funcionará indiferentemente de la arquitectura del ensamblado... siempre y cuando se le especifique apropiadamente el visor del registro como en el primer ejemplo que ya proporcioné en mi primer comentario. Ahí dejé un código perfectamente funcional, deberías probarlo antes de desconfiar, descartar y/o criticar que sea un código capaz de resolver el problema... macho.



ACCESO AL REGISTRO MEDIANTE VBSCRIPT

Disculpa por la siguiente corrección que voy a hacerte Okik, de verdad no lo hago a mala fe como si estuviese molestado por lo que he comentado arriba ni nada parecido, solo que considero que esto que voy a decir puede servir de ayuda para que un programador pueda aprender a diferenciar correctamente lo que está haciendo y así esa persona pueda hablar con la propiedad de la palabra en el futuro:

Ese bloque de código que has proporcionado no es VBScript, es VB.NET, ya que para elaborar el código estás usando el lenguaje VB.NET, estás compilando bajo .NET Framework, y estás corriendo código .NET administrado, excepto por que estás creando una instancia de un objeto COM, "WScript.Shell" (código no administrado), pero esto no convierte ese bloque de código en algo que se le pueda llamar VBS, más que nada por que ese código en VBS no lo puedes compilar, ni tampoco estás hibridando el código .NET con VBS, sino que simplemente estás usando un objeto COM que estamos acostumbrados a ver y utilizar en VBS, pero nada más, y esto es una diferencia muy importante.



@Tomas1982

Me he perdido en el hilo y ya no tengo demasiado claro si sigues teniendo algún problema o no, puesto que el compañero Okik parece que ya te resolvió todas o casi todas las dudas. Si falta algo por aclarar le echaré un ojo a este hilo de vez en cuando.

En general te diré que para utilizar ciertos miembros y classes, primero y según las circunstancias deberás añadir una referencia al ensamblado correspondiente (en el explorador de soluciones click derecho en donde pone "Referencias" > "Añadir Referencia" y entonces eliges el archivo.dll), y segunda y opcionálmente puedes utilizar la sentencia Imports (using en C#) para importar el espacio de nombres que contiene esa class y/o también para crear un Alias y así acortar el nombre, por ejemplo:

Código
  1. Imports Microsoft.Win32
  2. Imports Reg = Microsoft.Win32.Registry
  3.  
  4. Public Class Class1
  5.  
  6.    ' Simplemente te muestro tres maneras de hacer lo mismo:
  7.    Sub Method()
  8.        Microsoft.Win32.Registry.SetValue(...) ' Especificando el espacio de nombres completo.
  9.        Registry.SetValue(...) ' Especificando solamente el nombre de la clase.
  10.        Reg.SetValue(...) ' Especificando el Alias.
  11.    End Sub
  12.  
  13. End Class

Dicho esto, cabe mencionar que algunos miembros solo están disponibles en las versiones más actuales de .NET Framework. Si te encuentras con un problema que consiste en que para poder importar una class y/o utilizar uno de sus miembros necesitas usar la versión 4.0 (o superior) de .NET Framework, entonces simplemente hazlo a menos que exista algún buen motivo que te impida hacerlo, ya que esa es la linea recta y más directa para resolver el problema, de lo contrario, si no haces eso, te encontrarás con la ineludible necesidad de buscar tediosas alternativas poco "naturales" como puedes comprobar en la investigación del compañero Okik con las alternatvas que te proporcionó (me refiero, eso es lo que uno puede tratar de hacer si uno no está dispuesto a compilar para .NET Framework 4.0), cuando simplemente podrías modificar el framework objetivo en las propiedades de tu proyecto a .NetFx 4.0 o superior y así ponerle una solución mucho más sencilla y amistosa al problema actual.

¡Un saludo a los dos!
« Última modificación: 15 Enero 2017, 04:42 am por Eleкtro » En línea

okik


Desconectado Desconectado

Mensajes: 462


Ver Perfil
Re: Modificar registro de windows a 64 bits
« Respuesta #9 en: 15 Enero 2017, 11:37 am »


Disculpa por la siguiente corrección que voy a hacerte Okik, de verdad no lo hago a mala fe como si estuviese molestado por lo que he comentado arriba ni nada parecido, solo que considero que esto que voy a decir puede servir de ayuda para que un programador pueda aprender a diferenciar correctamente lo que está haciendo y así esa persona pueda hablar con la propiedad de la palabra en el futuro:

Ese bloque de código que has proporcionado no es VBScript, es VB.NET, ya que para elaborar el código estás usando el lenguaje VB.NET, estás compilando bajo .NET Framework, y estás corriendo código .NET administrado, excepto por que estás creando una instancia de un objeto COM, "WScript.Shell" (código no administrado), pero esto no convierte ese bloque de código en algo que se le pueda llamar VBS, más que nada por que ese código en VBS no lo puedes compilar, ni tampoco estás hibridando el código .NET con VBS, sino que simplemente estás usando un objeto COM que estamos acostumbrados a ver y utilizar en VBS, pero nada más, y esto es una diferencia muy importante.



Sea como fuere es una forma de correr VBS en NET y compatible con Option Strict ON. No se cual es el problema, ni a que viene la corrección, si es que eso es una corrección. Claro, convierto una sentencia VBScript  en un objeto ¿y qué? ¿Cual es el problema? ¿qué hay que corregir?

Ya expliqué que de forma clásica, es decir como en VB6 no era compatible con Optin Sctrict ON y que encontré la forma de hacerlo de otra manera ¿Cuál es el problema?

Es una forma de correr esto:
Código
  1. Option Strict Off
  2. ...
  3.  
  4. Set WSH = CreateObject("Wscript.Shell")
  5. x = WSH.RegWrite("HKEY_LOCAL_MACHINE\Software\Prueba\", "Dato", "REG_SZ")



WshShell Object

chau
« Última modificación: 15 Enero 2017, 22:51 pm por okik » En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
modificar registro de windows
.NET (C#, VB.NET, ASP)
Takel 2 7,331 Último mensaje 8 Noviembre 2007, 15:26 pm
por Takel
Modificar el registro de windows
Programación Visual Basic
kr00s 4 7,768 Último mensaje 21 Agosto 2009, 06:34 am
por kr00s
no puedo modificar una clave de registro en windows 7
Windows
dexter00x 6 20,123 Último mensaje 12 Abril 2011, 17:00 pm
por dexter00x
Modificar una clave del registro windows con archivo reg
Windows
Esgrimidor 0 2,074 Último mensaje 30 Junio 2012, 20:28 pm
por Esgrimidor
Modificar de manera silenciosa o sin la intervención del usurario el registro de Windows, mediante un SCRIP
Scripting
Luish@o 6 5,179 Último mensaje 3 Septiembre 2021, 17:54 pm
por Luish@o
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines