[AYUDA] [VBS SCRIPT] Script para registro windows q no m funciona

Iniciado por Davigotchi, 1 Marzo 2020, 20:20 PM

0 Miembros y 1 Visitante están viendo este tema.

Davigotchi

Buenas tardes a todos:
He realizado un Script para modificar un valor del registro de Windows, se me hizo complicado por que la CADENA DEL REGISTRO donde se almacena el valor a modificar depende del usuario activo, asiq el Script no puede ser genérico, depende del SID del Usuario Actual.

Código (vb) [Seleccionar]

strComputer = "."
Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")

Dim USUARIO
Dim DOMINIO
Dim SID

Set objshell = createobject("wscript.shell")
USUARIO = objshell.expandenvironmentstrings("%USERNAME%")
DOMINIO = objshell.expandenvironmentstrings("%USERDOMAIN%")

Set objAccount = objWMIService.Get _
("Win32_UserAccount.Name='" & USUARIO & "',Domain='" & DOMINIO & "'")

SID = objAccount.SID

Msgbox objshell.expandenvironmentstrings(SID)

DIM CADENA
CADENA = objshell.expandenvironmentstrings("HKEY_USERS\"&SID&"\Software\Microsoft\Windows\CurrentVersion\BackgroundAccessApplications\GlobalUserDisabled")

Msgbox objshell.expandenvironmentstrings(CADENA)

On Error Resume Next

Set oShell = WScript.CreateObject("WScript.Shell")
dato = oShell.RegRead(CADENA)

Msgbox objshell.expandenvironmentstrings(dato)

Dim WshShell, bKey
Set WshShell = WScript.CreateObject("WScript.Shell")

IF Err.Number <> 0 THEN  'Ha ocurrido un error
 IF Err.Number = -2147024894 THEN
   WshShell.RegWrite "CADENA", 1, "REG_DWORD"
MsgBox ("Opcion 1")
 END IF
WScript.Quit
ELSE                     'Valor encontrado
 IF dato = 0 THEN  
 WshShell.RegWrite "CADENA", 1, "REG_DWORD"
 Msgbox("Opcion2")
 END IF
END IF

Msgbox("FIN")


En el código he puesto varios mensajes para ir viendo que todas las variables almacenan los datos correctos... pero las funciones de escribir en el Registro de Windows no me funcionan :( :(

Alguien sabría en que estoy fallando¿?

Muchas gracias por adelantado.

MCKSys Argentina

Hola!

No he probado el script, pero veo que al escribir no usas la variable, sinó una string con el nobre de la variable. Prueba cambiar lo siguiente:

Código (vb) [Seleccionar]
shShell.RegWrite "CADENA", 1, "REG_DWORD"

por

Código (vb) [Seleccionar]
shShell.RegWrite CADENA, 1, "REG_DWORD"

Saludos!
MCKSys Argentina

"Si piensas que algo está bien sólo porque todo el mundo lo cree, no estás pensando."


Davigotchi

Buenas tardes:

Si señor!!! Cuanta razón... ya funciona, fallo mio xD
Muchas gracias :) .
Pero ahora quiero después de ese IF montar otro pero no se en que fallo ahora :( ...

Código (vb) [Seleccionar]

strComputer = "."
Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")

Dim USUARIO
Dim DOMINIO
Dim SID

Set objshell = createobject("wscript.shell")
USUARIO = objshell.expandenvironmentstrings("%USERNAME%")
DOMINIO = objshell.expandenvironmentstrings("%USERDOMAIN%")

Set objAccount = objWMIService.Get _
("Win32_UserAccount.Name='" & USUARIO & "',Domain='" & DOMINIO & "'")

SID = objAccount.SID

Msgbox objshell.expandenvironmentstrings(SID)

DIM CADENA
CADENA = objshell.expandenvironmentstrings("HKEY_USERS\"&SID&"\Software\Microsoft\Windows\CurrentVersion\BackgroundAccessApplications\GlobalUserDisabled")

Msgbox objshell.expandenvironmentstrings(CADENA)

DIM CADENA2
CADENA2 = objshell.expandenvironmentstrings("HKEY_USERS\"&SID&"\Control Panel\International\User Profile\HttpAcceptLanguageOptOut")

Msgbox objshell.expandenvironmentstrings(CADENA2)

On Error Resume Next

Set oShell = WScript.CreateObject("WScript.Shell")
dato = oShell.RegRead(CADENA)

Msgbox objshell.expandenvironmentstrings(dato)

DIM WshShell
Set WshShell = WScript.CreateObject("WScript.Shell")

IF Err.Number <> 0 THEN  'Ha ocurrido un error
  IF Err.Number = -2147024894 THEN
    WshShell.RegWrite CADENA, 1, "REG_DWORD"
MsgBox ("Opcion 1")
  END IF
WScript.Quit
ELSE                     'Valor encontrado
  IF dato = 0 THEN   
  WshShell.RegWrite CADENA, 1, "REG_DWORD"
  Msgbox("Opcion2")
  END IF
END IF

DIM WshShell2
Set oShell = WScript.CreateObject("WScript.Shell")
dato2 = oShell.RegRead(CADENA)

Msgbox objshell.expandenvironmentstrings(dato2)

Set WshShell2 = WScript.CreateObject("WScript.Shell")

IF Err.Number <> 0 THEN  'Ha ocurrido un error
  IF Err.Number = -2147024894 THEN
    WshShell2.RegWrite CADENA2, 1, "REG_DWORD"
MsgBox ("Opcion 1_2")
  END IF
WScript.Quit
ELSE                     'Valor encontrado
  IF dato2 = 0 THEN   
  WshShell2.RegWrite CADENA2, 1, "REG_DWORD"
  Msgbox("Opcion2_2")
  END IF
END IF


Msgbox("FIN")


Derspues de este comando:
Msgbox objshell.expandenvironmentstrings(dato2)
Me muestra el valor correspondiente pero no se ejecuta nada más... pasa directamente al mensaje:
Msgbox("FIN")

Alguien sabe que se me está pasando¿?

Gracias de nuevo. ;)

Serapis

Citar
CADENA = objshell.expandenvironmentstrings("HKEY_USERS\"&SID&"\Software\Microsoft\Windows\CurrentVersion\BackgroundAccessApplications\GlobalUserDisabled")

CADENA2 = objshell.expandenvironmentstrings("HKEY_USERS\"&SID&"\Control Panel\International\User Profile\HttpAcceptLanguageOptOut")

Tienes mal formadas las cadenas...
Las cadenas se concatenan con ' & ', es decir debe haber un espacio a ambos lados del ampersand (no he probado, nada simplemente viendo ese error de sintaxis y debajo un 'on error resume next', no he mirado nada más).

El tratamiento de errores, no debe ser así. Se pone cuando se cree posible que pueda suceder un error y tras la instrucción que cabría haber un errror se le interroga: If err.number <> 0 .... es decir se pone justo delante de donde cree que podría darse un error y en tal caso estás obligado a preguntarle inmediatamente después, si no para qué ponerlo???... tampoco tiene sentido ponerlo en otro sitio si se espera que un error pueda suceder en la línea x, debe preceder a la línea x... indistintamente de que tú luego cometas otros errores. Además errores de sintaxis, no son correctos que lleven un tratamiento de error, para eso está el IDE, si no el código no tendría fin, porque con cada variable se puede cometer errores.


Parece que la gente prefiere usar el bloc de notas, a causa de las idioteces de las películas...: Aunque estés operando con VBScript, usa el IDE de VB6, para editar tus scripts...
Simplemente abre un proyecto, elimina el formulario, añade un módulo escribe una función "Sub Main", escribe dentro tu código, en propiedades del proyecto dile que arranca desde 'Main'...
...y así podrás probar tus scripts si funcionan o no, como mínimo te marcará errores tontos como este con la sintaxis... y cuando algo falle, ejecutas paso a paso (tecla de función 'F8')... el debugger de VB6 es muy potente... Y una vez que esté correcto, ya lo guardas donde quieras...

en la imagen se ve la ayuda y una de las 'cadena's corregidas...

Davigotchi

Buenos días:

Muchisimas gracias por tus consejos :) ya los estoy aplicando ;) .

Finalmente ya me funciona solamente tenía mal la llamada a una variable en el último IF ya q llamaba a CADENA cuando tendría que llamar a CADENA2, un fallo tonto.

Muchas gracias nuevamente, poco a poco gracias a todos vosotros estoy aprendiendo un poco de este mundo xD .