Centrum skryptów - Systemy operacyjne

Jak usunąć wszystkie drukarki sieciowe zainstalowane na komputerze?

Udostępnij na: Facebook

Skrypciarze odpowiadają na Wasze pytania

Witamy w rubryce TechNet, w której Skrypciarze z firmy Microsoft odpowiadają na częste pytania dotyczące używania skryptów w administracji systemu. Jeśli macie jakieś pytania z tej dziedziny, zachęcamy do wysłania e-maila na adres: scripter@microsoft.com. Nie możemy zagwarantować odpowiedzi na każde otrzymane pytanie, ale staramy się jak możemy.

 

Cześć, Skrypciarze! Czy można usunąć wszystkie drukarki sieciowe ze stacji roboczej za pomocą kodu VBScript w podobny sposób, w jaki usuwa się dyski sieciowe z komputera?

-- WDC

Cześć, WDC. Ci z Was, którzy codziennie śledzą naszą rubrykę TechEd preview report (j.ang.) wiedzą, że od jakiegoś czasu Skrypciarze są bardzo zajęci przygotowaniami do zbliżającego się wyjazdu do Barcelony na forum informatyczne TechEd. Ten raport daje Wam wgląd we wszystko, co robią Skrypciarze w ramach tych przygotowań; zanim odpowiem na zadane pytanie, dorzucę coś ekstra, czego nie znajdziecie na tej witrynie, a mianowicie zapis rozmowy pochodzącej Se spotkania poświęconego planowaniu przygotowań do tej wycieczki.

Jean Ross: Mamy zdecydowanie zbyt wiele do zrobienia.

Skrypciarz: Zgadzam się całkowicie. Naprawdę mamy zbyt wiele do zrobienia.

Jean Ross: Nie mam pojęcia w jaki sposób uda nam się zrobić wszystko na czas.

Skrypciarz: Ja też nie, czekaj już wiem: załóżmy, że do tego wszystkiego, co mamy zrobić dorzucimy jeszcze trzy rzeczy. To by rozwiązało nasze problemy, nieprawdaż?

Jean Ross: --

Zresztą nieważne, co Jean Ross odpowiedziała. Biedactwo; żyje ostatnio w strasznym stresie. Chociaż co prawda większość tego stresu wynika z samego faktu pracy ze Skrypciarzami.

Innymi słowy, wszystko idzie w dobrym kierunku. Zakładając, że do 8 listopada Jane nie wybuchnie, wsiądziemy spokojnie do samolotu i polecimy do Hiszpanii.

W każdym razie, jest na tyle dobrze, że mamy mnóstwo czasu na to, żeby pogawędzić sobie trochę na temat skryptu usuwającego wszystkie drukarki sieciowe ze stacji roboczej. Nie mam zamiaru niczego przed Wami ukrywać i przyznaję od razu, że w grudniu 2005 roku w naszej rubryce ukazał się podobny skrypt taki, który usuwa wszystkie lokalne drukarki z komputera. W zależności od tego, jak na to patrzeć, ktoś mógłby pomyśleć, że próbujemy tutaj kogoś naciągnąć; w końcu dokonamy niewielkiej zmiany w tym skrypcie i usuniemy wszystkie drukarki sieciowe.

Właśnie sobie uświadomiłem, że to naprawdę może się wydać nie fair.

Z drugiej strony jednak, w grudniu 2005 zaznaczyłem, że ów skrypt nie zadziała w systemie Windows 2000; zadziała jedynie w wersjach systemu Windows powstałych po systemie Windows 2000. Teraz, dwa lata później, postanowiłem zbadać sprawę działania takiego skryptu w starszych wersjach Windows. Na podstawie wyników tych dogłębnych badań pokażę najpierw, w jaki sposób usunąć drukarki sieciowe na komputerach z zainstalowanym systemem operacyjnym nowszym niż Windows 2000, a następnie, jak wykonać to samo zadanie na komputerach z systemem Windows 2000.

Oto skrypt dla systemów nowszych niż Windows 2000:

strComputer = "."



Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")



Set colInstalledPrinters = objWMIService.ExecQuery _

    ("Select * From Win32_Printer Where Network = True")



For Each objPrinter in colInstalledPrinters

    objPrinter.Delete_

Next

Jak widać, nie mam tu dużo do omawiania. Zaczynamy od połączenia się z usługą WMI na lokalnym komputerze. Jak zwykle w tym przypadku, możemy także zastosować ten skrypt na zdalnych komputerach. Jak? Po prostu przypisując nazwę tego zdalnego komputera do zmiennej o nazwie strComputer, w ten oto sposób:

strComputer = "atl-ws-001"

Po połączeniu się z usługą WMI wysyłamy następującą kwerendę w celu pobrania kolekcji wszystkich drukarek sieciowych zainstalowanych na komputerze:

Set colInstalledPrinters = objWMIService.ExecQuery _

    ("Select * From Win32_Printer Where Network = True")

Rzecz w tym, że uwzględniamy w tej kwerendzie klauzulę Where, która ogranicza pobrane dane do drukarek, których właściwość Network ma wartość True; chyba nie muszę wyjaśniać, że ta właściwość będzie miała wartość True tylko wtedy, gdy będziemy mieli do czynienia z drukarką sieciową. Tak przy okazji, jest to jeden z powodów, dla których skrypt nie współpracuje z systemem Windows 2000: klasa Win32_Printer w systemie Windows 2000 nie zwiera właściwości Network. (Ta właściwość została dodana w systemie Windows XP). Uprzedzając pytania: nie, nie ma takiej szansy, żeby wersja Windows 2000 systemu operacyjnego klasy Win32_Printer została w taki sposób zaktualizowana, żeby zaczęła uwzględniać tę właściwość.

