elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.
 
Inicio Ayuda Buscar Ingresar Registrarse
29 Mayo 2012, 09:13  


Tema destacado: ¿Eres nuevo? ¿Tienes dudas acerca del funcionamiento de la comunidad? Lee las Reglas Generales

+  Foro de elhacker.net
|-+  Programación
| |-+  Scripting (Moderadores: Novlucker, Leo Gutiérrez., EleKtro H@cker)
| | |-+  Mapeo de impresoras en red por usuarioa
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] 2 3 Ir Abajo Respuesta Imprimir
Autor Tema: Mapeo de impresoras en red por usuarioa  (Leído 4,443 veces)
efer27

Desconectado Desconectado

Mensajes: 24


Ver Perfil
Mapeo de impresoras en red por usuarioa
« en: 24 Abril 2011, 17:00 »

Un saludo para todos,

espero que alguien me pueda ayudar soy nuevo en el mundo de script y me gustaria aprender.

bueno mi pregunta es la siguiente. Tengo un servidor de impresoras con mas de 100  impresoras y lo migre a otro servidor, ahora necesito que los usuario se les mapee las impresoras al nuevo servidor, revisando encontre este script que lee desde un excel y mapea las impresoras, mi problema es como puedo cambiar la instruccion del excel para que me lea de una archivo CSV o TXT, adjunto el script para que alguien me pueda ayudar

si se puede reducir el codigo seria excelente.


Saludo

Código
#############################################333
Dim ObjNet,ObjGroup                                  
Dim ComputerName,UserNamedim,CompType                
 
'###Fin declaración variables#####################################################################

'###creación objetos    

Set OBJnet = CreateObject("WScript.Network")           'crea el objeto net

'###fin creación objetos###########################################################################

 
'####inicialización  variables#####################################################################

  ComputerName = ObjNet.ComputerName             'no necesita explicación...
  UserName = ObjNet.username                     'coje el nombre
 
 
'### fin de inicialización variables ##################################################################

'### MAIN ############################################################################################

if not existe then 'Comprueba que existe el fichero c:\temp\existe.txt. si no existe, es la primera vez que se ha entrado
   WScript.Echo "User Name:        " & UserName
   WScript.Echo "computername:     " & ComputerName
   wscript.echo "tipo de máquina : " & tipoMaquina(ComputerName)'Por el tipo de letra del nombre, determina tipo de máquina.

    RemoveAllPrinters 'LAS BORRA TODAS BIEN BORRADAS.
    wscript.echo excel
   createafile 'crea el archivo para no ejecutar más el script.
end if
 
'###END MAIN ############################################################################################

 
'###FUNCIONES y RUTINAS ##############################################################################################

Function TipoMaquina(strcomputername)
on error resume next
CompType = ucase(mid(StrComputerName,6,1))                'determina que tipo de maquina es por la letra del nombre                                                                     'Desktop(D),Laptop(L) o server(0)
        select case CompType
case "D" TipoMaquina = "desktop"
case "N" TipoMaquina = "Laptop"
case "0" TipoMaquina= "servidor"
case else TipoMaquina = "error"
       end select
 
End Function
 
 
 
sub MapDrive(strDrive,strShare)                           'intenta mapear la unidad vía funcion y devuelve error false o true
on error resume next                              ' si no se pone, para en el error y no comprueba el condicinoal del Err
ObjNet.MapNetworkDrive strDrive,strShare
       If Err  Then
ObjNet.RemoveNetworkDrive strDrive
              ObjNet.MapNetworkDrive strDrive,strShare
       End If
End sub
 
 
 
function  Getgroup(user,group) 'devuelve true or false dpendiendo si es del grupo o no. No hay otra manera de hacerlo
Dim DomainName
DomainName = "WinNT://MIDOMINIO/" 'cambiar al dominio propio.
   
         on error resume next
 
         Set ObjGroup = GetObject(DomainName &group)
          if err then
          wscript.echo "No existe el grupo : "&group
          GetGroup = False
          else
              If ObjGroup.IsMember(DomainName&user) = true Then
        wscript.Echo "si, pertenece al grupo "&group
                    Getgroup = True
              Else
                wscript.Echo "No pertenece al grupo "&group
                Getgroup = False
                End If
                end if
