PDA

Показать полную графическую версию : [решено] Сетевые принтеры.


KatAst
27-04-2015, 21:37
Здравствуйте. Есть ли простой способ сменить ip-адрес "server" в "\\server\printer" при помощи командной строки?

\\192.168.1.5\hp5505 = \\10.20.1.5\hp5505

Заранее спасибо.

Blast
27-04-2015, 21:43
Посмотрите здесь: Добавление принтера без вмешательства пользователя в Windows (https://support.microsoft.com/en-us/kb/189105/ru). Можете попробовать последовательное выполнение команд по удалению существующего принтера и добавлению нового.

KatAst
27-04-2015, 22:04
Blast, смущает необходимость указания и установки драйверов...необходима универсальность. Предположим, получу имя компьютера, наименование принтера...а драйвера...хм, может есть другие варианты? Может в реестре какое-нибудь значение сменить? Хотелось бы каким-нибудь bat-ником производить замену. Если есть такая возможность.

KatAst
28-04-2015, 15:24
Blast, нашёл такой сценарий. Что Вы о нём думаете? как ему можно передавать параметры имени старого и нового сервера для каждого принтера?



'Автор - Randy Foster
'Адрес электронной почты - rfoster_2000@excite.com
'MCSE NT4, 2000
'MCSA 2003
'MCDBA SQL7, SQL2000
'CCNA

'Этот сценарий успешно применяется в сценариях регистрации. При запуске на рабочей станции
' он обрабатывает все принтеры, установленные для текущего зарегистрированного
' пользователя. Если принтеры связаны со старым сервером, то они будут удалены,
' а затем сопоставлены новому серверу. Сценарий также пытается обнаружить
' принтер по умолчанию, чтобы отменить назначение, если данный принтер предстоит
' переместить.

'Примечание: все принтеры должны существовать на новом сервере, прежде чем будет
'запущен этот сценарий. В противном случае принтер будет просто удален из
'профиля пользователя, и сценарий не сможет вновь подключить принтеры.
' "Print Migrator" -- утилита из набора ресурсов Windows 2000 и
' Windows 2003. С ее помощью можно создать все принтеры
' на новом сервере, сохранив все их параметры, в том числе
' настройки безопасности очереди печати. Учтите, что если выполнить поиск
' принтеров, то в течение некоторого времени будут видны дублированные
' принтеры, по одному на каждом сервере.

' Этот метод был использован для перемещения более 100 принтеров с одного сервера на другой
' с последующим запуском сценария как сценария регистрации в групповой политике.
' Он выполнялся несколько дней, чтобы его запустили и пользователи,
' которые не завершают свой сеанс ежедневно. Все профили пользователей
' в компании были обновлены незаметно для сотрудников. Затем все принтеры
' были удалены со старого сервера.
' Примечание: сценарий не выполняется при дистанционном управлении через терминальные службы или SMS.

Option Explicit
Dim from_sv, to_sv, PrinterPath, PrinterName, DefaultPrinterName,
DefaultPrinter
Dim DefaultPrinterServer, SetDefault, key
Dim spoint, Loop_Counter
Dim WshNet, WshShell
Dim WS_Printers
DefaultPrinterName = ""
spoint = 0
SetDefault = 0
set WshShell = CreateObject("WScript.shell")

from_sv = "cosrv" 'Имя старого сервера.
to_sv = "co-data-01" 'Имя нового сервера.

'В случае, если принтеры отсутствуют и поэтому не назначен принтер
' по умолчанию, данная мера поможет избежать завершения сценария с ошибкой.

On Error Resume Next
key = "HKCUSoftwareMicrosoftWindows NTCurrentVersionWindowsDevice"
DefaultPrinter = LCase(WshShell.RegRead (key))
If Err.Number <> 0 Then
DefaultPrinterName = ""
else

'Если чтение реестра выполнено успешно, то производится разбор имени принтера, чтобы
' впоследствии сравнить его с каждым принтером и назначить верный принтер
' по умолчанию, если один из них совпадает с прочитанным из реестра.

spoint = instr(3,DefaultPrinter,"")+1
DefaultPrinterServer = left(DefaultPrinter,spoint-2)
if DefaultPrinterServer = from_sv then
DefaultPrinterName = mid(DefaultPrinter,spoint,len(DefaultPrinter)-spoint+1)
end if
end if
Set WshNet = CreateObject("WScript.Network")
Set WS_Printers = WshNet.EnumPrinterConnections

'Шаг должен быть 2, так как только четные числа являются именем сервера и общего ресурса
' очереди печати. Нечетные числа -- имена принтеров.

For Loop_Counter = 0 To WS_Printers.Count - 1 Step 2

'Не забудьте + 1, чтобы получить полный путь, то есть .. ваш_серверваш_принтер.

PrinterPath = lcase(WS_Printers(Loop_Counter + 1))

'Нужно работать столько с сетевыми принтерами, сопоставленными с исходным
' сервером, поэтому проверяем "ваш_сервер".

if LEFT(PrinterPath,len(from_sv)) = from_sv then

'Теперь нужно выполнить разбор пути принтера, чтобы получить имя принтера.
spoint = instr(3,PrinterPath,"")+1
PrinterName = mid(PrinterPath,spoint,len(PrinterPath)-spoint+1)

'Удаляем старое соединение с принтером,

WshNet.RemovePrinterConnection from_sv+""+PrinterName

'а затем создаем новое.
WshNet.AddWindowsPrinterConnection to_sv+""+PrinterName

'Если этот принтер совпадает с принтером по умолчанию, полученным из реестра, то
' назначаем его принтером по умолчанию.

if DefaultPrinterName = PrinterName then
WshNet.SetDefaultPrinter to_sv+""+PrinterName
end if
end if
Next
Set WS_Printers = Nothing
Set WshNet = Nothing
Set WshShell = Nothing

Iska
28-04-2015, 15:34
нашёл такой сценарий. Что Вы о нём думаете? »
Думаю, Вы потеряли часть содержимого из кода при его копировании из источника. Либо же, он был в таком виде и там, где Вы его брали.

Чтение реестра и разбор полученной строки для определения принтера по умолчанию вместо использования Wbem также не сильно радуют.

KatAst
29-04-2015, 17:31
Iska, сегодня решил что-нибудь состряпать в свободное время...как получится...просьба сильно не ругаться и указать на ошибки:


for /f "Skip=1 tokens=4 delims=. " %%i In ('WMIC Printer Where default^=TRUE Get ServerName^') do set ipprint=%%i

if %ipprint% lss 1 exit

for /f "Skip=1 delims=" %%i In ('WMIC Printer Where default^=TRUE Get ShareName^') do set nprint=\\10.20.1.%ipprint%\%%i && goto 1

:1

%windir%\system32\cscript.exe instpr.vbs //nologo //b %nprint%



if wscript.Arguments.Count=0 then
WScript.Quit

else
Set WshNetwork = WScript.CreateObject("WScript.Network")
PrinterPath = wscript.Arguments(0)
WshNetwork.AddWindowsPrinterConnection PrinterPath
WshNetwork.SetDefaultPrinter PrinterPath

End if

WScript.Quit


P.S.: Наверно, бессмысленно было добавлять в vbs оператор ЕСЛИ...но так,на всякий...

KatAst
02-05-2015, 02:47
Сработает ли через групповую политику?

upd: C некоторыми исправлениями, работает.




© OSzone.net 2001-2012