Автоматическое подключение принтеров

Windows Script Host (WSH), WMI, vbs скрипты и т.д. Создание и применение скриптов.

Модератор: Модераторы

Администратор
Сообщения: 3444
Зарегистрирован: 19 дек 2003, 13:36
Откуда: Москва

Сообщение domovoy » 09 мар 2005, 11:25

Сделан небольшой скрипт для автоматического подключения сетевых принтеров пользователям.
Принтер подключается пользователю в зависимости от прописанного в свойствах компьютера Размещения (Location).

Код
'Подключение принтеров пользователям исходя из прописанного размещения комьютера

'Определяем значание поля Location (Размещение)
Option Explicit
Dim WSHNetwork, Computer, Path, strComputerDN, objSysInfo, objComputer, sPrintPath
Set WSHNetwork = CreateObject("WScript.Network")
On Error Resume Next
Path = WSHNetwork.ComputerName
Set objSysInfo = CreateObject("ADSystemInfo")
strComputerDN = objSysInfo.ComputerName
Set objComputer = GetObject("LDAP://" & strComputerDN)

'Назначаем необходимый для установки сетевой принтер
Select Case objComputer.Get("Location")
 Case "Отдел IT"
     sPrintPath = "\\server1\HPLaserJ"
 Case "Туристический отдел"
     sPrintPath = "\\server1\HP1100"
 Case "Отдел 1"
     sPrintPath = "\\server2\HPLaserJ"
 Case "Касса"
       sPrintPath = "\\ANNA\CanonLBP"
 Case "Отдел 2"
     sPrintPath = "\\server3\HP1200viz"
 Case Else
  MsgBox("Для установки принтера обратитесь в отдел тех. поддержки или к  системному администратору.") :WScript.Quit
End Select

'Подключаем принтер и делаем его принтером по умолчанию
WSHNetwork.AddWindowsPrinterConnection sPrintPath
WSHNetwork.SetDefaultPrinter sPrintP[s]ath
[/code]


Необходимо
добавить проверку если принетр уже подключен не производить его повторное подключение, так как у некоторых пользователей для печати спец. бланков изменены настройки принтера, а при переподключении они могут сбрасываться.
Правильно заданный вопрос - это уже половина ответа.

хм...
Аватара пользователя
Сообщения: 611
Зарегистрирован: 07 апр 2004, 17:10
Откуда: ссср

Сообщение Stratofortress » 14 мар 2005, 19:22

статья полезная.

дополнительно
http://www.codecomments.com/archive303- ... 89627.html
— работать с принтерами и портами TCP/IP.
нет времени разбираться — наймите того, кто знает.

Новый участник
Сообщения: 2
Зарегистрирован: 16 мар 2005, 13:38

Сообщение GL@DI@TOR » 16 мар 2005, 14:14

Цитата (domovoy @ 9.03.2005 - 10:25)
Необходимо
добавить проверку если принетр уже подключен не производить его повторное подключение, так как у некоторых пользователей для печати спец. бланков изменены настройки принтера, а при переподключении они могут сбрасываться.
[/quote]

Проверку можно сделать по значению Location (Размещение), предварительно задав его в свойствах принтера. У меня это получилось так:
Код
'Подключение принтеров пользователям исходя из прописанного размещения комьютера

'Определяем значание поля Location (Размещение)
Option Explicit
Dim WSHNetwork, Computer, Path, strComputerDN, objSysInfo, objComputer, sPrintPath, NetwPrinters, PrintLocation, objWMIService, colInstalledPrinters, objPrinter
Set WSHNetwork = CreateObject("WScript.Network")
On Error Resume Next
Path = WSHNetwork.ComputerName
Set objSysInfo = CreateObject("ADSystemInfo")
strComputerDN = objSysInfo.ComputerName
Set objComputer = GetObject("LDAP://" & strComputerDN)

'Назначаем необходимый для установки сетевой принтер
Select Case objComputer.Get("Location")
Case "Отдел IT"
    sPrintPath = "\\server1\HPLaserJ"
    PrintLocation = "HPLaserJ_server1"
Case "Туристический отдел"
    sPrintPath = "\\server1\HP1100"
    PrintLocation = "HP1100_server1"
Case "Отдел 1"
    sPrintPath = "\\server2\HPLaserJ"
    PrintLocation = "HPLaserJ_server2"
Case "Касса"
    sPrintPath = "\\ANNA\CanonLBP"
    PrintLocation = "CanonLBP_ANNA"
Case "Отдел 2"
    sPrintPath = "\\server3\HP1200viz"
    PrintLocation = "HP1200viz_server3"
Case Else
 MsgBox("Для установки принтера обратитесь в отдел тех. поддержки или к  системному администратору.") :WScript.Quit
End Select