Kochani użytkownicy Windows 2000! Nie martwcie się. Jak już mówiłem, pokażę Wam sposób, w jaki możecie rozwiązać ten problem. Cierpliwości. (W zasadzie nie musicie wykazywać się żadną cierpliwością, już prawie skończyłem z wersją dla tych nowszych systemów Windows.)

Po pobraniu kolekcji drukarek sieciowych uruchamiamy pętlę For Each, która przejdzie przez każdy element znajdujący się w kolekcji. Dla każdego elementu wywołujemy metodę Delete_ i dane połączenie drukarki zostanie usunięte:

objPrinter.Delete_

Ta-dam!

Teraz zabierzmy się za system Windows 2000. To trochę trudniejsze, a to z dwóch powodów. Po pierwsze, jak już zauważyłem, właściwość Network nie istnieje w systemie Windows 2000; to utrudnia rozpoznanie, czy dana drukarka jest drukarką sieciową, czy też nie. Po drugie, nie tylko właściwość Network nie jest obsługiwana przez klasę Win32_Printer; klasa Win32_Printer nie obsługuje również metody Delete_. Oznacza to, że musimy się trochę wysilić, żeby otrzymać kolekcję drukarek sieciowych, a potem przekazać tę kolekcję do hosta Windows Script Host (WSH) i pozwolić mu pousuwać drukarki za nas.

Uwaga: Oznacza to także, że wersja skryptu dla systemu Windows 2000 może zostać uruchomiona tylko na lokalnym komputerze. Jest tak dlatego, że metody WSH dotyczące dodawania/usuwania połączeń drukarek nie mogą zostać zastosowane dla zdalnych komputerów.

Tak, czy inaczej, oto skrypt dla systemu Windows 2000:

Const NETWORK = 22



Set objNetwork = CreateObject("WScript.Network")



strComputer = "."



Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")

Set colPrinters = objWMIService.ExecQuery("Select * From Win32_Printer")

     

For Each objPrinter in colPrinters

    If objPrinter.Attributes And NETWORK Then 

        strPrinter = objPrinter.Name

        objNetwork.RemovePrinterConnection strPrinter

    End If

Next

Tym razem zaczynamy od zdefiniowania stałej o nazwie NETWORK i nadajemy jej wartość 22; ta stała pomoże nam określić, czy dana drukarka jest drukarką sieciową, czy lokalną. Następnie tworzymy wystąpienie obiektu Wscript.Network, który możemy wykorzystać do usunięcia drukarek z komputera.

Teraz łączymy się z usługą WMI (pamiętajcie – tylko lokalne komputery) i stosujemy poniższy wiersz kodu w celu pobrania kolekcji wszystkich drukarek zainstalowanych na komputerze:

Set colPrinters = objWMIService.ExecQuery("Select * From Win32_Printer")

Macie zupełną rację: nie chcemy usunąć wszystkich drukarek z komputera, nieprawdaż? Chcemy usunąć tylko drukarki sieciowe. Dlatego też, po ustawieniu pętli For Each, która przejdzie przez kolekcję drukarek, stosujemy poniższy wiersz kodu:

If objPrinter.Attributes And NETWORK Then

Jak się okazuje, właściwość Attributes jest właściwością „maski bitowej”, która może zawierać więcej niż jedną wartość. Mapy bitowe składają się z „przełączników”, które mogą być włączone lub wyłączone; na przykład właściwość Attributes posiada „przełącznik” o wartości 22 wskazujący na to, czy dana drukarka jest drukarką sieciową. Jeżeli ten przełącznik jest włączony, mamy do czynienia z drukarką sieciową; jeżeli jest wyłączony – z drukarką lokalną. Poprzedni wiersz kodu służy po prostu do sprawdzenia, czy przełącznik Network jest włączony. Jeżeli jest, przypisujemy nazwę Name drukarki do zmiennej o nazwie strPrinter, a następnie stosujemy poniższy wierz kodu w celu usunięcia danego połączenia drukarki:

objNetwork.RemovePrinterConnection strPrinter

Teraz kontynuujemy działanie pętli i powtarzamy proces od początku dla następnej drukarki z naszej kolejki. Nie jest to może najbardziej szykowny skrypt na świecie, a na dodatek jest ograniczony do komputerów lokalnych 9co czyni go kandydatem do włączenia do skryptu logowania), ale działa.

Tak przy okazji, lokalne drukarki mają własny przełącznik o wartości 100. W jaki sposób może to pomóc w wyszukiwaniu lokalnych drukarek? No cóż, w celu wyszukania lokalnych drukarek najpierw definiujemy stałą o nazwie LOCAL, o wartości 100:

Const LOCAL = 100

A potem sprawdzamy każdą drukarkę na komputerze żeby sprawdzić, czy przełącznik lokalny jest włączony, czy wyłączony:

If objPrinter.Attributes And LOCAL Then

Na mnie już czas, muszę wracać do pracy. Jak się pewnie domyślacie, nie możemy się doczekać spotkania z wszystkimi, którzy zechcą z nami porozmawiać w Barcelonie, zatem jeżeli bierzecie udział w forum informatycznym TechEd, zajrzyjcie na stoisko do sekcji Ask the Experts. Może nawet uda Wam się pogawędzić z samą Jean Ross. Tak czy inaczej czekają na Was egzemplarze książeczek doktora Scripto oraz płyty CD zawierające całe mnóstwo artykułów związanych ze skryptami (i nie tylko – ale to niespodzianka) i być może nawet wygracie jedną z pozostałych laleczek doktora Scripto. Czegóż można chcieć więcej?

 Do początku strony Do początku strony

Centrum skryptów - Systemy operacyjne