Centrum Skryptów - Systemy operacyjne

W jaki sposób mapować drukarkę, ale tylko wtedy, gdy użytkownik nie ma drukarki lokalnej? Udostępnij na: Facebook

Skrypciarze odpowiadają na Wasze pytania

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.

W jaki sposób mapować drukarkę, ale tylko wtedy, gdy użytkownik nie ma drukarki lokalnej?

Cześć Skrypciarzu! Potrzebuję skryptu zalogowania, który będzie mapował drukarkę sieciową dla każdego użytkownika, chyba, że użytkownik ma już drukarkę lokalną. Wówczas nie chcę dodawać drukarki sieciowej. Czy to możliwe?

-- AG

Cześć AG! To, o co pytasz, jest nie tylko możliwe, ale też całkiem proste, zwłaszcza, jeśli pracujesz na Windows XP lub Windows 2003. Mamy tu dwa zagadnienia: potrzebujemy kodu mapującego drukarkę sieciową oraz kodu, który określi, czy użytkownik ma drukarkę lokalną, czy też nie. Zacznijmy od kodu mapującego drukarkę sieciową:

Set objNetwork = CreateObject("WScript.Network")

objNetwork.AddWindowsPrinterConnection "\\PrintServer1\Xerox300"

objNetwork.SetDefaultPrinter "\\PrintServer1\Xerox300"

Jeśli siedzisz i cierpliwie czekasz na pozostałą część kodu, to z przykrością informujemy, że się nie doczekasz. To już cały kod potrzebny do mapowania drukarki sieciowej. W pierwszej linii tworzymy wystąpienie obiektu WSH Network. W linii drugiej używamy metody AddWindowsPrinterConnection, aby połączyć się z drukarką Xerox300 (która znajduje się na serwerze drukarkowym o nazwie PrintServer 1). I to już wszystko. Linia trzecia, która ustawia nową drukarkę jako domyślną, jest opcjonalna. Dodaliśmy ją tylko po to, żeby pokazać, jak łatwo jest ustawić drukarkę jako domyślną.

Teraz zajmijmy się określeniem, czy do komputera podłączone są jakieś drukarki lokalne. Jak się okazuje, w Windows XP i Windows 2003 klasa WMI Win32_Printer posiada właściwość o nazwie Local (lokalne). Jeśli właściwość ta ustawiona jest na TRUE (prawda), to oznacza, że sprawdzana drukarka jest drukarką lokalną. Jeśli ustawiona jest na FALSE (nieprawda), oznacza to, że mamy do czynienia z drukarką sieciową. Jeśli chcemy sprawdzić, czy do komputera podłączone są drukarki lokalne, wystarczy wysłać zapytanie o wszystkie drukarki, dla których właściwość Local jest ustawiona jako TRUE:

strComputer = "."



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

Set colPrinters = objWMIService.ExecQuery _

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

Możemy następnie sprawdzić właściwość Count (liczba), która powie nam, ile drukarek lokalnych zostało znalezionych. Jeśli Count wynosi 0, oznacza to, że nie znaleziono żadnych drukarek lokalnych. W takim wypadku idziemy dalej i mapujemy drukarkę sieciową. Jeśli jednak wartość Count jest wyższa od 0, to znaleziona została co najmniej jedna drukarka lokalna. Nie mapujemy wówczas drukarki sieciowej, czyli nie robimy nic (coś, w czym Skrypciarze są absolutnymi mistrzami).

Oto kompletny skrypt, który – w środowisku Windows XP i Windows 2003 – mapuje drukarkę sieciową, jeśli nie znalezione zostały żadne drukarki lokalne:

strComputer = "."



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

Set colPrinters = objWMIService.ExecQuery _

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



If colPrinters.Count = 0 Then

    Set objNetwork = CreateObject("WScript.Network")

    objNetwork.AddWindowsPrinterConnection "\\PrintServer1\Xerox300"

    objNetwork.SetDefaultPrinter "\\PrintServer1\Xerox300"

End If

Uważniejsi (lub bardziej paranoiczni) spośród Was zauważyli zapewne, że mówimy ciągle o Windows XP lub Windows 2003, a wszelkie pozostałe wersje uparcie pomijamy. Czy to oznacza, że nie da się wykonać tego zadania w Windows 2000? Nie, oznacza to tylko tyle, że – przed Windows XP – klasa Win32_Printer nie zawierała właściwości Local. W związku z tym nie możemy wysłać zapytania o wszystkie drukarki, dla których wartość Local=TRUE.

Nie ma z tym jednak wielkiego problemu. Jak zwykle, można znaleźć sposób na obejście tego ograniczenia. Wcześniejsze wersje Win32_Printer zawierają właściwość o nazwie Attributes (atrybuty). Jeden z "przełączników" tej właściwości poinformuje nas, czy drukarka jest lokalna, czy też nie. Jeśli jest on włączony (jego wartość wynosi 64), oznacza to, że drukarka jest lokalna. Jeśli nie jest włączony, wówczas wiemy, że drukarka jest sieciowa.

Moglibyśmy wobec tego użyć wartości logicznych Boole’a, aby sprawdzić, czy do komputera podłączona jest jakaś drukarka lokalna. Dziś nie mamy już czasu, żeby wyjaśniać zawiłości logiki Boolowskiej - zainteresowanych odsyłamy do odpowiedniego rozdziału (j.ang.) Przewodnika Skryptowania Microsoft Windows 2000. Tymczasem, oto skrypt, który zadziała na Windows 2000:

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



If blnLocal = FALSE

    Set objNetwork = CreateObject("WScript.Network")

    objNetwork.AddWindowsPrinterConnection "\\PrintServer1\Xerox300"

    objNetwork.SetDefaultPrinter "\\PrintServer1\Xerox300"

End If

W tym skrypcie ustawiamy wartość zmiennej bInLocal na FALSE. Następnie pobieramy listę wszystkich drukarek zainstalowanych na komputerze i sprawdzamy w każdej po kolei, czy przełącznik drukarki lokalnej został włączony. Tym zajmuje się poniższa linia kodu:

If objPrinter.Attributes And 64 Then

Jeśli drukarka lokalna zostanie znaleziona, ustawiamy wartość bInLocal na TRUE. Na końcu skryptu, jeśli bInLocal jest ustawiona na TRUE, wiemy, że znaleziono drukarkę lokalną. Skrypt wówczas po prostu kończy działanie. Jeśli jednak bInLocal jest ustawiona na FALSE, to oznacza, że nie znaleziono żadnej drukarki lokalnej, w związku z czym idziemy dalej i mapujemy drukarkę sieciową.

Koszmar. Ale przynajmniej działa.

 Do początku strony Do początku strony


Centrum Skryptów - Systemy operacyjne