Centrum Skryptóe - Systemy Operacyne

Jak sprawdzić, czy do komputera podłączony jest czytnik kart inteligentnych?

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.

Jak sprawdzić, czy do komputera podłączony jest czytnik kart inteligentnych?

Cześć Skrypciarze! Pytanie

Cześć, Skrypciarze! Jak sprawdzić, czy do komputera podłączony jest czytnik kart inteligentnych?

-- TE

Cześć Skrypciarze! Odpowiedź

Cześć, TE! Niestety nie możemy odpowiedzieć na Twoje pytanie, pracujemy bowiem od poniedziałku do piątku, a dziś zdaje się jest niedziela po południu… Chwila, chwila, sobota po południu. Niechże sprawdzę… Co? Dopiero piątek? No nie, nie spodziewałem się, że mam aż takie zawirowania czasoprzestrzenne… W takim razie nie pozostaje mi nic innego TE jak przeprosić i odpowiedzieć Ci na Twoje pytanie.

Uwaga: Wróciłem więc do szarej rzeczywistości Redmond, tak samo z resztą jak Skrypciarka Jean Ross, z jedną różnicą – ja wróciłem do pracy, ona wzięła sobie jeszcze tydzień wolnego. Chciałem nawet poskarżyć się do szefa, ale on też wziął tydzień wolnego… Pozostawię to bez komentarza.

Albo nie, nie wytrzymam bez komentarza:

Gdyby wszyscy byli tak oddani artykułom z serii „Cześć, Skrypciarze!” jak moja skromna osoba…

Hmm, umknął mi jeden dzień? Trudno wraca się do takiego klimatu, a jeszcze trudniej do takiej czasoprzestrzeni, będę teraz pewnie „bezsenny w Seattle”, proszę więc o pobłażliwość w stosunku do moich artykułów przez kolejny… rok?

Więc fakty faktami – dziś dopiero piątek, nie mam więc innego wyboru, jak tylko napisać skrypt, który sprawdza, czy do komputera podłączony jest czytnik kart inteligentnych:

strComputer = "."



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



Set colItems = objWMIService.ExecQuery("Select * From Win32_PnPEntity")



For Each objItem in colItems

    If InStr(LCase(objItem.Description), "smartcard") Then

        Wscript.Echo "Description: " & objItem.Description

        Wscript.Echo "Manufacturer: " & objItem.Manufacturer

        Wscript.Echo "Name: " & objItem.Name

        Wscript.Echo "PNP Device ID: " & objItem.PNPDeviceID

    End If

Next

Zaczynamy od połączenia się z usługą WMI na komputerze lokalnym. Spytacie zapewne: „Czy można użyć tego samego skryptu w celu ustalenia czy taki czytnik kart podłączony jest na komputerze zdalnym?”. Odpowiem więc: „Si, Señor TE (tyle się nauczyłem podczas pobytu), należy tylko przypisać nazwę danego komputera zdalnego do zmiennej strComputer.”

Jeżeli zapomnieliście jak to się robi, to w następujący sposób:

strComputer = "atl-fs-001"

Po połączeniu się z usługą WMI, używamy metody ExecQuery i następujący wiersz kodu zwróci nam kolekcję wszystkich urządzeń Plug and Play zainstalowanych na danym komputerze:

Set colItems = objWMIService.ExecQuery("Select * From Win32_PnPEntity")

Następnie ustawiamy pętlę For Each, która przechodzi nam przez wszystkie elementy w danej kolekcji i dzięki temu możemy się bacznie przyjrzeć każdemu z tych urządzeń.

Czemu chcemy się przyglądać? Chcemy sprawdzić, czy właściwość Description zawiera wartość smartcard. Jeżeli zatem gdzieś pojawi nam się właściwość Description zawierająca ciąg smartcard, możemy założyć, że do komputera podłączony jest czytnik kart inteligentnych. Jeżeli natomiast nie odnajdziemy takiego urządzenia, to oznacza to oczywiście, że czytnik kart inteligentnych nie jest do danego komputera podłączony.

