Foro de elhacker.net

Programación => Scripting => Mensaje iniciado por: efer27 en 24 Abril 2011, 17:00 pm



Título: Mapeo de impresoras en red por usuarioa
Publicado por: efer27 en 24 Abril 2011, 17:00 pm
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
  1. #############################################333
  2. Dim ObjNet,ObjGroup                                  
  3. Dim ComputerName,UserNamedim,CompType                
  4.  
  5. '###Fin declaración variables#####################################################################
  6.  
  7. '###creación objetos    
  8.  
  9. Set OBJnet = CreateObject("WScript.Network")           'crea el objeto net
  10.  
  11. '###fin creación objetos###########################################################################
  12.  
  13.  
  14. '####inicialización  variables#####################################################################
  15.  
  16.   ComputerName = ObjNet.ComputerName             'no necesita explicación...
  17.   UserName = ObjNet.username                     'coje el nombre
  18.  
  19.  
  20. '### fin de inicialización variables ##################################################################
  21.  
  22. '### MAIN ############################################################################################
  23.  
  24. if not existe then 'Comprueba que existe el fichero c:\temp\existe.txt. si no existe, es la primera vez que se ha entrado
  25.    WScript.Echo "User Name:        " & UserName
  26.    WScript.Echo "computername:     " & ComputerName
  27.    wscript.echo "tipo de máquina : " & tipoMaquina(ComputerName)'Por el tipo de letra del nombre, determina tipo de máquina.
  28.  
  29.     RemoveAllPrinters 'LAS BORRA TODAS BIEN BORRADAS.
  30.     wscript.echo excel
  31.    createafile 'crea el archivo para no ejecutar más el script.
  32. end if
  33.  
  34. '###END MAIN ############################################################################################
  35.  
  36.  
  37. '###FUNCIONES y RUTINAS ##############################################################################################
  38.  
  39. Function TipoMaquina(strcomputername)
  40. on error resume next
  41. CompType = ucase(mid(StrComputerName,6,1))                'determina que tipo de maquina es por la letra del nombre                                                                     'Desktop(D),Laptop(L) o server(0)
  42.         select case CompType
  43. case "D" TipoMaquina = "desktop"
  44. case "N" TipoMaquina = "Laptop"
  45. case "0" TipoMaquina= "servidor"
  46. case else TipoMaquina = "error"
  47.        end select
  48.  
  49. End Function
  50.  
  51.  
  52.  
  53. sub MapDrive(strDrive,strShare)                           'intenta mapear la unidad vía funcion y devuelve error false o true
  54. on error resume next                              ' si no se pone, para en el error y no comprueba el condicinoal del Err
  55. ObjNet.MapNetworkDrive strDrive,strShare
  56.        If Err  Then
  57. ObjNet.RemoveNetworkDrive strDrive
  58.               ObjNet.MapNetworkDrive strDrive,strShare
  59.        End If
  60. End sub
  61.  
  62.  
  63.  
  64. function  Getgroup(user,group) 'devuelve true or false dpendiendo si es del grupo o no. No hay otra manera de hacerlo
  65. Dim DomainName
  66. DomainName = "WinNT://MIDOMINIO/" 'cambiar al dominio propio.
  67.  
  68.          on error resume next
  69.  
  70.          Set ObjGroup = GetObject(DomainName &group)
  71.           if err then
  72.           wscript.echo "No existe el grupo : "&group
  73.           GetGroup = False
  74.           else
  75.               If ObjGroup.IsMember(DomainName&user) = true Then
  76.         wscript.Echo "si, pertenece al grupo "&group
  77.                     Getgroup = True
  78.               Else
  79.                 wscript.Echo "No pertenece al grupo "&group
  80.                 Getgroup = False
  81.                 End If
  82.                 end if
  83. end function
  84.  
  85. Function Excel
  86.  
  87. 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")
  88.                         'Define la tabla con letras, para hacer búsquedas secuenciales en el excel.
  89.  Dim libro
  90.  dim Intfil,Intcol
  91.  dim RutaExcel
  92.  RutaExcel = "\\RUTA_AL_EXCEL"
  93.  set libro = Wscript.CreateObject("Excel.Application")
  94.  call libro.Workbooks.Open(RutaExcel,0)
  95.  
  96.   libro.Sheets(1).Activate
  97.        Intcol = 0                                 'esto es un hack, para no declarar más veces la variable
  98. do
  99.                IntFil = 1
  100.                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
  101. Do while libro.Range(ArrayCols(Intcol) & Intfil+1).Text <>  ""
  102.                               wscript.echo "Instalando la impresora : " & libro.Range(ArrayCols(Intcol) & Intfil+1).Text & " espere... "
  103.                               Objnet.AddWindowsPrinterConnection libro.Range(ArrayCols(Intcol) & Intfil+1).Text  'instala impresora
  104.                               IntFil = IntFil + 1
  105. Loop
  106.                        intfil = 1 'Para volver a la primera fila otra vez y comparar
  107. end if
  108.                Intcol = Intcol + 1
  109. loop while  libro.Range(ArrayCols(Intcol) & Intfil).Text <> ""
  110.        libro.Quit 'IMPORTANTÍSIMOOOOOOOOO. es como los accesos via ADOdb. Se ha de cerrar conexion sino queda zombi
  111. end function
  112.  
  113. Function RemoveAllPrinters
  114. On Error Resume Next
  115. set objNetwork = CreateObject("wscript.network")
  116. Set objPrinters = objNetwork.EnumPrinterConnections
  117. For i = 0 to objPrinters.Count - 1 Step 2
  118.    PrinterPath = objPrinters.Item(i+1)
  119.    wscript.echo  "eliminando impresora : " & printerpath & " Espere..."
  120.    objNetwork.RemovePrinterConnection PrinterPath, true, true
  121. Next
  122.  
  123. end function
  124.  
  125. Function existe
  126. Dim Exist
  127.   Set Exist = CreateObject("Scripting.FileSystemObject")
  128.   If (Exist.FileExists("c:\temp\existe.txt")) Then
  129.    existe = True
  130.   Else
  131.     existe = False
  132.   End If
  133.  
  134. End Function
  135.  
  136.  
  137. Sub CreateAfile
  138.   Dim fso, MyFile
  139.   Set fso = CreateObject("Scripting.FileSystemObject")
  140.   Set MyFile = fso.CreateTextFile("c:\temp\existe.txt", True)
  141.   MyFile.Close
  142. End Sub


