Jak sprawdzić, czy do komputera podłączony jest czytnik kart inteligentnych?
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. |
Jak sprawdzić, czy do komputera podłączony jest czytnik kart inteligentnych?
Cześć, Skrypciarze! Jak sprawdzić, czy do komputera podłączony jest czytnik kart inteligentnych?
-- TE
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 |