PowerShell
PowerShell
PC/SC Wait for Smart Card Status Change (Inserted, Removed from Reader, etc.)
See more SCard Examples
Demonstrates how to synchronously wait for a status change, such as for a smart card to be inserted into a reader, or removed from a reader.Note: This functionality was introduced in Chilkat v9.5.0.87.
Chilkat PowerShell Downloads
Add-Type -Path "C:\chilkat\ChilkatDotNet47-x64\ChilkatDotNet47.dll"
$success = $false
# This example requires the Chilkat API to have been previously unlocked.
# See Global Unlock Sample for sample code.
$scard = New-Object Chilkat.SCard
# First establish a context to the PC/SC Resource Manager
$success = $scard.EstablishContext("user")
if ($success -eq $false) {
$($scard.LastErrorText)
exit
}
# First we'll examine the state of all connected readers to see which have smartcards already inserted..
# Get JSON containing information about the smartcards currently inserted into readers.
# This also includes information about USB security tokens.
$json = New-Object Chilkat.JsonObject
$success = $scard.FindSmartcards($json)
if ($success -eq $false) {
$($scard.LastErrorText)
exit
}
# When writing this example, I have 3 smart card readers plugged into my system.
# One of them has a smart card inserted.
# Here's the JSON returned by FindSmartcards...
# {
# "reader": [
# {
# "name": "Alcor Micro USB Smart Card Reader 0",
# "state": "empty"
# },
# {
# "name": "Generic Smart Card Reader Interface 0",
# "state": "present",
# "vendorName": "Generic",
# "serialNumber": "3230303730383138303030303030303030",
# "systemName": "Generic Smart Card Reader Interface 0",
# "card": {
# "atr": "3BFC180000813180459067464A00641606F2727E00E0",
# "windows": {
# "miniDriver": "tagliov70px.dll",
# "cryptoProvider": "Microsoft Base Smart Card Crypto Provider",
# "keyStorageProvider": "Microsoft Smart Card Key Storage Provider"
# }
# }
# },
# {
# "name": "SCM Microsystems Inc. SCR33x USB Smart Card Reader 0",
# "state": "empty"
# }
# ]
# }
$json.EmitCompact = $false
$($json.Emit())
$(" ")
# We can iterate over the JSON to find the readers with a smart card already inserted..
$sbState = New-Object Chilkat.StringBuilder
$i = 0
$count_i = $json.SizeOfArray("reader")
while ($i -lt $count_i) {
$json.I = $i
$name = $json.StringOf("reader[i].name")
$sbState.Clear()
$json.StringOfSb("reader[i].state",$sbState)
if ($sbState.Contains("present",$true) -eq $true) {
$($name + " has a smart card inserted.")
}
else {
$($name + " does not have a smart card inserted.")
}
$i = $i + 1
}
$(" ")
# Now let's begin the code to wait for a change (where a smart card gets inserted or removed)
# Get the list of all readers.
$stReaders = New-Object Chilkat.StringTable
$success = $scard.ListReaders($stReaders)
if ($success -eq $false) {
$($scard.LastErrorText)
exit
}
# Show the reader names..
$numReaders = $stReaders.Count
$i = 0
while ($i -lt $numReaders) {
$([string]$i + ": " + $stReaders.StringAt($i))
$i = $i + 1
}
# Sample output from the above loop.
# 0: Alcor Micro USB Smart Card Reader 0
# 1: Generic Smart Card Reader Interface 0
# 2: SCM Microsystems Inc. SCR33x USB Smart Card Reader 0
#
# Synchronously wait 30 seconds for a card to be inserted or removed from any of the above readers.
$json2 = New-Object Chilkat.JsonObject
$success = $scard.GetStatusChange(30000,$stReaders,$json2)
if ($success -eq $false) {
$($scard.LastErrorText)
exit
}
$(" ")
# Let's see what happened...
$json2.EmitCompact = $false
$($json2.Emit())
$(" ")
# This is what json2 contains.
# A card was inserted into the reader named "SCM Microsystems Inc. SCR33x USB Smart Card Reader 0"
# The "numChanged" indicates that one reader's status changed.
# The "changed":true indicates the reader that changed. The state is now "present".
# {
# "numChanged": 1,
# "reader": [
# {
# "name": "Alcor Micro USB Smart Card Reader 0",
# "changed": false,
# "state": "empty"
# },
# {
# "name": "Generic Smart Card Reader Interface 0",
# "changed": false,
# "state": "present",
# "atr": "3BFC180000813180459067464A00641606F2727E00E0"
# },
# {
# "name": "SCM Microsystems Inc. SCR33x USB Smart Card Reader 0",
# "changed": true,
# "state": "present",
# "atr": "3BDF96FF8131FE455A018048494443313158587300011B09"
# }
# ]
# }
# Find the reader that changed...
$numChanged = $json2.IntOf("numChanged")
$("number of readers with a changed state: " + $numChanged)
$i = 0
$count_i = $json2.SizeOfArray("reader")
while ($i -lt $count_i) {
$json2.I = $i
$changed = $json2.BoolOf("reader[i].changed")
if ($changed -eq $true) {
$name = $json2.StringOf("reader[i].name")
$state = $json2.StringOf("reader[i].state")
$("Changed: ")
$(" reader name: " + $name)
$(" new state: " + $state)
# If a card is now in this reader, we should have the ATR of the card..
if ($json2.HasMember("reader[i].atr") -eq $true) {
$atr = $json2.StringOf("reader[i].atr")
$(" ATR of card inserted into this reader: " + $atr)
}
}
$i = $i + 1
}
# The output from the above loop:
# number of readers with a changed state: 1
# Changed:
# reader name: SCM Microsystems Inc. SCR33x USB Smart Card Reader 0
# new state: present
# ATR of card inserted into this reader: 3BDF96FF8131FE455A018048494443313158587300011B09
# Applications should always release the context when finished.
$success = $scard.ReleaseContext()
if ($success -eq $false) {
$($scard.LastErrorText)
}