Editar archivo de windows con VBS en W7

Iniciado por softer2, 16 Julio 2014, 04:50 AM

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

softer2

Buenas ando mirando codigos en VBS para editararchivos

En este caso especifico quisiera editar el archivo HOsts del windows

c:\windows\system32\drivers\etc\hosts


estuve leyendo y es con Set.FileSystemObject  ,

pero quisiera saber un codigo donde tenga el manifest , osea para que edite en Windows 7 alguna ayuda ?

Eleкtro

#1
Cita de: softer2 en 16 Julio 2014, 04:50 AMestuve leyendo y es con Set.FileSystemObject

FileSystemObject es un objeto:
http://msdn.microsoft.com/en-us/library/aa242706%28v=vs.60%29.aspx

El cual proporciona métodos para crear un archivo, escribir, etc... basicamente son métodos para llevar a cado tareas relacionadas con el FileSystem de Windows:
http://msdn.microsoft.com/en-us/library/6tkce7xa%28v=vs.84%29.aspx

Por lo tanto si, te sirve para la tarea, usando los métodos de escritura, ya que el archivo HOSTS no es más que un archivo de texto plano.

PD: Creo que deberías estudiar los conceptos básicos, la sintaxis del lenguaje, y demás, si realmente estás interesado en desarrollar códigos propios:
http://msdn.microsoft.com/en-us/library/0ad0dkea%28v=vs.84%29.aspx


Cita de: softer2 en 16 Julio 2014, 04:50 AMquisiera saber un codigo donde tenga el manifest, osea para que edite en Windows 7 alguna ayuda ?

No he entendido tu pregunta, no debes interactuar con ningún ".manifest" para editar un archivo de texto.

Respecto a proporcionarte un código, la verdad es que no se si buscas un set completo de edición que te permita eliminar, modificar, y añadir entradas, o que es lo que buscas exactamente, así que te haré dos ejemplos básicos:

Código (vb) [Seleccionar]
Sub AddEntry(ByVal Ip, Byval Alias)

    Const HostsFile  = "C:\Windows\System32\Drivers\etc\Hosts"
    Set   objHosts   = CreateObject("Scripting.FileSystemObject"). _
                       OpenTextFile(HostsFile, 8, True)

    objHosts.Writeline(vbNewLine & Ip & vbtab & Alias)
    objHosts.Close

End Sub


Código (vb) [Seleccionar]
Function GetAliases(ByVal Ip)

   Dim Aliases
   Const HostsFile  = "C:\Windows\System32\Drivers\etc\Hosts"
   Set   objHosts   = CreateObject("Scripting.FileSystemObject"). _
                      OpenTextFile(HostsFile, 1)

   Do Until objHosts.AtEndOfStream

       HostEntry = Split(Replace(objHosts.Readline, vbTab, " "), " ")
       HostIP    = Trim(HostEntry(0))
       HostAlias = Trim(HostEntry(1))

       On Error Resume Next
       
       If HostIP = Ip Then
           Aliases = Aliases & HostAlias & vbNewLine
       End If

   Loop

   objHosts.Close

   GetAliases = Split(Aliases, vbNewLine)

End Function


Ejemplos de uso:
Código (vb) [Seleccionar]
AddEntry("LOCALHOST", "www.test.com")
MsgBox(GetAliases("LOCALHOST")(0))


Saludos.

EDITO: Una Helper Class gigantesca con todos los métodos que puedas llegar a necesitar:
www.codeproject.com/Articles/11354/VBScript-for-reading-and-writing-to-the-Windows-ho








softer2

#2
Wauo muxas gracias por el codigo

NOse si me dejo explicar con eso del manifest , OSEA con archivos que estan en Windows se necesita elevar privilegios para poder modificar algun archivo ( en vb6 lo hacia con manifest)

y lo que si andaba queriendo exatamente era , que

1: Abrir el archivo hosts y borrar su contenido y poner mi contenido

o