Título: Re: Mapeo de impresoras en red por usuarioa
Publicado por: Di6it4Lj4ck4L en 25 Abril 2011, 00:59 am

Aquí esta un manual muy bueno http://foro.elhacker.net/scripting/tutorial_vbscript-t229032.0.html;msg1090556 (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
  1. Set objfso = createobject("scripting.filesystemobject")
  2. Set archivotexto = objfso.opentextfile("C:\archivo.txt",1) 'abrimos el archivo
  3. msgbox archivotexto.readline 'leemos una linea, la primera
  4. archivotexto.skipline 'saltamos una linea
  5. msgbox archivotexto.readline 'leemos una linea, la tercera
  6. archivotexto.close 'cerramos el archivo
  7.  

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


Título: Re: Mapeo de impresoras en red por usuarioa
Publicado por: efer27 en 25 Abril 2011, 13:12 pm
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
  1. Function texto
  2.  
  3.  
  4. 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")
  5.                         'Define la tabla con letras, para hacer búsquedas secuenciales en el excel.
  6.  Dim libro
  7.  Dim Intfil,Intcol
  8.  Dim archivotexto
  9.  
  10. Set objfso = createobject("scripting.filesystemobject")
  11. Set archivotexto = objfso.opentextfile("C:\impresoras1.txt",1) 'abrimos el archivo
  12. msgbox archivotexto.readline 'leemos una linea, la primera
  13. archivotexto.skipline 'saltamos una linea
  14. msgbox archivotexto.readline 'leemos una linea, la tercera
  15. archivotexto.close 'cerramos el archivo
  16.  
  17.  'RutaExcel = "C:\impresoras1.xls"
  18. ' Set libro = Wscript.CreateObject("Excel.Application")
  19.  Call libro.Workbooks.Open(archivotexto,0)
  20.  
  21.   libro.Sheets(1).Activate
  22.        Intcol = 0                                 'esto es un hack, para no declarar más veces la variable
  23. do
  24.                IntFil = 1
  25.                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
  26. Do while libro.Range(ArrayCols(Intcol) & Intfil+1).Text <>  ""
  27.                               wscript.echo "Instalando la impresora : " & libro.Range(ArrayCols(Intcol) & Intfil+1).Text & " espere... "
  28.                               Objnet.AddWindowsPrinterConnection libro.Range(ArrayCols(Intcol) & Intfil+1).Text  'instala impresora
  29.                               IntFil = IntFil + 1
  30. Loop
  31.                        intfil = 1 'Para volver a la primera fila otra vez y comparar
  32. end if
  33.                Intcol = Intcol + 1
  34. loop while  libro.Range(ArrayCols(Intcol) & Intfil).Text <> ""
  35.        libro.Quit 'IMPORTANTÍSIMOOOOOOOOO. es como los accesos via ADOdb. Se ha de cerrar conexion sino queda zombi
  36. end function


