FixVPN

Problem

Die Always on VPN-Verbindung ist verschwunden und es kann keine neue mehr erstellt werden.

Info

Da wir in unserer Umgebung ca. 5.400 Always on VPN-Clients managen, stoße ich in meinem Alltag sehr oft auf dieses Problem.

Die VPN Verbindung ist auf einmal verschwunden und kommt nicht wieder, außerdem ist es nicht möglich, eine neue VPN in den Windows-Einstellungen anzulegen.

Lösung

Dieses Problem klingt vielleicht auf Anhieb kompliziert, die Lösung dafür ist jedoch super simpel:

Der Fehler tritt auf, wenn die rasphone.pbk Dateien Fehlerhafte werte enthalten. Diese Dateien findest du unter:

%appdata%\Microsoft\Network\Connections

%programdata%\Microsoft\Network\Connections

Hier solltest du jeweils mindestens den Ordner Pbk finden. Wenn du noch einen Pbk_old Ordner findest, kannst du diesen entweder ignorieren oder löschen.

Im Pbk Ordner solltest du jetzt die Datei rasphone.pbk finden, manchmal ist diese auch in noch einem Unterordner namens _hiddenPbk.

Die rasphone.pbk Dateien kannst du jetzt einfach löschen und danach deine VPN Konfiguration neu laden.
Da wir unsere VPN mit DPC verteilen, heißt es in unserem Fall, dass wir den dpcservice neu starten müssen.

Hinweis: manchmal kommt es vor, dass der User die VPN danach immer noch keine VPN in der Taskleiste findet, das sollte aber nach einem Neustart behoben sein. Alternativ sollte die VPN in den Windows-Einstellungen sichtbar sein.

Scripts

Um die Lösung dieses Problems zu beschleunigen, hab ich mir sowohl ein PowerShell-Modul als auch ein Script erstellt.

Hier noch ein Hinweis von mir:
Da diese Scripte für die Verteilung über DPC erstellt wurden, ist ein Teil davon, den dpcservice neu zu starten, damit die VPN Konfiguration neu geladen wird. Wenn du kein DPC Verwendest, kannst du diesen Teil einfach weglassen.

PowerShell-Modul

Dieses Modul löscht die rasphone.pbk Dateien für einen Remotecomputer und einen spezifischen User auf diesem Computer.

# Script by rjajko
function fix-VPN {
    <# 
    .SYNOPSIS
        Fixt das Problem, dass keine VPN mehr erstellt werden kann
    .DESCRIPTION
        Loescht die rasphone.pbk Dateien und erstellt diese neu
    .PARAMETER Computername
        Der Name des Hosts
    .PARAMETER Username
        Der Name des betroffnenen Users
    .EXAMPLE
        fix-VPN -ComputerName "NBXXXXXX" -Username "USER"
    #>

[CmdletBinding()]
        Param(
            [Parameter(Mandatory=$true)] $Computername,
            [Parameter(Mandatory=$true)] $Username
        )
    

    if ((Test-Connection $computername -Quiet)) {       # Testen, ob NB erreichbar ist
        
        Invoke-Command -ComputerName $Computername -ScriptBlock {
        
            ####     Pbks     ####
            Write-Host "Pbks loeschen..." -ForegroundColor Magenta

                ###     Computer     ####
                # Pbk_old -> Computer
            $pbk_old = Test-Path C:\ProgramData\Microsoft\Network\Connections\Pbk_old
            if ($pbk_old -eq $True) {
                Remove-Item -Path C:\ProgramData\Microsoft\Network\Connections\Pbk_old -Recurse
                Write-Host "Computer: Pbk_old geloescht" -ForegroundColor Green
            }
            else {
                Write-Host "Computer: Pbk_old nicht vorhanden" -ForegroundColor Yellow
            }
                # Pbk -> Computer
            $pbk = Test-Path C:\ProgramData\Microsoft\Network\Connections\Pbk
            if ($pbk -eq $True) {
                Remove-Item -Path C:\ProgramData\Microsoft\Network\Connections\Pbk -Recurse
                Write-Host "Computer: Pbk geloescht" -ForegroundColor Green
            }
            else {
                Write-Host "Computer: Pbk nicht vorhanden" -ForegroundColor Yellow
            }

                ###     User     ####
                # Pbk_old -> User
            $pbk_old = Test-Path C:\Users\$Username\AppData\Roaming\Microsoft\Network\Connections\Pbk_old
            if ($pbk_old -eq $True) {
                Remove-Item -Path C:\Users\$Username\AppData\Roaming\Microsoft\Network\Connections\Pbk_old -Recurse
                Write-Host "User: Pbk_old geloescht" -ForegroundColor Green
            }
            else {
                Write-Host "User: Pbk_old nicht vorhanden" -ForegroundColor Yellow
            }
                # Pbk -> User
            $pbk = Test-Path C:\Users\$Username\AppData\Roaming\Microsoft\Network\Connections\Pbk
            if ($pbk -eq $True) {
                Remove-Item -Path C:\Users\$Username\AppData\Roaming\Microsoft\Network\Connections\Pbk -Recurse
                Write-Host "User: Pbk geloescht" -ForegroundColor Green
            }
            else {
                Write-Host "User: Pbk nicht vorhanden" -ForegroundColor Yellow
            }
        
            ####     DPCService neu starten     ####
            Write-Host "DPCService neu starten..." -ForegroundColor Magenta
            Restart-Service DPCService
            Start-Sleep -Seconds 3
            Restart-Service DPCService
            Write-Host "DPCService neu gestartet!" -ForegroundColor Green
        
            ####     VPN Verbindungen anzeigen     ####
            $VPNs = Get-VpnConnection -AllUserConnection
            Write-Host "VPN Verbindungen:" -ForegroundColor Magenta
            write-host $VPNs -ForegroundColor Green
        }
    }
    else {
        Write-Host "Rechner nicht erreichbar! Programm wird geschlossen..." -ForegroundColor Red
    }
}

