A common requirement with ConfigMgr deployments is to exclude clients that are connected to the corporate network via a VPN, when the total size of the content files for the deployment are too much to be throwing down a slow network link. There is more than one way to do this, but I have seen that not all are reliable and do not work in every case or for every VPN adapter out there.
For example, using PowerShell, you can run either of the following WMI queries to potentially detect an active VPN adapter (your VPN adapter description may be different):
Using Win32_NetworkAdapter
Get-WmiObject -Query "Select * from Win32_NetworkAdapter where Name like '%VPN%' and NetEnabled='True'"
Using Win32_NetworkAdapterConfiguration
Get-WmiObject -Query "Select * from Win32_NetworkAdapterConfiguration where Description like '%VPN%' and IPEnabled='True'"
Since Windows 8 / Server 2012 you can also use the Get-VPNConnection cmdlet:
(Get-VpnConnection -AllUserConnection).where{$_.Name -like "*VPN*" -and $_.ConnectionStatus -eq "Connected"}
Another method is simply:
ipconfig | Select-String 'PPP adapter'
But my preferred method is to check the IPv4 routing table. This is because VPN connections typically use their own subnet, so when connected they will add entries to the IP routing table for that subnet, and will remove them again when disconnected. If you know the subnets used by your VPN connections, you can query for them in WMI:
Get-WmiObject -Query "Select * from Win32_IP4RouteTable where Name like '10.0.99.%' or Name like '10.15.99.%'
To use this with Application deployments in ConfigMgr, you can create a Global Condition with a script setting. This condition could be used either to target or to exclude systems using VPN:
Here is an example script that returns “VPN-Active” or “VPN-InActive” based on whether a VPN subnet is detected:
If (Get-WmiObject -Query "Select * from Win32_IP4RouteTable where Name like '10.0.99.%' or Name like '10.15.99.%'") {Write-host "VPN-Active"} Else {Write-host "VPN-InActive"}
You can then add this as a requirement to an application:
For task sequences, you can use a WMI query condition:
WMI Query
Select * from Win32_IP4RouteTable where Name like '10.0.99.%' or Name like '10.15.99.%'
The only concession is if your VPN subnets ever change, you will need to update them in ConfigMgr.
Do you think these methods to detect VPN is reliable?
Destination not Name
Destination like 192.168.0.%