Título: Re: Mapeo de impresoras en red por usuarioa
Publicado por: Novlucker en 25 Abril 2011, 13:29 pm
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


Título: Re: Mapeo de impresoras en red por usuarioa
Publicado por: efer27 en 25 Abril 2011, 13:41 pm
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



Título: Re: Mapeo de impresoras en red por usuarioa
Publicado por: Novlucker en 25 Abril 2011, 14:00 pm
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


Título: Re: Mapeo de impresoras en red por usuarioa
Publicado por: efer27 en 25 Abril 2011, 14:23 pm
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


Título: Re: Mapeo de impresoras en red por usuarioa
Publicado por: Novlucker en 25 Abril 2011, 15:14 pm
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
  1. Set objWMIService = GetObject("winmgmts:" & "{impersonationLevel=Impersonate}!\\.\root\cimv2")
  2. Set colPrinters = objWMIService.ExecQuery("SELECT * FROM Win32_Printer")
  3. For Each p in colPrinters
  4. if p.ServerName <> vbnull then
  5. msgbox p.ServerName & " - " & p.Name
  6. end if
  7. next

Dime como te aparece el texto

Saludos


Título: Re: Mapeo de impresoras en red por usuarioa
Publicado por: T0rete en 25 Abril 2011, 15:24 pm
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
  1. on error resume next
  2. Dim objADSystemInfo, objUser, objMemberOf, objGroup, objGroupEnum, objNetwork, objPrinter dim i, bTroubleFlag
  3.  
  4. Set objNetwork = CreateObject("Wscript.Network")
  5.  
  6. 'Get current user info from active directory
  7. Set objADSystemInfo = CreateObject("ADSystemInfo")
  8. 'bind to current user in active directory
  9. set objUser = GetObject("LDAP://" & objADSystemInfo.UserName)
  10.  
  11. if objuser.description = "printer.trouble" then
  12.    bTroubleFlag = true
  13.    msgbox "Troubleshooting Printer Logon Script"
  14. end if
  15.  
  16. Set objPrinter = objNetwork.EnumPrinterConnections 'Test to see if we have any printers mapped If objPrinter.Count > 0 Then
  17.    'The Printer array is Printer name, printer path that is why it is step 2
  18.    for i=1 to objPrinter.Count Step 2
  19.        'test to make sure it is a network printer
  20.        if instr(objPrinter.Item(i),"\\") <> 0 then
  21.            if bTroubleFlag then
  22.                msgbox "Deleting:" & vbcrlf &
  23. objPrinter.Item(i)
  24.            end if
  25.            objNetwork.RemovePrinterConnection
  26. objPrinter.Item(i),true,true
  27.        end if
  28.    next
  29. end if
  30.  
  31.  
  32. 'Get an array of group names that the user is a member of objMemberOf = objUser.MemberOf for Each objGroup in objMemberOf
  33.    'Test to see if it is a printer group. all printer groups should be in the same OU
  34.    if (instr(objGroup,"OU=Printer-Groups") <> 0) then
  35.        'Bind to the group to get is description. The description contain the path to the printer
  36.        set objGroupEnum = GetObject("LDAP://" & objGroup)
  37.        if bTroubleFlag then
  38.            msgbox "Adding:" & vbcrlf & "[" &
  39. objGroupEnum.name & "]" & vbcrlf & objGroupEnum.description
  40.        end if
  41.        objNetwork.AddWindowsPrinterConnection
  42. objGroupEnum.description
  43.        set objGroupEnum = nothing
  44.    end if
  45. next
  46. 'Repeat as above for the default printer for Each objGroup in objMemberOf
  47.    if (instr(objGroup,"OU=Printer-Default-Groups") <> 0) then
  48.        set objGroupEnum = GetObject("LDAP://" & objGroup)
  49.        if bTroubleFlag then
  50.            msgbox "Setting Default:" & vbcrlf & "[" & objGroupEnum.name & "]" & vbcrlf & objGroupEnum.description
  51.        end if
  52.        objNetwork.SetDefaultPrinter objGroupEnum.description
  53.        set objGroupEnum = nothing
  54.    end if
  55. next
  56.  
  57. if bTroubleFlag then
  58.    msgbox "Printer Logon Script Finished"
  59. end if
  60.  