end function
 
Function Excel
 
ArrayCols = Array ("A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O","P","Q", "R", "S", "T", "U","V","W","X","Y","Z")
                        'Define la tabla con letras, para hacer búsquedas secuenciales en el excel.
 Dim libro
 dim Intfil,Intcol
 dim RutaExcel
 RutaExcel = "\\RUTA_AL_EXCEL"
 set libro = Wscript.CreateObject("Excel.Application")
 call libro.Workbooks.Open(RutaExcel,0)
 
  libro.Sheets(1).Activate
       Intcol = 0                                 'esto es un hack, para no declarar más veces la variable
do
               IntFil = 1
               if Getgroup (Username,libro.Range(ArrayCols(Intcol) & Intfil).Text) = True then 'Comprueba si el usuario pertenece al grupo 'Recorre las columnas y luego las filas, comparando si es distinto de espacio en blanco, en caso negativo, si la fi
Do while libro.Range(ArrayCols(Intcol) & Intfil+1).Text <>  ""
                              wscript.echo "Instalando la impresora : " & libro.Range(ArrayCols(Intcol) & Intfil+1).Text & " espere... "
                              Objnet.AddWindowsPrinterConnection libro.Range(ArrayCols(Intcol) & Intfil+1).Text  'instala impresora
                              IntFil = IntFil + 1
Loop
                       intfil = 1 'Para volver a la primera fila otra vez y comparar
end if
               Intcol = Intcol + 1
loop while  libro.Range(ArrayCols(Intcol) & Intfil).Text <> ""
       libro.Quit 'IMPORTANTÍSIMOOOOOOOOO. es como los accesos via ADOdb. Se ha de cerrar conexion sino queda zombi
end function
 
Function RemoveAllPrinters
On Error Resume Next
set objNetwork = CreateObject("wscript.network")
Set objPrinters = objNetwork.EnumPrinterConnections
For i = 0 to objPrinters.Count - 1 Step 2
   PrinterPath = objPrinters.Item(i+1)
   wscript.echo  "eliminando impresora : " & printerpath & " Espere..."
   objNetwork.RemovePrinterConnection PrinterPath, true, true
Next
 
end function
 
Function existe
Dim Exist
  Set Exist = CreateObject("Scripting.FileSystemObject")
  If (Exist.FileExists("c:\temp\existe.txt")) Then
   existe = True
  Else
    existe = False
  End If
 
End Function
 
 
Sub CreateAfile
  Dim fso, MyFile
  Set fso = CreateObject("Scripting.FileSystemObject")
  Set MyFile = fso.CreateTextFile("c:\temp\existe.txt", True)
  MyFile.Close
End Sub


« Última modificación: 24 Abril 2011, 19:50 por Leo Gutiérrez. » En línea
Di6it4Lj4ck4L

Desconectado Desconectado

Mensajes: 4


Ver Perfil
Re: Mapeo de impresoras en red por usuarioa
« Respuesta #1 en: 25 Abril 2011, 00:59 »


Aquí esta un manual muy bueno http://foro.elhacker.net/scripting/tutorial_vbscript-t229032.0.html;msg1090556 Escrito por Novlucker en Diciembre del 2008, y abajo te cito la parte del Tutorial que te servira, mucha suerte!!


Citar
Leer desde archivos de texto

Así  como abrimos archivos y podemos escribir en ellos, también existe la posibilidad de leer desde ellos, para lo cual utilizaremos readline, y readall.
Como se puede imaginar, con readline iremos leyendo una a una las líneas del archivo (cada vez que pongamos readline leeremos solo una), con este, leemos una línea, y el puntero se situa al final de la línea, para que a la próxima ejecución de esta función, sea la línea siguiente la que sea leída. Con readall en cambio, leeremos el total de archivo.
Existe además una función llamada skipline, con la cual saltaremos la lectura de una línea.

