Autor
|
Tema: Mapeo de impresoras en red por usuarioa (Leído 22,830 veces)
|
efer27
Desconectado
Mensajes: 27
|
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 #############################################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 pm por Leo Gutiérrez. »
|
En línea
|
|
|
|
Di6it4Lj4ck4L
Desconectado
Mensajes: 4
|
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!! Leer desde archivos de textoAsí 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: 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 carpetasA 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
Mensajes: 27
|
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 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 pm por Novlucker »
|
En línea
|
|
|
|
Novlucker
Ninja y
Colaborador
Desconectado
Mensajes: 10.683
Yo que tu lo pienso dos veces
|
Buenas No me gusta el script , 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? Saludos
|
|
|
En línea
|
Contribuye con la limpieza del foro, reporta los "casos perdidos" a un MOD XD "Hay dos cosas infinitas: el Universo y la estupidez humana. Y de la primera no estoy muy seguro." Albert Einstein
|
|
|
efer27
Desconectado
Mensajes: 27
|
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
Colaborador
Desconectado
Mensajes: 10.683
Yo que tu lo pienso dos veces
|
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" . Lo bueno hubiese sido terminarlo en algún momento, y ahora que lo veo, había muchisimo para mejorar Saludos
|
|
|
En línea
|
Contribuye con la limpieza del foro, reporta los "casos perdidos" a un MOD XD "Hay dos cosas infinitas: el Universo y la estupidez humana. Y de la primera no estoy muy seguro." Albert Einstein
|
|
|
efer27
Desconectado
Mensajes: 27
|
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
Colaborador
Desconectado
Mensajes: 10.683
Yo que tu lo pienso dos veces
|
Me gusta más la opción de obtener las impresoras actuales y cambiar el nombre del servidor Prueba esto a ver si se listan bien las impresoras remotas, que las que tengo ahora son IP y van en local 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 pm por Novlucker »
|
En línea
|
Contribuye con la limpieza del foro, reporta los "casos perdidos" a un MOD XD "Hay dos cosas infinitas: el Universo y la estupidez humana. Y de la primera no estoy muy seguro." Albert Einstein
|
|
|
T0rete
|
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.mspxCreo 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-1c95004c5498on 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 pm por 0,0 »
|
En línea
|
|
|
|
efer27
Desconectado
Mensajes: 27
|
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
|
|
|
|
|
Mensajes similares |
|
Asunto |
Iniciado por |
Respuestas |
Vistas |
Último mensaje |
|
|
Mapeo de Fichero
ASM
|
Иōҳ
|
3
|
4,195
|
10 Diciembre 2011, 12:38 pm
por Eternal Idol
|
|
|
Mapeo de unidades de red desconectadas.
Redes
|
Chernova
|
0
|
2,505
|
24 Mayo 2012, 14:53 pm
por Chernova
|
|
|
mapeo de red con foca
Redes
|
Pirat3net
|
0
|
1,684
|
25 Octubre 2012, 14:57 pm
por Pirat3net
|
|
|
mapeo de programa
Hacking
|
c3r0x
|
4
|
3,350
|
8 Marzo 2014, 00:30 am
por unknwn
|
|
|
Dudas sobre el mapeo de IPs moviles
Hacking
|
Helix
|
2
|
3,578
|
25 Noviembre 2020, 19:10 pm
por Helix
|
|