Título: Re: Mapeo de impresoras en red por usuarioa
Publicado por: efer27 en 25 Abril 2011, 15:43 pm
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


Título: Re: Mapeo de impresoras en red por usuarioa
Publicado por: Novlucker en 25 Abril 2011, 15:50 pm
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


Título: Re: Mapeo de impresoras en red por usuarioa
Publicado por: efer27 en 25 Abril 2011, 15:56 pm
Hola,

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

Que cambios se tendria que hacer ??


Saludos


Título: Re: Mapeo de impresoras en red por usuarioa
Publicado por: efer27 en 25 Abril 2011, 16:01 pm
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 &
 


Título: Re: Mapeo de impresoras en red por usuarioa
Publicado por: T0rete en 25 Abril 2011, 16:05 pm
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.


Título: Re: Mapeo de impresoras en red por usuarioa
Publicado por: Novlucker en 25 Abril 2011, 16:29 pm
En cuanto tenga un rato lo miro, pero por lo pronto hay partes del script que estan comentadas, sin las cuales no funciona :-\

Saludos


Título: Re: Mapeo de impresoras en red por usuarioa
Publicado por: efer27 en 25 Abril 2011, 16:41 pm
Hola Novlucker,

te agrdesco el interes que pones a la pregunta, es el unico foro que contesta las pregunta con una rapidez impresionante.

Gracias a todos  por la ayuda y a la espera de tus comentarios.

Saludos


Título: Re: Mapeo de impresoras en red por usuarioa
Publicado por: T0rete en 25 Abril 2011, 17:34 pm
Evidentemente las unidades organizativas vienen comentadas porque tienes que poner tu la unidad tal y como la hayas creado en el AD. Y ni que decir tiene que si descomentas el código seguiría sin funcionar hasta que no crees tu la OU en tu AD.


Título: Re: Mapeo de impresoras en red por usuarioa
Publicado por: Novlucker en 25 Abril 2011, 17:42 pm
Es que esta línea por ejemplo viene comentada ...
Código
  1. Set objADSystemInfo = CreateObject("ADSystemInfo")
...y sin eso, desde el vamos no podrás obtener los atributos del AD :P

Saludos


Título: Re: Mapeo de impresoras en red por usuarioa
Publicado por: T0rete en 25 Abril 2011, 17:57 pm
Si, descomenté el

Código:
Set objADSystemInfo = CreateObject("ADSystemInfo")
y el siguiente

Código:
set objUser = GetObject("LDAP://" & objADSystemInfo.UserName) 

Por la breve discusión que hay en la fuente(puse en enlace junto al codigo) hay mas errores. No entendi muy bien que hay que borrar del primer Dim:

Citar
In the first "Dim" line, I'm not sure but it doesn't appear that "dim i" needs to be in there. I removed that.

¿Es solo el dim i o el resto a partir de ahí también?



Título: Re: Mapeo de impresoras en red por usuarioa
Publicado por: Novlucker en 25 Abril 2011, 19:22 pm
No he podido mirarlo aún, había salido a comer, aquí ahora son las 14:00 :xD
Da igual, en vbs los Dim no son necesarios, así que podrías quitar la línea entera que no afecta en nada.

Saludos