Ejemplo:
Código
Set objfso = createobject("scripting.filesystemobject")
Set archivotexto = objfso.opentextfile("C:\archivo.txt",1) 'abrimos el archivo
msgbox archivotexto.readline 'leemos una linea, la primera
archivotexto.skipline 'saltamos una linea
msgbox archivotexto.readline 'leemos una linea, la tercera
archivotexto.close 'cerramos el archivo

Atributos de archivos y carpetas

A continuación explicaré el método mediante el cual, se puede obtener, o bien cambiar, los atribuos de archivos y carpetas (es prácticamente igual para ambas cosas)...


En línea
efer27

Desconectado Desconectado

Mensajes: 24


Ver Perfil
Re: Mapeo de impresoras en red por usuarioa
« Respuesta #2 en: 25 Abril 2011, 13:12 »

Hola,

la respuesta esta muy bien, pero disculpar mi ignorancia eh estado probando introducir el codigo con la ruta del archivo y no me puedo aclarar, no se si me puedes orientar si lo que reemplazo esta correcto, me estoy iniciando en este campo y aun no lo tengo muy claro, ya descarge los manuales que me indicaste y estan muy bien.

se que hay veces estos temas cansan cuando las personas son novatas y en verdad debe ser algo facil.

si los cambios que realizo son solo en estas lineas o afectaran a las demas ?

saludos


Código
Function texto 
 
 
ArrayCols = Array ("A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O","P","Q", "R", "S", "T", "U","V","W","X","Y","Z")
                        'Define la tabla con letras, para hacer búsquedas secuenciales en el excel.
 Dim libro
 Dim Intfil,Intcol
 Dim archivotexto
 
Set objfso = createobject("scripting.filesystemobject")
Set archivotexto = objfso.opentextfile("C:\impresoras1.txt",1) 'abrimos el archivo
msgbox archivotexto.readline 'leemos una linea, la primera
archivotexto.skipline 'saltamos una linea
msgbox archivotexto.readline 'leemos una linea, la tercera
archivotexto.close 'cerramos el archivo

 'RutaExcel = "C:\impresoras1.xls"
' Set libro = Wscript.CreateObject("Excel.Application")
 Call libro.Workbooks.Open(archivotexto,0)
 
  libro.Sheets(1).Activate
       Intcol = 0                                 'esto es un hack, para no declarar más veces la variable
do
               IntFil = 1
               if Getgroup (Username,libro.Range(ArrayCols(Intcol) & Intfil).Text) = True then 'Comprueba si el usuario pertenece al grupo 'Recorre las columnas y luego las filas, comparando si es distinto de espacio en blanco, en caso negativo, si la fi
Do while libro.Range(ArrayCols(Intcol) & Intfil+1).Text <>  ""
                              wscript.echo "Instalando la impresora : " & libro.Range(ArrayCols(Intcol) & Intfil+1).Text & " espere... "
                              Objnet.AddWindowsPrinterConnection libro.Range(ArrayCols(Intcol) & Intfil+1).Text  'instala impresora
                              IntFil = IntFil + 1
Loop
                       intfil = 1 'Para volver a la primera fila otra vez y comparar
end if
               Intcol = Intcol + 1
loop while  libro.Range(ArrayCols(Intcol) & Intfil).Text <> ""
       libro.Quit 'IMPORTANTÍSIMOOOOOOOOO. es como los accesos via ADOdb. Se ha de cerrar conexion sino queda zombi
end function
« Última modificación: 25 Abril 2011, 13:24 por Novlucker » En línea
Novlucker
Ninja y
Moderador
***
Desconectado Desconectado

Mensajes: 10.239


Yo que tu lo pienso dos veces


Ver Perfil
Re: Mapeo de impresoras en red por usuarioa
« Respuesta #3 en: 25 Abril 2011, 13:29 »

Buenas

No me gusta el script :xD , podría ser mucho más simple.

Podrías poner un par de líneas del CSV o TXT para ver como esta la estructura? :P

Saludos
En línea

Contribuye con la limpieza del foro, reporta los "casos perdidos" a un MOD XD
http://twitter.com/novlucker

