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
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!!
CitarLeer 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:
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)...
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
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
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
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
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
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
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
Citarlo 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
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
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
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
Hola,
Gracias 0,0 por responder a mi preguntael script esta bien.
Que cambios se tendria que hacer ??
Saludos
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 &
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.
En cuanto tenga un rato lo miro, pero por lo pronto hay partes del script que estan comentadas, sin las cuales no funciona :-\
Saludos
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
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.
Es que esta línea por ejemplo viene comentada ...
Set objADSystemInfo = CreateObject("ADSystemInfo")
...y sin eso, desde el vamos no podrás obtener los atributos del AD :P
Saludos
Si, descomenté el
Set objADSystemInfo = CreateObject("ADSystemInfo")
y el siguiente
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:
CitarIn 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?
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
Yo lo decía porque el siguiente problema que se encuentra es el bTroubleFlag y justo aparece con el dim
CitarFor 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.
Esa "bandera" es una chapuza de alguien :xD , así debería de funcionar
on error resume next
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)
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
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
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)
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)
objNetwork.SetDefaultPrinter objGroupEnum.description
set objGroupEnum = nothing
end if
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
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.
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
0,0 ,es que eso no es lo que hace el script, lo único que he hecho es adaptar el que habías puesto.
'Coleccion de grupos a los que pertenece el usuario
objMemberOf = objUser.MemberOf
'Por cada grupo en la lista
for Each objGroup in objMemberOf
'Si hay una unidad con nombre Printer-Groups
if (instr(objGroup,"OU=Printer-Groups") <> 0) then
'Obtenemos el grupo
set objGroupEnum = GetObject("LDAP://" & objGroup)
'Nos conectamos a la impresora utilizando la ruta que aparece en la descripcion de grupo
objNetwork.AddWindowsPrinterConnection objGroupEnum.description
set objGroupEnum = nothing
end if
next
Saludos
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
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
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.
efer27, ¿Has creado la OU "Printer-Groups" y has metido en ella los usuarios asociados a las impresoras?
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í;
'Bind to the group to get is description. The description contain the path to the printer
set objGroupEnum = GetObject("LDAP://" & objGroup)
objNetwork.AddWindowsPrinterConnection objGroupEnum.description
Saludos
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
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 ?
Public Sub EliminarPRN(pobjNetwork)
Dim objPrinter
'Creación objeto prn red
Set objPrinter = pobjNetwork.EnumPrinterConnections
'Comprueba si hay alguna impresora asignada
MsgBox objPrinter.Count
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
'Comprueba si es una impresora de red
if instr(objPrinter.Item(i),"\\") <> 0 Then
pobjNetwork.RemovePrinterConnection
objPrinter.Item(i),true,true
MsgBox objPrinter.Item(1) & "-" & objPrinter.Item(2) & " Error:" & Error
End if
next
end if
End Sub
Si, que el código que pones es para Visual Basic (VB6) y no Visual Basic Script (vbs)
Saludos
Dejando solo el FOR al termino de la sentencia me sale igual
Hola,
Ahora me sale este mensaje al remover las impresoras
erro linea 31 columna 13 source: objNetwork.RemovePrinterConnection
saludos
Ahora de que script estamos hablando?
Saludos
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
ok, ¿que tipo de error da? en el mensaje debe de tener una descripción.
Saludos
hola sale este mensaje
erro linea 31 columna 13 source: objNetwork.RemovePrinterConnection
no puede quitar las impresoras de red mapeadas
Ahí lo tienes claramente, probablemente sea problema de permisos.
Saludos
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
Por si acaso abre una consola con permisos de administrador, y desde ahí ejecuta el script.
Saludos
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
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
Hola,
Alguien me puede ayudar ??