Jak przeprowadzamy takie badanie? W następujący sposób:

If InStr(LCase(objItem.Description), "smartcard") Then

To naprawdę bardzo proste: używamy po prostu funkcji InStr, która określa, czy wartość ciągu smartcard pojawia się w urządzeniu Description. Aby uniknąć pomieszania z poplątaniem wynikającego z pisowni SmartCard oraz smartcard, używamy także funkcji Lasce, która konwertuje wszystkie znaki na ich odpowiednik małoliterowy.

Jeżeli nie znajdziemy wartości smartcard, wracamy po prostu do początku pętli i powtarzamy proces dla następnego urządzenia w kolekcji. Jeżeli jednak znajdziemy taką wartość, używamy następującego fragmentu kodu w celu przywołania echa niektórych ważnych właściwości danego urządzenia:

Wscript.Echo "Description: " & objItem.Description

Wscript.Echo "Manufacturer: " & objItem.Manufacturer

Wscript.Echo "Name: " & objItem.Name

Wscript.Echo "PNP Device ID: " & objItem.PNPDeviceID

Powinno dać to nam następujący rezultat:

Description: Texas Instruments PCI GemCore based SmartCard controller

Manufacturer: Texas Instruments

Name: Texas Instruments PCI GemCore based SmartCard controller

PNP Device ID: PCI\VEN_104C&DEV_8035&SUBSYS_308B103C&REV_00\4&1C88B56&0&25A4

Nie możemy zagwarantować, że ten skrypt sprawdzi się w 100%, nie możemy przecież zagwarantować, że każdy czytnik karty inteligentnej ma w swoich właściwościach Description wartość smartcard. Nie zaszkodzi jednak spróbować.

Następny skrypt może się Wam także przydać, zwraca bowiem informacje na temat wszystkich sterowników urządzeń SmartCard zainstalowanych na danym komputerze:

On Error Resume Next



strComputer = "."



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



Set colItems = objWMIService.ExecQuery _

    ("Select * From Win32_PnPSignedDriver Where DeviceClass = 'SMARTCARDREADER'")



For Each objItem in colItems

    Wscript.Echo "Device ID: " & objItem.DeviceID

    Wscript.Echo "Device Name: " & objItem.DeviceName

    Wscript.Echo "Driver Provider Name: " & objItem.DriverProviderName

    Wscript.Echo "Driver Version: " & objItem.DriverVersion

    Wscript.Echo "Hardware ID: " & objItem.HardWareID

    Wscript.Echo "INF Name: " & objItem.InfName

    Wscript.Echo "Manufacturer: " & objItem.Manufacturer

    Wscript.Echo "PDO: " & objItem.PDO

    Wscript.Echo "Signer: " & objItem.Signer

 Next

Powinniśmy otrzymać następujący rezultat:

Device ID: PCI\VEN_104C&DEV_8035&SUBSYS_308B103C&REV_00\4&1C88B56&0&25A4

Device Name: Texas Instruments PCI GemCore based SmartCard controller

Driver Provider Name: Gemplus

Driver Version: 1.0.1.15

Hardware ID: PCI\VEN_104C&DEV_8035&SUBSYS_308B103C&REV_00

INF Name: oem19.inf

Manufacturer: Texas Instruments

PDO: \Device\NTPNP_PCI0023

Signer: Microsoft Windows Hardware Compatibility Publisher

Tyle na dzisiaj, jeżeli chodzi o skrypt. Co zaś tyczy się piszącego to Skrypciarza, czas stawić czoło rzeczywistości po konferencji TechE IT Forum (j.ang.) . Postaram się stawić jej czoło do jutra (może jakiś meczyk?), zatem (mam nadzieję) – do jutra. Moment. Jutro jest sobota. Tym lepiej. ADIOS!

 Do początku strony Do początku strony

Centrum Skryptóe - Systemy Operacyne