"Hay dos cosas infinitas: el Universo y la estupidez  humana. Y de la primera no estoy muy seguro."
Albert Einstein

efer27

Desconectado Desconectado

Mensajes: 24


Ver Perfil
Re: Mapeo de impresoras en red por usuarioa
« Respuesta #4 en: 25 Abril 2011, 13:41 »

Hola,

Gracias por la pronta respuesta, si el script es muy extenso. si hay alguna manera de acortarlo seria bueno.

esta es la estructura del CSV
Prueba1                                 Prueba2                      Prueba3
\\server1\123456                 \\server1\123456              \\server1\12345678
\\server1\12345678      

estoy probando en maquinas virtuales para luego pasarlo a lo real.
claro si se puede hacer mas simple y me puedes indicar como hacerlo te lo agradecere.

otra consulta, aparte de los tutoriales que publicaste y muchos ejemplos en el foro, conoceras algun buen libro el cual pueda leer para poder practicar, Si esta en castellano seria mejor.

Saludos

En línea
Novlucker
Ninja y
Moderador
***
Desconectado Desconectado

Mensajes: 10.239


Yo que tu lo pienso dos veces


Ver Perfil
Re: Mapeo de impresoras en red por usuarioa
« Respuesta #5 en: 25 Abril 2011, 14:00 »

Más preguntas ...

Cada una de esas rutas apunta a una impresora pero, ¿qué significa Prueba1, 2 y 3?
La verdad que en lo que respecta a libros, cuando hice el tuto fue porque cuando me interesé en vbs no encontraba material en español en ningún lado, salvo la msdn, por lo que el tuto también me servía como "ayuda memoria" :P.

Lo bueno hubiese sido terminarlo en algún momento, y ahora que lo veo, había muchisimo para mejorar :xD

Saludos
En línea

Contribuye con la limpieza del foro, reporta los "casos perdidos" a un MOD XD
http://twitter.com/novlucker

"Hay dos cosas infinitas: el Universo y la estupidez  humana. Y de la primera no estoy muy seguro."
Albert Einstein

efer27

Desconectado Desconectado

Mensajes: 24


Ver Perfil
Re: Mapeo de impresoras en red por usuarioa
« Respuesta #6 en: 25 Abril 2011, 14:23 »

Hola,

te comento prueba1 prueba2 y prueba3 son grupos que eh creado en mi Active directory para realizar pruebas.

la estructura seria asi :

Prueba1(OU)            Prueba2(OU)             Prueba3 (OU)
\\server\impresora  \\server\impresora     \\server\impresora

lo que quiero es que cuando inicie la sesion el usuario valide al grupo que pertenece y asi pueda asignar la impresora.

otra opcion seria que verifique que impresoras tiene el usuario y solo cambie la ruta del servidor a donde imprimira.

son opciones no se cual me recomiendas.

sobre los tutoriales estan muy bien, si lo pudieras terminar y poner algunos ejemplos para poder practicar seria genial.

Saludos
En línea
Novlucker
Ninja y
Moderador
***
Desconectado Desconectado

Mensajes: 10.239


Yo que tu lo pienso dos veces


Ver Perfil
Re: Mapeo de impresoras en red por usuarioa
« Respuesta #7 en: 25 Abril 2011, 15:14 »

Me gusta más la opción de obtener las impresoras actuales y cambiar el nombre del servidor :P
Prueba esto a ver si se listan bien las impresoras remotas, que las que tengo ahora son IP y van en local :P

Código
Set objWMIService = GetObject("winmgmts:" & "{impersonationLevel=Impersonate}!\\.\root\cimv2")
Set colPrinters = objWMIService.ExecQuery("SELECT * FROM Win32_Printer")
For Each p in colPrinters
if p.ServerName <> vbnull then
msgbox p.ServerName & " - " & p.Name
end if
next

Dime como te aparece el texto

Saludos
« Última modificación: 25 Abril 2011, 15:15 por Novlucker » En línea

Contribuye con la limpieza del foro, reporta los "casos perdidos" a un MOD XD
http://twitter.com/novlucker