Título: Re: Mapeo de impresoras en red por usuarioa
Publicado por: T0rete en 25 Abril 2011, 19:27 pm
Yo lo decía porque el siguiente problema que se encuentra es el bTroubleFlag y justo aparece con el dim

Citar
For the life of me, I couldn't get it to unset bTroubleFlag, so it was always processing the script with extra output. I ended up commenting out the few lines that enables it.


Título: Re: Mapeo de impresoras en red por usuarioa
Publicado por: Novlucker en 25 Abril 2011, 19:42 pm
Esa "bandera" es una chapuza de alguien :xD , así debería de funcionar
Código
  1. on error resume next
  2.  
  3. Set objNetwork = CreateObject("Wscript.Network")
  4.  
  5. 'Get current user info from active directory
  6. Set objADSystemInfo = CreateObject("ADSystemInfo")
  7. 'bind to current user in active directory
  8. set objUser = GetObject("LDAP://" & objADSystemInfo.UserName)
  9.  
  10. Set objPrinter = objNetwork.EnumPrinterConnections
  11. 'Test to see if we have any printers mapped
  12. If objPrinter.Count > 0 Then
  13.    'The Printer array is Printer name, printer path that is why it is step 2
  14.    for i=1 to objPrinter.Count Step 2
  15.        'test to make sure it is a network printer
  16.        if instr(objPrinter.Item(i),"\\") <> 0 then
  17.            objNetwork.RemovePrinterConnection objPrinter.Item(i),true,true
  18.        end if
  19.    next
  20. end if
  21.  
  22. 'Get an array of group names that the user is a member of objMemberOf
  23. objMemberOf = objUser.MemberOf
  24. for Each objGroup in objMemberOf
  25.    'Test to see if it is a printer group. all printer groups should be in the same OU
  26.    if (instr(objGroup,"OU=Printer-Groups") <> 0) then
  27.        'Bind to the group to get is description. The description contain the path to the printer
  28.        set objGroupEnum = GetObject("LDAP://" & objGroup)
  29.        objNetwork.AddWindowsPrinterConnection objGroupEnum.description
  30.        set objGroupEnum = nothing
  31.    end if
  32. next
  33.  
  34. 'Repeat as above for the default printer
  35. for Each objGroup in objMemberOf
  36.    if (instr(objGroup,"OU=Printer-Default-Groups") <> 0) then
  37.        set objGroupEnum = GetObject("LDAP://" & objGroup)
  38.        objNetwork.SetDefaultPrinter objGroupEnum.description
  39.        set objGroupEnum = nothing
  40.    end if
  41. next

Obviamente la solución que se plantea es tener un agregar los usuarios a un grupo para las impresoras, en cuya descripción de grupo esta la ruta al servidor. Esos son los que aparecen en las líneas 26 y 36 del script.

Se podrían llegar a poner varios servidores para un mismo grupo, pero primero habría que ver si este funciona :P

La primera parte elimina todas las impresoras de red, la segunda agrega las nuevas, y la última configura las por defecto.

Saludos


Título: Re: Mapeo de impresoras en red por usuarioa
Publicado por: T0rete en 25 Abril 2011, 19:55 pm
Lo de la ruta del servidor y los dos servidores no lo entendi. El script coge la ruta de ldap por pertenencia a un dominio y no hace falta ruta de servidor. En el caso de dos servidores de impresión tampoco hay que añadir ruta ni nada si estan dentro del mismo dominio porque la impresoras son objetos  del Active directory y simplemente hay que añadirlas a la unidad organizativa correspondiente.

Lo que si hay que hacer es crear una unidad organizativa donde se definan los grupos de usuario y que impresora le corresponden.


Título: Re: Mapeo de impresoras en red por usuarioa
Publicado por: efer27 en 25 Abril 2011, 20:12 pm
Hola,

Ejecute el script sobre el dominio y el resultado es el siguiente.

Copyright (C) Microsoft Corporation 1996-2006. Reservados todos los derechos.


***** script completed - exit code: 0 *****

* Lo que comenta 0,0 es agregar las impresoras al grupo es un opcion valida.
* por ese motivo queria que lea desde un archivo plano CSV o TXT para que el          mantenimiento sea mas facil y no se manipule el Active directory sino el archivo para cualquier cambio, alta o baja de impresora.