PowerShell-Script

Dieses Script macht quasi das gleiche wie das Modul, nur löscht es die rasphone.pbk bei allen Usern und ist auf die lokale Ausführung ausgelegt.

# Script by rjajko
### ToDo: 
###       fix the bug that lets the VPN Connections show up twice in Line 54-56

# Variables
$userfolders = Get-ChildItem -Path C:\Users
$folder_pd = Get-ChildItem C:\ProgramData\Microsoft\Network\Connections -Filter "Pbk*" | Select-Object -ExpandProperty Name

# Show current VPN connections (it should show nothing)
write-host  "VPN Connections (should be empty):" -ForegroundColor Cyan
Get-VpnConnection -AllUserConnection | Select-Object -Property Name

# List the currend folders in ProgrammData
Write-Host "Current Folders in ProgramData:" -ForegroundColor Cyan
Write-Host $folder_pd -ForegroundColor Yellow

# List and remove the folders for every user
foreach ($userfolder in $userfolders) { 
    $username = $userfolder.Name
    if ($username -ne "Public") {
        $folder_ad = Get-ChildItem C:\Users\$username\AppData\Roaming\Microsoft\Network\Connections -Filter "Pbk*" | Select-Object -ExpandProperty Name
        Write-Host "Current folders of $username" -ForegroundColor Cyan
        Write-Host $folder_ad -ForegroundColor Yellow
    
        # Test for folder Pbk and remove it
        if (Test-Path C:\Users\$username\AppData\Roaming\Microsoft\Network\Connections\Pbk) {
            Remove-Item -Path C:\Users\$username\AppData\Roaming\Microsoft\Network\Connections\Pbk -Recurse
            Write-Host "AppData-Pbk removed - User $username" -ForegroundColor Green
        }
        # Test for folder Pbk_old and remove it
        if (Test-Path C:\Users\$username\AppData\Roaming\Microsoft\Network\Connections\Pbk_old) {
            Remove-Item -Path C:\Users\$username\AppData\Roaming\Microsoft\Network\Connections\Pbk_old -Recurse
            Write-Host "AppData-Pbk_old removed - User $username" -ForegroundColor Green
        }
    }

}

# Remove the folders in ProgramData
# Test for folder Pbk and remove it
if (Test-Path C:\ProgramData\Microsoft\Network\Connections\Pbk) {
    Remove-Item -Path C:\ProgramData\Microsoft\Network\Connections\Pbk -Recurse
    Write-Host "Programdata-Pbk removed" -ForegroundColor Green
}
# Test for folder Pbk_old and remove it
if (Test-Path C:\ProgramData\Microsoft\Network\Connections\Pbk_old) {
    Remove-Item -Path C:\ProgramData\Microsoft\Network\Connections\Pbk_old -Recurse
    Write-Host "Programdata-Pbk_old removed" -ForegroundColor Green
}

# Restart DPC Service
Write-Host "restarting DPCService..." -ForegroundColor Red
Restart-Service DPCService
Start-Sleep -Seconds 2                  # Wait for 2 seconds
Restart-Service DPCService              # Restart a second time to make sure the VPN Profiles get created
Write-Host "restared DPCService" -ForegroundColor Green

# List the VPN connections (it shoud show 1 or 2 connections, depending on the config)
write-host  "VPN Connections (should NOT be empty):" -ForegroundColor Green
Get-VpnConnection -AllUserConnection | Select-Object -Property Name

Pause # So you can see what the script was doing when running it via powershell