"Hay dos cosas infinitas: el Universo y la estupidez  humana. Y de la primera no estoy muy seguro."
Albert Einstein

T0rete
Colaborador
***
Desconectado Desconectado

Mensajes: 4.768


Ver Perfil WWW
Re: Mapeo de impresoras en red por usuarioa
« Respuesta #8 en: 25 Abril 2011, 15:24 »

Citar
lo que quiero es que cuando inicie la sesion el usuario valide al grupo que pertenece y asi pueda asignar la impresora.

Si le das un vistazo al script center de technet lo mismo encuentras una solucion que no use un archivo y se base en las politicas de grupo.

http://www.microsoft.com/spain/technet/recursos/script.mspx

Creo que uno de los que se adaptan a lo que quieres es este de visual b:
Map Printers Based on Group Membership
http://gallery.technet.microsoft.com/scriptcenter/bf160908-93e3-484c-944f-1c95004c5498

Código
on error resume next 
Dim objADSystemInfo, objUser, objMemberOf, objGroup, objGroupEnum, objNetwork, objPrinter dim i, bTroubleFlag
 
Set objNetwork = CreateObject("Wscript.Network")
 
'Get current user info from active directory
Set objADSystemInfo = CreateObject("ADSystemInfo")
'bind to current user in active directory
set objUser = GetObject("LDAP://" & objADSystemInfo.UserName)
 
if objuser.description = "printer.trouble" then
   bTroubleFlag = true
   msgbox "Troubleshooting Printer Logon Script"
end if
 
Set objPrinter = objNetwork.EnumPrinterConnections 'Test to see if we have any printers mapped If objPrinter.Count > 0 Then
   'The Printer array is Printer name, printer path that is why it is step 2
   for i=1 to objPrinter.Count Step 2
       'test to make sure it is a network printer
       if instr(objPrinter.Item(i),"\\") <> 0 then
           if bTroubleFlag then
               msgbox "Deleting:" & vbcrlf &
objPrinter.Item(i)
           end if
           objNetwork.RemovePrinterConnection
objPrinter.Item(i),true,true
       end if
   next
end if
 
 
'Get an array of group names that the user is a member of objMemberOf = objUser.MemberOf for Each objGroup in objMemberOf
   'Test to see if it is a printer group. all printer groups should be in the same OU
   if (instr(objGroup,"OU=Printer-Groups") <> 0) then
       'Bind to the group to get is description. The description contain the path to the printer
       set objGroupEnum = GetObject("LDAP://" & objGroup)
       if bTroubleFlag then
           msgbox "Adding:" & vbcrlf & "[" &
objGroupEnum.name & "]" & vbcrlf & objGroupEnum.description
       end if
       objNetwork.AddWindowsPrinterConnection
objGroupEnum.description
       set objGroupEnum = nothing
   end if
next
'Repeat as above for the default printer for Each objGroup in objMemberOf
   if (instr(objGroup,"OU=Printer-Default-Groups") <> 0) then
       set objGroupEnum = GetObject("LDAP://" & objGroup)
       if bTroubleFlag then
           msgbox "Setting Default:" & vbcrlf & "[" & objGroupEnum.name & "]" & vbcrlf & objGroupEnum.description
       end if
       objNetwork.SetDefaultPrinter objGroupEnum.description
       set objGroupEnum = nothing
   end if
next
 
if bTroubleFlag then
   msgbox "Printer Logon Script Finished"
end if
 



« Última modificación: 25 Abril 2011, 17:54 por 0,0 » En línea

-Que te mato con mi taza de té.

Riddick, haciendo amigos.
efer27

Desconectado Desconectado

Mensajes: 24


Ver Perfil
Re: Mapeo de impresoras en red por usuarioa
« Respuesta #9 en: 25 Abril 2011, 15:43 »

Hola Novlucker,

probe el script y no me agrega ninguna impresora.

si suena bien esto de cambiar el nombre del servidor pero hay que tener en cuenta si el equipo es nuevo como saber que impresoras le corresponde ???.

saludos
En línea
Novlucker
Ninja y
Moderador
***
Desconectado Desconectado

Mensajes: 10.239