'Выполняем проверку установленных принтеров
Set objWMIService = GetObject("winmgmts:" _
   & "{impersonationLevel=impersonate}!\\" & "." & "\root\cimv2")

Set colInstalledPrinters =  objWMIService.ExecQuery _
   ("Select * from Win32_Printer")
   
For Each objPrinter in colInstalledPrinters
 If  PrintLocation = objPrinter.Location  Then
    WScript.Quit
 End if
Next

'Подключаем принтер и делаем его принтером по умолчанию
WSHNetwork.AddWindowsPrinterConnection sPrintPath
WSHNetwork.SetDefaultPrinter sPrintPath
[/code]
Администратор
Сообщения: 3444
Зарегистрирован: 19 дек 2003, 13:36
Откуда: Москва

Сообщение domovoy » 17 мар 2005, 11:30

GL@DI@TOR
Цитата
Проверку можно сделать по значению Location (Размещение),
[/quote]

Действительно можно, а вот это мне в голову не пришло. :)

Ок вношу правку в статью B)
Правильно заданный вопрос - это уже половина ответа.

Новый участник
Сообщения: 4
Зарегистрирован: 30 мар 2005, 16:37

Сообщение SoccerMan » 30 мар 2005, 16:39

На моей тестовой системе (WinXP) все прошло на ура. А вот на тачках с Win2k вылезает такая ошибка:

Windows Script Host ругается на строчку: Select Case objComputer.Get("Location")
Error: Свойства службы каталогов Active Directory не могут быть найдены в кэше

Как это побороть?

Администратор
Сообщения: 3444
Зарегистрирован: 19 дек 2003, 13:36
Откуда: Москва

Сообщение domovoy » 30 мар 2005, 18:06

Странно проверил у себя все работает на W2k
Попробуй у себя запусть такой скрипт поправив соответсвенно строку LDAP

Код
Option Explicit
Dim objConnection, objCommand, objRecordSet, objComputer
Const ADS_SCOPE_SUBTREE = 2


Set objConnection = CreateObject("ADODB.Connection")
Set objCommand =   CreateObject("ADODB.Command")
objConnection.Provider = "ADsDSOObject"
objConnection.Open "Active Directory Provider"

Set objCOmmand.ActiveConnection = objConnection

objCommand.CommandText = _
   "Select Name, Location from 'LDAP://DC=Computers,DC=domain,DC=ru' " _
       & "Where objectClass='computer'"  
objCommand.Properties("Page Size") = 1000
objCommand.Properties("Searchscope") = ADS_SCOPE_SUBTREE
Set objRecordSet = objCommand.Execute
objRecordSet.MoveFirst

Do Until objRecordSet.EOF

   Wscript.Echo "Computer Name: " & objRecordSet.Fields("Name").Value
   Wscript.Echo "Location: " & objRecordSet.Fields("Location").Value
objRecordSet.MoveNext
Loop
[/code]


Если пройдет нормально после этого запусти вручную сккпипт подключения
Правильно заданный вопрос - это уже половина ответа.

Новый участник
Сообщения: 4
Зарегистрирован: 30 мар 2005, 16:37

Сообщение SoccerMan » 31 мар 2005, 14:01

domovoy

Строку LDAP попровил. Скрипт запустил. Работает - выдает по очереди имена компов в АД и их Location.

Однако не до не после заупска этого скрипта Printer.vbs не работает - та же ошибка :(

P.S. Была мысль, что не рабоает, потому что Location для данного компа никакой не прописан - прописал - не помогло :(

Что еще можно попробовать?

Администратор
Сообщения: 3444
Зарегистрирован: 19 дек 2003, 13:36
Откуда: Москва

Сообщение domovoy » 31 мар 2005, 14:29

SoccerMan
если не прописан должен был выдать сообшени о том что админ сам все должен сделать по поводу принтера. (там в теле скрипта смотри)
Это на всех w2k происходит ?
Правильно заданный вопрос - это уже половина ответа.

Новый участник
Сообщения: 4
Зарегистрирован: 30 мар 2005, 16:37

Сообщение SoccerMan » 31 мар 2005, 16:54

Ура! заработало!

domovoy
Сорри, это моя ошибка. Я немного видоизменял скрипт, чтобы добиться подключения нескольких принтеров. Видимо зацепил случайно еще что-нибудь.

Скрипт из форума пашет. В том что опубликован в статье на сайте объявлены не все переменные... но от этого спасает on error resume next.

Администратор
Сообщения: 3444
Зарегистрирован: 19 дек 2003, 13:36
Откуда: Москва

Сообщение domovoy » 31 мар 2005, 21:57

;) Есть такое ща поправлю переменные в статье.
Правильно заданный вопрос - это уже половина ответа.

След.

Вернуться в Скрипты

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1