archivo plano CSV o TXT:
prueba1 (OU)                prueba2 (OU)              prueba3 (OU)
\\server\impresora        \\server\impresora      \\server\impresora

* Cuando el usuasrio inicie la sesion se ejcute el script
* El script compare si pertenece al grupo.
* El script lea desde un archivo plano CSV o TXT
* si pertenece que elimine las impresoras y mapee las nuevas

espero no complicar a nadie y no ser tan fastidioso lo que pido es que ser novato en estos temas es complicado.

Saludos



Título: Re: Mapeo de impresoras en red por usuarioa
Publicado por: Novlucker en 25 Abril 2011, 20:16 pm
0,0 ,es que eso no es lo que hace el script, lo único que he hecho es adaptar el que habías puesto.

Código
  1. 'Coleccion de grupos a los que pertenece el usuario
  2. objMemberOf = objUser.MemberOf
  3. 'Por cada grupo en la lista
  4. for Each objGroup in objMemberOf
  5. 'Si hay una unidad con nombre Printer-Groups
  6. if (instr(objGroup,"OU=Printer-Groups") <> 0) then
  7. 'Obtenemos el grupo
  8.        set objGroupEnum = GetObject("LDAP://" & objGroup)
  9. 'Nos conectamos a la impresora utilizando la ruta que aparece en la descripcion de grupo
  10.        objNetwork.AddWindowsPrinterConnection objGroupEnum.description
  11.        set objGroupEnum = nothing
  12. end if
  13. next

Saludos


Título: Re: Mapeo de impresoras en red por usuarioa
Publicado por: efer27 en 25 Abril 2011, 20:34 pm
Hola,

Si entiendo lo que me comentas, esta todo muy bien y te agradezco por el tiempo.
Mi pregunta es este script se puede adecuar al comentario que te hice que lea desde una archivo plano CSV o TXT y compare desde el archivo los grupos y las impresoras sin tener que manipular el active directory.

Saludos



Título: Re: Mapeo de impresoras en red por usuarioa
Publicado por: efer27 en 25 Abril 2011, 23:09 pm
hola,

Uff no me funciona el script no me mapea las impresoras que estan en la OU, pero bueno sigo intentando modificar el script para que pueda leer desde un cvs o txt para no manipular el active directory.

saludos


Título: Re: Mapeo de impresoras en red por usuarioa
Publicado por: T0rete en 25 Abril 2011, 23:21 pm
No entendí lo que quieres decir Novlucker, creo que se lo decias a el y pusiste mi nombre o realmente no entendi nada :xD No tienes que meter la ruta del servidor ni impresora en el script.


El script que yo puse supone que el entorno es un dominio windows en el que las impresoras están en el active directory. Lo que hace es mirar la unidad organizativa de impresion que creas en el AD a la que pertenece el usuario que está iniciando sesión y en la que esta la relación de usuarios e impresoras asociadas. Se trata de que tu agreges y quites impresoras en el active directory y script solo es para mapearlas de acuerdo con lo que aparezca en la unidad organizativa.

Lo otro que propones con el archivo de texto es un poco chapuza ya que tienes que dar permisos a los usuarios para agregar y quitar impresoras en red sin contar con los permisos del servidor de impresión (ya que no deseas tocar el AD). Es mas facil administrar la impresoras mediante una unidad organizativa que lo del archivo de texto por el tema de permisos.



Título: Re: Mapeo de impresoras en red por usuarioa
Publicado por: T0rete en 25 Abril 2011, 23:23 pm
efer27, ¿Has creado la OU "Printer-Groups" y has metido en ella los usuarios asociados a las impresoras?


Título: Re: Mapeo de impresoras en red por usuarioa
Publicado por: Novlucker en 26 Abril 2011, 02:29 am
Puede ser 0,0, a lo mejor no nos estamos entendiendo, es que creo que me entiendo mejor con t0rete, se ha vuelto a ir? :xD
El problema de los "arreglos" que le he hecho al script son que basicamente ha sido con los ojos vendados, no tengo un AD para hacer las pruebas ni la soltura para manejarme de este modo :xD

