Centrum skryptów - Systemy operacyjne

Jak dodać drukarkę sieciową podczas logowania i, opcjonalnie, zrobić z niej drukarkę domyślną?

Udostępnij na: Facebook

Cześć Skrypciarze!

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.

Jak dodać drukarkę sieciową podczas logowania i, opcjonalnie, zrobić z niej drukarkę domyślną?

Cześć Skrypciarze! Pytanie

Cześć, Skrypciarzu! Jak dodać drukarkę sieciową podczas logowania? Chciałbym również, żeby była ona drukarką domyślną, o ile użytkownik nie ma drukarki lokalnej. W takim przypadku nie chcę, żeby drukarka sieciowa była domyślną.

-- DB

Cześć Skrypciarze! Odpowiedź

Hej, DB. Jak leci? Niezłą pogodę mamy/macie ostatnio, prawda?

Przepraszam, jak widać pisanie tej rubryki zaczyna być kłopotliwe. Jak wspominaliśmy wczoraj, Skrypciarz piszący tę rubrykę jest na urlopie; właściwie to rubryka, którą teraz czytacie została napisana kilka dni temu. Myślicie pewno, że to nie powinno robić różnicy w przypadku rubryki poświęconej skryptom - w końcu, w świecie skryptów nie ma zbyt wielu wydarzeń z ostatniej chwili. Ale my - Skrypciarze - nie chcemy, żeby to była rubryka jak inne; aby odróżnić się od konkurencji lubimy wstawiać do naszej rubryki odniesienia do bieżących wydarzeń w świecie zewnętrznym. Trudno jednak o odniesienia do bieżących wydarzeń, gdy rubrykę piszę się z wyprzedzeniem i te zdarzenia jeszcze nie nastąpiły.

Uwaga: No jasne, oczywiście Peter to potrafi. Ale Peter, jako najstarszy żyjący Skrypciarz, ma nieuczciwą przewagę: jest o tyle starszy od nas, że już widział wszystko co może się wydarzyć, zazwyczaj zresztą więcej niż jeden raz. Co nie jest prawdą w przypadku takich młodzieniaszków jak reszta Skrypciarzy.

A to wszystko oznacza, oczywiście, że kompletnie nie mamy o czym dzisiaj pisać. Przepraszamy.

Pardon? Pisać o skryptach? No cóż, to wydaje się trochę nie na miejscu w codziennej rubryce poświęconej skryptom. Z drugiej strony dziś jesteśmy w dość rozpaczliwym położeniu. Więc, co nam zależy:

strComputer = "."



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



Set colPrinters = objWMIService.ExecQuery _

    ("Select * From Win32_Printer Where Local = TRUE")



Set objNetwork = CreateObject("WScript.Network")

objNetwork.AddWindowsPrinterConnection "\\PrintServer1\Xerox300"



If colPrinters.Count = 0 Then

    objNetwork.SetDefaultPrinter "\\PrintServer1\Xerox300"

End If

Jak widzicie zaczynamy od połączenia z usługą WMI na lokalnym komputerze. Czy moglibyśmy uruchomić ten skrypt na komputerze zdalnym? W tym przypadku nie; a to dlatego, że użyjemy usługi Windows Script Host (WSH) do zamapowania drukarki sieciowej, a WSH może wykonać to jedynie na komputerze lokalnym. Ale nie ma problemu, ponieważ jest to skrypt logowania, nie potrzebujemy używać go na komputerach zdalnych. Skrypty logowania zawsze są wykonywane lokalnie.

Po połączeniu z usługą WMI, wywołujemy następującą kwerendę, by uzyskać listę lokalnych drukarek podłączonych do komputera:

Set colPrinters = objWMIService.ExecQuery _ 

    ("Select * From Win32_Printer Where Local = TRUE")

Należy pamiętać, że ta kwerenda (a więc i cały skrypt) zadziała tylko na komputerach z systemem Windows XP, Windows Server 2003 lub Windows Vista. Dlaczego? Ponieważ jedynie w tych systemach operacyjnych klasa Win32_Printer zawiera właściwość Local informującą, że dana drukarka jest lokalna. Nie trwóżcie się: za chwilę pokażemy wersję skryptu dla Windows 2000.

Zanim wywołamy naszą kwerendę WQL, tworzymy egzemplarz obiektu Wscript.Network i używamy metody AddWindowsPrinterConnection, żeby dodać drukarkę sieciową \\PrintServer1\Xerox300:

Set objNetwork = CreateObject("WScript.Network") 

objNetwork.AddWindowsPrinterConnection "\\PrintServer1\Xerox300"

W ten sposób uzyskujemy połączenie z naszą drukarką sieciową. Teraz pytanie brzmi: czy zrobić z tej drukarki drukarkę domyślną? Aby na nie odpowiedzieć, musimy wiedzieć, czy użytkownik ma zainstalowane jakieś drukarki lokalne. Jak to sprawdzić? Pamiętacie wcześniejszą kwerendę, tę która zwróciła kolekcję drukarek lokalnych? Wystarczy teraz sprawdzić wartość właściwości Count kolekcji - zawiera ona liczbę elementów kolekcji. Jeśli wartość Count równa się 0, oznacza to, że nie ma zainstalowanych drukarek lokalnych. W takim przypadku, możemy użyć poniższego wiersza kodu, by skonfigurować nową drukarkę jako drukarkę domyślną:

objNetwork.SetDefaultPrinter "\\PrintServer1\Xerox300"

Jeśli wartość Count jest różna od 0, oznacza to, że zainstalowano przynajmniej jedną drukarkę lokalną. W takim przypadku nic nie robimy.

Jak już mówimy o nic nie robieniu - nie będziemy się męczyć i wyjaśniać, jak zrobić to samo na komputerze z Windows 2000. Jednak damy wam chociaż skrypt, który to zrobi:

blnLocal = FALSE

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 64 Then 

        blnLocal = TRUE

    End If

Next



Set objNetwork = CreateObject("WScript.Network")

objNetwork.AddWindowsPrinterConnection "\\PrintServer1\Xerox300"



If blnLocal = True Then

    objNetwork.SetDefaultPrinter "\\PrintServer1\Xerox300"

End If

Przypadkowo pisząc te słowa zdaliśmy sobie z czegoś sprawę - nie musimy wcale mówić o bieżących wydarzeniach. Jeśli coś stało się w przeszłości, możemy poruszyć ten temat i nikt nic nie zauważy. Pamiętając o tym, co sądzicie o rewolucji francuskiej, co? To dopiero było szaleństwo czy jak?

 Do początku strony Do początku strony

Centrum skryptów - Systemy operacyjne