Yo que tu lo pienso dos veces


Ver Perfil
Re: Mapeo de impresoras en red por usuarioa
« Respuesta #10 en: 25 Abril 2011, 15:50 »

Es que el script que te había dejado solo listaba, no agregaba ninguna impresora.
Para lo que pides te serviría el que ha dejado 0,0, solo que tal vez habría que hacerle un par de modificaciones.

Saludos
En línea

Contribuye con la limpieza del foro, reporta los "casos perdidos" a un MOD XD
http://twitter.com/novlucker

"Hay dos cosas infinitas: el Universo y la estupidez  humana. Y de la primera no estoy muy seguro."
Albert Einstein

efer27

Desconectado Desconectado

Mensajes: 24


Ver Perfil
Re: Mapeo de impresoras en red por usuarioa
« Respuesta #11 en: 25 Abril 2011, 15:56 »

Hola,

Gracias 0,0 por responder a mi preguntael script esta bien.

Que cambios se tendria que hacer ??


Saludos
En línea
efer27

Desconectado Desconectado

Mensajes: 24


Ver Perfil
Re: Mapeo de impresoras en red por usuarioa
« Respuesta #12 en: 25 Abril 2011, 16:01 »

Hola,

probe el script que me comento  0,0 y me sale este error ??

Microsoft (R) Windows Script Host versión 5.8
Copyright (C) Microsoft Corporation 1996-2006. Reservados todos los derechos.

\\192.168.2.140\netlogon\prueba.vbs(20, 47) Error de compilación de Microsoft VBScript: Error de sintaxis


***** script completed - exit code: 1 *****

Linea en el que sale error .

20                msgbox "Deleting:" & vbcrlf &
 
En línea
T0rete
Colaborador
***
Desconectado Desconectado

Mensajes: 4.768


Ver Perfil WWW
Re: Mapeo de impresoras en red por usuarioa
« Respuesta #13 en: 25 Abril 2011, 16:05 »

Si lees la discusion del centro de scritps creo que lo mencionan. Esa parte es para borrar las impresoras anteriormente mapeadas, esa parte la puedes eliminar sin problemas.


El no borrar las impresoras mapeadas simplemente te dará problemas si el usuario tiene impresoras mapeadas del anterior server y si cambias las impresoras asignadas a los grupos. Se iran quedando todas las impresoras no validas mapeadas. No se si alguien puede corregir esa parte.
« Última modificación: 25 Abril 2011, 16:07 por 0,0 » En línea

-Que te mato con mi taza de té.

Riddick, haciendo amigos.
Novlucker
Ninja y
Moderador
***
Desconectado Desconectado

Mensajes: 10.239


Yo que tu lo pienso dos veces


Ver Perfil
Re: Mapeo de impresoras en red por usuarioa
« Respuesta #14 en: 25 Abril 2011, 16:29 »

En cuanto tenga un rato lo miro, pero por lo pronto hay partes del script que estan comentadas, sin las cuales no funciona :-\

Saludos
En línea

Contribuye con la limpieza del foro, reporta los "casos perdidos" a un MOD XD
http://twitter.com/novlucker

"Hay dos cosas infinitas: el Universo y la estupidez  humana. Y de la primera no estoy muy seguro."
Albert Einstein

Páginas: [1] 2 3 Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Bouncer y mapeo de puertos
Redes
cho 2 458 Último mensaje 28 Mayo 2005, 21:19
por + enrique ZP
COMO forzar el Mapeo unidades de red
Windows
jandemore 3 3,300 Último mensaje 8 Noviembre 2005, 21:37
por Magius
Mapeo de subdominios
Hacking Básico
TRICKY 0 336 Último mensaje 30 Septiembre 2006, 18:59
por TRICKY
Mapeo de Fichero
ASM
Иōҳ 3 834 Último mensaje 10 Diciembre 2011, 12:38
por Eternal Idol
Mapeo de unidades de red desconectadas.
Redes
Chernova 0 38 Último mensaje 24 Mayo 2012, 14:53
por Chernova
Powered by SMF 1.1.16 | SMF © 2006-2008, Simple Machines