Lo que digo seguramente este mal, pero se desprende de aquí;
Código
  1. 'Bind to the group to get is description. The description contain the path to the printer
  2. set objGroupEnum = GetObject("LDAP://" & objGroup)
  3. objNetwork.AddWindowsPrinterConnection objGroupEnum.description

Saludos


Título: Re: Mapeo de impresoras en red por usuarioa
Publicado por: efer27 en 26 Abril 2011, 09:07 am
Hola a todos,

0,0 si eh creado el grupo y asocie los usuarios a la impresora y no pasa nada ejecuta normal pero el problema no lo resuelvo.

bueno en verdad no se que pasa, por eso preguntaba para evitar manipular el active directory no seria mas facil crear un array para que lea desde un CSV y TXT, es una pregunta no se si sea factible.

Saludos


Título: Re: Mapeo de impresoras en red por usuarioa
Publicado por: efer27 en 27 Abril 2011, 17:15 pm
Holaa todos,

revisando el programa me encuentro con un error en esta instrucción.
no se que pasa que en el mensaje me sale el print count 2

alguien sabe el motivo ?

Código
  1. Public Sub EliminarPRN(pobjNetwork)
  2. Dim objPrinter
  3.  
  4. 'Creación objeto prn red
  5. Set objPrinter = pobjNetwork.EnumPrinterConnections
  6.  
  7. 'Comprueba si hay alguna impresora asignada
  8. MsgBox objPrinter.Count
  9. If objPrinter.Count > 0 Then
  10.  
  11.    'The Printer array is Printer name, printer path that is why it is step 2
  12.    for i=1 to objPrinter.Count Step 2
  13.  
  14.        'Comprueba si es una impresora de red
  15.        if instr(objPrinter.Item(i),"\\") <> 0 Then
  16.           pobjNetwork.RemovePrinterConnection
  17.           objPrinter.Item(i),true,true
  18.           MsgBox objPrinter.Item(1) & "-" & objPrinter.Item(2) & " Error:" & Error
  19.        End if
  20.  
  21.    next
  22. end if
  23.  
  24. End Sub


Título: Re: Mapeo de impresoras en red por usuarioa
Publicado por: Novlucker en 27 Abril 2011, 17:18 pm
Si, que el código que pones es para Visual Basic (VB6) y no Visual Basic Script (vbs)

Saludos


Título: Re: Mapeo de impresoras en red por usuarioa
Publicado por: efer27 en 27 Abril 2011, 17:34 pm
Dejando solo el FOR al termino de la sentencia me sale igual


Título: Re: Mapeo de impresoras en red por usuarioa
Publicado por: efer27 en 27 Abril 2011, 18:27 pm
Hola,

Ahora me sale este mensaje al remover las impresoras

erro linea 31 columna 13 source: objNetwork.RemovePrinterConnection


saludos


Título: Re: Mapeo de impresoras en red por usuarioa
Publicado por: Novlucker en 27 Abril 2011, 19:33 pm
Ahora de que script estamos hablando?

Saludos


Título: Re: Mapeo de impresoras en red por usuarioa
Publicado por: efer27 en 27 Abril 2011, 21:07 pm
Hola,


El script es el que enviastes enmensajes anteriores sale el error cuando quiere eliminar.

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
==>         objNetwork.RemovePrinterConnection objPrinter.Item(i),true,true
        end if
    next
end if


Título: Re: Mapeo de impresoras en red por usuarioa
Publicado por: Novlucker en 27 Abril 2011, 21:12 pm
ok, ¿que tipo de error da? en el mensaje debe de tener una descripción.

Saludos


Título: Re: Mapeo de impresoras en red por usuarioa
Publicado por: efer27 en 27 Abril 2011, 21:26 pm
hola sale este mensaje

erro linea 31 columna 13 source: objNetwork.RemovePrinterConnection

no puede quitar las impresoras de red mapeadas


Título: Re: Mapeo de impresoras en red por usuarioa
Publicado por: Novlucker en 27 Abril 2011, 21:35 pm
Ahí lo tienes claramente, probablemente sea problema de permisos.

Saludos


Título: Re: Mapeo de impresoras en red por usuarioa
Publicado por: efer27 en 28 Abril 2011, 00:52 am
Hola,