2: Eliminar el archivo hosts y crear uno nuevo con el contenido especifico que quiera



EDITADO : osea a esto me refiero


Set objShell = CreateObject("Shell.Application")
   objShell.ShellExecute "wscript.exe", Chr(34) & WScript.ScriptFullName & Chr(34) & " RunAsAdministrator", "", "runas", 1




EL codigo ya esta en si .sube prvilegios , abre y añade 1 linea al archivo

Pero lo que quiero es borrar todo el contenido del archivo hosts y añadir recien mis lineas

espero se entienda

Eleкtro

#3
Cita de: softer2 en 16 Julio 2014, 19:50 PM
lo que quiero es borrar todo el contenido del archivo hosts y añadir recien mis lineas

Cuando instancies el objeto, asigna el valor correcto para el parámetro IOmode (ForWriting).
http://msdn.microsoft.com/en-us/library/314cz14s%28v=vs.84%29.aspx

Ejemplo:
Código (vb) [Seleccionar]
CreateObject("Scripting.FileSystemObject").OpenTextFile(HostsFile, 2, True)

Entonces, cuando uses el método Write/WriteLine, se reemplazará el contenido existente del archivo, y podrás seguír utilizando dicho método para continuar escribiendo, hasta que liberes el objeto con el método Close.

Ejemplo:
Código (vb) [Seleccionar]
Const HostsFile  = "C:\Windows\System32\Drivers\etc\Hosts"
Set objHosts     = CreateObject("Scripting.FileSystemObject"). _
                  OpenTextFile(HostsFile, 2, True)

With objHosts

   .Writeline(vbNewLine)
   .Writeline("127.0.0.1" & vbtab & "www.1.com")
   .Writeline("127.0.0.2" & vbtab & "www.2.com")
   .Writeline("127.0.0.3" & vbtab & "www.3.com")

   .Close

End With


Saludos.








softer2

#4
Execelente era lo que buscaba

gracias por tu ayuda


Adjuntando el codigo de elevar privilegios en W7 al script queda muybien

si funciona en W7 y W8 el problema es el sigiente

que tambien en Windows XP , al ejecutar el script tbm pide ejecutar como administrador


QUuisiera saber como hacer para que primero el script decte el S.O

Si es XP ejecutar el scrip sin elevarle privilegios

y si es Wvista o W7 o W8 ejecutar el script donde le subo privilegios ..


espero su ayuda , recien ando aprendiendo esto del VBS

Eleкtro

#5
Cita de: softer2 en 17 Julio 2014, 16:58 PMespero su ayuda , recien ando aprendiendo esto del VBS

Puedes hacer una query a WMI para obtener la versión NT del Windows operativo actual.

San-Google está lleno de ejemplos como este, y como este otro:

Código (vb) [Seleccionar]
Set dtmConvertedDate = CreateObject("WbemScripting.SWbemDateTime")
strComputer = "."
Set objWMIService = GetObject("winmgmts:{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
Set oss = objWMIService.ExecQuery ("Select * from Win32_OperatingSystem")

For Each os in oss
   Wscript.Echo "Caption: " & os.Caption
   Wscript.Echo "Version: " & os.Version
Next


+ List of Microsoft Windows versions

Así pues, si la versión NT empieza por "5.1" o "5.2", será XP, si empieza por "6.1" será Win7, y si empieza por "6.2" o "6.3" será Windows 8/8.1.

+ VBScript Left Function
Código (vb) [Seleccionar]
If Left(os.Version, 2) = "5.1" Then ...

PD: El nombre a mostrar del OS puede variar, pero la versión NT no, por eso te sugiero evitar parsear el Caption.

Saludos








softer2

Impresionante

MUxas gracias yo estaba buscando condicionales basado en la caption ya me estaba echando un mundo con if else if else por cada caption pero con la version ya seria mucho mas rapido y mucho mas seguro ya que cada pc tiene nombre distintos

gracias por la ayuda sos un capo