Troubleshooting on Multiple Devices

This documentation is still Draft and improving. DO NOT TAKE ANY ACTIONS if you don’t know what to do!

Find Virtual Smartcard Status on Devices / Or Device List on Active Directory

PowerShell
$Computers = Get-ADComputer -Filter { Name -like "MONOCLIENT01" -or Name -like "MONOCLIENT02" -or Name -like "MONOCLIENT04" } -Properties *

$UserName = "AD-USER"
$Password = "DONT-TYPE-PASSWORD-IF-YOU-WANT-TO-TYPE-IT-SECURE"

if($UserName -ne "") {
    if ($Password -eq "") {
        $__monoPamCredential = Get-Credential -Credential $UserName
    }
    else {
        $__monoPamPassword = ConvertTo-SecureString $Password -AsPlainText -Force
        $__monoPamCredential = New-Object System.Management.Automation.PSCredential($UserName, $__monoPamPassword)
    }
}

$Result = New-Object System.Collections.ArrayList
$Count = $Computers.Count
$Counter = 0
foreach ($Computer in $Computers) {
    $Counter = $Counter + 1
    $ResultStatus = New-Object PSObject
    $ResultStatus | Add-Member -MemberType NoteProperty -Name "ComputerName" -Value $Computer.Name

    $IsAvailable = "Unknown"

    Write-Host "[$Counter/$Count] Checking status of $($Computer.Name)"
    $GeneralStatus = Invoke-Command -ComputerName $Computer.Name -ScriptBlock {
        # Get-TPM Status of Machine
        $TpmStatus = "Unknown"
        
        # Get-SmartCard Status of MONOFOR-TPM
        $MonoforTpmStatus = "Unknown"

        $Client = New-Object PSObject
        $Tpm = Get-Tpm
        if($Tpm.TpmPresent -eq $true -and $Tpm.TpmReady -eq $true -and $Tpm.TpmEnabled -eq $true -and $Tpm.TpmActivated -eq $true)
        {
            $TpmStatus = "Active"
        }

        if($TpmStatus -eq "Active")
        {
            $TpmDevices = Get-PnpDevice | Where-Object { $_.Class -eq 'SmartCardReader' -and $_.FriendlyName -eq "MONOFOR-TPM" -and $_.Status -eq "OK" }
            if($TpmDevices)
            {
                $MonoforTpmStatus = "Active"
            }
        }

        $Client | Add-Member -MemberType NoteProperty -Name "TPM" -Value $TpmStatus
        $Client | Add-Member -MemberType NoteProperty -Name "MonoforTPM" -Value $MonoforTpmStatus

        $Client
    } -Credential $__monoPamCredential

    if($GeneralStatus.TPM -eq "Active" -and $GeneralStatus.MonoforTPM -eq "Active")
    {
        $IsAvailable = "Yes"
    }

    if($null -eq $GeneralStatus)
    {
        $IsAvailable = "Unreachable"
    }

    $ResultStatus | Add-Member -MemberType NoteProperty -Name "Available" -Value $IsAvailable
    $ResultStatus | Add-Member -MemberType NoteProperty -Name "TPM" -Value $GeneralStatus.TPM
    $ResultStatus | Add-Member -MemberType NoteProperty -Name "MonoforTPM" -Value $GeneralStatus.MonoforTPM

    $Result.Add($ResultStatus) | Out-Null
}

$Result

Example Result

PowerShell
[1/3] Checking status of MONOCLIENT01
[2/3] Checking status of MONOCLIENT02
[3/3] Checking status of MONOCLIENT04

ComputerName Available   TPM     MonoforTPM
------------ ---------   ---     ----------
MONOCLIENT01 Unreachable                   
MONOCLIENT02 Unknown     Unknown Unknown   
MONOCLIENT04 Yes         Active  Active