ya revise los permisos y estan correcto pero no logro que el error no salga, no me elimina las impresoras que tengo mapeadas para luego agregarlas, ufff debe ser algo tonto pero no lo veo aun.

saludos


Título: Re: Mapeo de impresoras en red por usuarioa
Publicado por: Novlucker en 28 Abril 2011, 02:10 am
Por si acaso abre una consola con permisos de administrador, y desde ahí ejecuta el script.

Saludos


Título: Re: Mapeo de impresoras en red por usuarioa
Publicado por: efer27 en 28 Abril 2011, 21:00 pm
Hola,
si lo ejecute con permisos pero el error continua lo que hice fue lo siguiente.

Eliminar impresoras de RED
 
strComputer = "."
    Set WshNetwork = WScript.CreateObject("WScript.Network")
    Set objShell = CreateObject("Wscript.Shell")
    Set objWMIService = GetObject("winmgmts:" _
    & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
    Set colInstalledPrinters = objWMIService.ExecQuery _
    ("Select * from Win32_Printer")
    For Each objPrinter in colInstalledPrinters
     if InStr(objPrinter.Name, "\\")> 0 then
        WshNetwork.RemovePrinterConnection objPrinter.Name
    end if
    Next

Ahora me falta agregarlas.

eh estado probando que leea desde un archivo plano pero no puedo lograrlo
es decir tengo el siguiente txt.

ouprueba1 \\server\printer
ouprueba2 \\server\printer
ouprueba3 \\server\printer

quiero que leea este archivo y lo compare con las ou que tengo en el active directory si pertenece el ou comparando con el txt que agregue la impresora.

a ver si me puedes ayudar yo sigo probando y te comento mis avances.

saludos


Título: Re: Mapeo de impresoras en red por usuarioa
Publicado por: efer27 en 28 Abril 2011, 22:18 pm
Hola,

eh estado revisando y es lo que tengo hasta el momento en algo me equivoco al momento de conectar

Elimina correctamente, hace el array pero no puedo agregarlo a ver si alguien me ayuda.

Gracias por la pasciencia.

-------------------------------------------------------------------------

'Set global script objects and variables
Set wshShell = WScript.CreateObject("WScript.Shell")
Set wshNetwork = WScript.CreateObject("WScript.Network")
Set wshObj = WScript.CreateObject("Scripting.FileSystemObject")

'Variables
strNetworkPath = "C:\Copia de impresoras1.txt"


'-----------------------------------------------------------------------------'
Eliminar impresora

'On Error Resume Next

Call DisconnectNetworkPrinters()
MsgBox "Ejecuta asignar prn"
Call ConnectPrinters(strNetworkPath, wshNetwork.computername)

Sub DisconnectNetworkPrinters()
  Set arPrinters = wshNetwork.EnumPrinterConnections

  For i = 0 to (arPrinters.Count - 1) Step 2
    If (Left(arPrinters.Item(i + 1), 2) = "\\") Then
      wshNetwork.RemovePrinterConnection arPrinters.Item(i + 1)
    End If
  Next
End Sub

'--------------------------------------------------------------------------------'
Conectar impresoras

Sub ConnectPrinters(strListFile, strCompname)
Dim arrLinParts()
Dim strCadTratar
  Set ListFile = wshObj.OpenTextFile(strListFile, 1)
 
  Do While ListFile.AtEndOfStream <> True
    strCadTratar = ListFile.ReadLine
    arrLineParts = Split(strCadTratar, Space(1))
   
    MsgBox strCompname & " " & strCadTratar
    If UCase(strCompname) = UCase(arrLineParts(0)) Then
   
      For i = 0 To UBound(arrLineParts)
        If arrLineParts(i) <> "" Then
          wshNetwork.AddWindowsPrinterConnection UCase(arrLineParts(i))
        End If
      Next
     
      If arrLineParts(1) <> "" Then
        wshNetwork.SetDefaultPrinter UCase(arrLineParts(1))
      End If
    End If
  Loop
 
  ListFile.Close
End Sub


Título: Re: Mapeo de impresoras en red por usuarioa
Publicado por: efer27 en 1 Mayo 2011, 12:01 pm
Hola,

Alguien me puede ayudar ??