Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   [решено] Помогите подштриховать bat (printui.dll,PrintUIEntry) (http://forum.oszone.net/showthread.php?t=145186)

batyaPS 15-07-2009 12:15 1168141

Помогите подштриховать bat (printui.dll,PrintUIEntry)
 
В домене на каждой машине имеются принтеры clp1 clp2 clp3 clp4 hp199 hp200 (установлены по IP)
на некоторых установлен Canon (LBP2900 локально) либо clp5 (тот же Canon только переименован).

наваял bat файл

читать дальше »

://cmdow @ /hid /min
://@echo off

:// на каждой машине имеются принтеры clp1 clp2 clp3 clp4 hp199 hp200 (по IP) на некоторых установлен
Canon (локально) либо clp5 (тот же Canon только переименован)

:// Удаляем все возможные имеющиеся сетевые принтеры.
rundll32 printui.dll,PrintUIEntry /dn /q /n\\it2_996801\Canon
rundll32 printui.dll,PrintUIEntry /dn /q /n\\zgb_996801\Canon
rundll32 printui.dll,PrintUIEntry /dn /q /n\\bkass_996801\Canon
rundll32 printui.dll,PrintUIEntry /dn /q /n\\zdgm_996801\Canon
rundll32 printui.dll,PrintUIEntry /dn /q /n\\zpek_996801\Canon
rundll32 printui.dll,PrintUIEntry /dn /q /n\\sspr_996801\Canon
rundll32 printui.dll,PrintUIEntry /dn /q /n\\zs2_996801\clp5
rundll32 printui.dll,PrintUIEntry /dn /q /n\\sb1_996801\Canon
rundll32 printui.dll,PrintUIEntry /dn /q /n\\zhoz_996801\Canon
rundll32 printui.dll,PrintUIEntry /dn /q /n\\gi_996801\Canon

:// если имя компа = xxx то идем туда то
if %computername%==IT1_996801 goto it2_996801
if %computername%==IT2_996801 goto root
if %computername%==BKASS_996801 goto root
if %computername%==ZGB_996801 goto root
if %computername%==PB_996801 goto zgb_996801
if %computername%==BUHPR_996801 goto zgb_996801
if %computername%==SEMENOVA goto zgb_996801
if %computername%==BZP_996801 goto zgb_996801
if %computername%==GB_996801 goto zgb_996801
if %computername%==ZDGM_996801 goto root
if %computername%==ZDGM2_996801 goto zdgm_996801
if %computername%==DGM_996801 goto zdgm_996801
if %computername%==RAO2_996801 goto zdgm_996801
if %computername%==RAO1_996801 goto zdgm_996801
if %computername%==TR_996801 goto zdgm_996801
if %computername%==ZPEK_996801 goto root
if %computername%==SSPEK_996801 goto zpek_996801
if %computername%==SSPR_996801 goto root
if %computername%==ZPR_996801 goto sspr_996801
if %computername%==ZS2_996801 goto clp5
if %computername%==ZS1_996801 goto zs2_996801
if %computername%==NRKZ_996801 goto zs2_996801
if %computername%==SB1_996801 goto root
if %computername%==ZDGM1_996801 goto sb1_996801
if %computername%==ZHOZ_996801 goto root
if %computername%==GI_996801 goto root
if %computername%==ING_996801 goto gi_996801
if %computername%==MP_996801 goto hp199
if %computername%==SDEL_996801 goto hp199
if %computername%==MP_996801 goto hp199
if %computername%==SOP_996801 goto hp200
if %computername%==OP1_996801 goto hp200
if %computername%==OP2_996801 goto hp200
if %computername%==SSPR_996801 goto hp200
if %computername%==NSP_996801 goto hp200
if %computername%==STFAS_996801 goto hp200

goto end

:root
rundll32 printui.dll,PrintUIEntry /y /q /n\\%computername%\Canon

goto end

:hp199
rundll32 printui.dll,PrintUIEntry /y /q /n\\%computername%\hp199

goto end

:hp200
rundll32 printui.dll,PrintUIEntry /y /q /n\\%computername%\hp200

goto end

:clp5
rundll32 printui.dll,PrintUIEntry /y /q /n\\%computername%\clp5

goto end

:it2_996801
rundll32 printui.dll,PrintUIEntry /in /u /w /q /n\\it2_996801\Canon
rundll32 printui.dll,PrintUIEntry /y /q /n\\it2_996801\Canon

goto end

:zgb_996801
rundll32 printui.dll,PrintUIEntry /in /u /w /q /n\\zgb_996801\Canon
rundll32 printui.dll,PrintUIEntry /y /q /n\\zgb_996801\Canon

goto end

:zdgm_996801
rundll32 printui.dll,PrintUIEntry /in /u /w /q /n\\zdgm_996801\Canon
rundll32 printui.dll,PrintUIEntry /y /q /n\\zdgm_996801\Canon

goto end

:zpek_996801
rundll32 printui.dll,PrintUIEntry /in /u /w /q /n\\zpek_996801\Canon
rundll32 printui.dll,PrintUIEntry /y /q /n\\zpek_996801\Canon

goto end

:sspr_996801
rundll32 printui.dll,PrintUIEntry /in /u /w /q /n\\sspr_996801\Canon
rundll32 printui.dll,PrintUIEntry /y /q /n\\sspr_996801\Canon

goto end

:zs2_996801
rundll32 printui.dll,PrintUIEntry /in /u /w /q /n\\zs2_996801\clp5
rundll32 printui.dll,PrintUIEntry /y /q /n\\zs2_996801\clp5

goto end

:sb1_996801
rundll32 printui.dll,PrintUIEntry /in /u /w /q /n\\sb1_996801\Canon
rundll32 printui.dll,PrintUIEntry /y /q /n\\sb1_996801\Canon

goto end

:gi_996801
rundll32 printui.dll,PrintUIEntry /in /u /w /q /n\\gi_996801\Canon
rundll32 printui.dll,PrintUIEntry /y /q /n\\gi_996801\Canon

goto end

:end


вроде работает / Но смущает долгая отработка первого этапа bat ника .(удаление всех возможных сетевых принтеров)

Помогите отладить данный bat ник , что бы можно или как то проверять наличие сетевого принтера
с последующим его удалением или заменить перебор принтеров для удаления одной командой (только сетевых )

NiOl 15-07-2009 12:57 1168202

Часть с удалением принтеров (извини, проверять у себя как-то неохота... :o )
можно попробовать распараллелить, запустив все копии printui.dll одновременно.
Список принтеров можно для красоты сунуть в одну строку и выбирать в цикле...

Код:

set ToDel=it2_996801\Canon zgb_996801\Canon bkass_996801\Canon zdgm_996801\Canon zpek_996801\Canon sspr_996801\Canon zs2_996801\clp5 sb1_996801\Canon zhoz_996801\Canon gi_996801\Canon
:L01
for /F "tokens=1*" %%P in ("%ToDel%") do (
start rundll32 printui.dll,PrintUIEntry /dn /q /n\\%%P
set ToDel=%%Q
)
if not "%ToDel%"=="" Goto L01

Если поможет - попробуй также поступить и с проверками.

batyaPS 15-07-2009 14:58 1168384

NiOl, опробую , отпишу .

amel27 15-07-2009 16:58 1168503

Цитата:

Цитата batyaPS
можно или как то проверять наличие сетевого принтера
с последующим его удалением или заменить перебор принтеров для удаления одной командой (только сетевых ) »

Код:

For /F "Tokens=1,2 Skip=1" %%i In ('WMIC Printer Where Network^=TRUE Get ShareName^,ServerName^,WorkOffLine') Do rundll32 printui.dll,PrintUIEntry /dn /q /n%%i\%%j
З.Ы. а не проще включить компы в группы и проверять членство вместо перебора?.. чуть дольше, зато практичней

batyaPS 15-07-2009 20:08 1168681

Цитата:

Цитата amel27
З.Ы. а не проще включить компы в группы и проверять членство вместо перебора?.. чуть дольше, зато практичней »


0. проще .
1. Нет доступа с контроллеру домена и групп. политике (есть головная компания, и мы, так сказать, с урезанными правами .) по этому что либо делать с группами , доменами и т.д. нам запрещено .
2. компы часто перемещаются относительно здания по этому жестко привязывать их к группам не льзя.

Цитата:

Цитата amel27
For /F "Tokens=1,2 Skip=1" %%i In ('WMIC Printer Where Network^=TRUE Get ShareName^,ServerName^,WorkOffLine') Do rundll32 printui.dll,PrintUIEntry /dn /q /n%%i\%%j »

если честно не совсем понял строку и что она делает . если не трудно можно расшифровать
и подставить сразу те переменные которые мною используются домен допустим DUMM

amel27 16-07-2009 02:56 1168965

batyaPS,
1. понимаю, сами так работаем - нужны права на создание своих групп (в своем OU) и включение в них компов
2. не понимаю, при чем тут расположение... например, "OU01-hp200" - компы, кот.печатают на hp200; комп переехал - перекинул его в другую группу, скажем, "OU01-Canon" - сам скрипт при этом править не нужно

Цитата:

Цитата batyaPS
не совсем понял строку и что она делает »

удаляет все сетевые принтеры, WMIC выводит параметры принтеров, которые затем используются в вызове printui.dll,PrintUIEntry:
Код:

WMIC Printer Where Network=TRUE Get ShareName,ServerName

batyaPS 17-07-2009 20:20 1170852

большое спасибо amel27 и NiOl, оба ваши варианты полностью рабочие .
с отличием в том , что один может удалять принтеры только заведомо принадлежащие к организации(или через список ) .

а второй может удалить все возможные принтеры сетевые .

batyaPS 28-12-2010 20:33 1576520

обновлю тему .

ранее на машинах 2k
строка rundll32 printui.dll,PrintUIEntry /y /q /n\\%computername%\Canon
(устанавливает локальный принтер по умолчанию)
работало корректно.

сейчас перевел машины на XP и данная строка больше не отрабатывает у пользователей .
т.е. под администратором работает, а под пользователем нет .

причем строка rundll32 printui.dll,PrintUIEntry /in /u /w /q /n\\zpek_996801\Canon
(установка сетевого принтера)
проходит без проблем .

вывода ошибки в консоли нет . т.е. после выполнения команды делается перевод строки и все (как будто все выполнилось)

подскажите ... на что нужно дать права что бы у пользователей корректно отрабатывала строка
rundll32 printui.dll,PrintUIEntry /y /q /n\\%computername%\Canon


Время: 11:20.

Время: 11:20.
© OSzone.net 2001-