Não existe cmdlet Import-VpnProfile, e o que mais se aproxima, Add-VpnConnection, nunca lê um arquivo .ovpn ou .conf. Ele monta um perfil nativo do Windows a partir dos parâmetros que você informa, e é por isso que o primeiro ponto de checagem aqui é o formato do arquivo, não a linha de comando. Se o gateway fala SSTP, IKEv2, L2TP/IPsec ou PPTP, o Windows consegue assumir o perfil e o restante da lista se aplica. Se você recebeu um arquivo OpenVPN ou WireGuard, pare no passo um: esses clientes têm os próprios importadores.

Passo 1: confirme qual perfil o Windows consegue mesmo assumir

Execute Get-Command -Module VpnClient na máquina antes de qualquer outra coisa. O Windows 10, o Windows 11 e o Server 2016 ou posterior já trazem o módulo; se ele faltar, nenhum script copiado fará este host aceitar um perfil nativo. Os cmdlets que importam são Add-VpnConnection, Get-VpnConnection e Remove-VpnConnection, e a lista de parâmetros na referência do Add-VpnConnection vale uma leitura completa.

Nativo significa que a pilha de VPN do Windows termina o túnel. Isso cobre IKEv2, muitas vezes com um certificado de máquina; SSTP, que é TLS com autenticação de usuário ou de certificado por dentro; e L2TP/IPsec com uma chave pré-compartilhada. Um arquivo .ovpn é um script OpenVPN, não uma conexão do Windows: ele carrega diretivas como remote, cipher ou tls-auth que a pilha do Windows desconhece por completo. Um .conf do WireGuard é a mesma história com PrivateKey e AllowedIPs; converter um no outro não é uma escolha de parâmetro, mas outra implementação de túnel.

Há um terceiro caminho. Se um administrador entregar a você um documento XML do CSP VPNv2 ou um perfil do Intune, esse é o caminho MDM, aplicado pela pilha de provisionamento e não pelo Add-VpnConnection. Não traduza esses nomes de nó para parâmetros do PowerShell; pergunte qual mecanismo aplica o XML.

Passo 2: combine o tipo de túnel com o método de autenticação

-TunnelType e -AuthenticationMethod são parâmetros separados, e o gateway só se importa com a combinação. Acertar um e errar o outro dá um perfil que não conecta a lugar nenhum, ou que trava com o túnel já de pé. Defina os dois explicitamente em vez de confiar num padrão escolhido para outro serviço.

  • IKEv2 com MachineCertificate: o cliente apresenta um certificado de computador; defina também -EncryptionLevel Required.
  • SSTP com Eap: primeiro o túnel TLS, depois PEAP/MSCHAPv2 ou um certificado dentro do EAP. Isso exige o XML do passo 3.
  • SSTP, L2TP ou PPTP com MSChapv2, Chap ou Pap: usuário e senha simples, sem blob EAP.
  • L2TP com MSChapv2 e -Lt2pPsk: a PSK cobre a metade IPsec, o usuário cobre o PPP; os dois precisam bater com o servidor.

Um splat mantém os valores num lugar só:

$p = @{
  Name                 = "Corp IKEv2"
  ServerAddress        = "vpn.example.com"
  TunnelType           = "Ikev2"
  AuthenticationMethod = "MachineCertificate"
  EncryptionLevel      = "Required"
  SplitTunneling       = $false
  DnsSuffix            = "corp.example.com"
}
Add-VpnConnection @p -PassThru

O -PassThru devolve o objeto que o Windows acabou de gravar, então você pode inspecioná-lo sem uma segunda chamada. Se o nome já existir, o cmdlet se recusa a rodar; o -Force sobrescreve, que é o reflexo errado num notebook de produção, porque descarta em silêncio o que alguém configurou à mão.

Passo 3: entregue o material de credencial do jeito certo

Senhas, chaves pré-compartilhadas e blobs EAP são onde esses scripts costumam quebrar. O -EapConfigXmlStream quer um XmlDocument, não um caminho, então leia e converta o arquivo primeiro. Passar uma string produz um erro de conversão que parece problema de esquema e faz gente reescrever um XML que nunca esteve errado.

$eap = [xml](Get-Content -Raw .\peap-mschapv2.xml)
Add-VpnConnection -Name "Corp SSTP" -ServerAddress "sstp.example.com" `
  -TunnelType Sstp -AuthenticationMethod Eap `
  -EapConfigXmlStream $eap -EncryptionLevel Required

Esse XML não é algo para inventar a partir de um trecho de blog. Ele nomeia o tipo do método EAP e a autenticação interna, e o gateway compara os dois com a própria política. Um método interno incompatível falha depois que o handshake TLS termina, o que se parece exatamente com senha errada e não é. Pegue o XML com quem opera o gateway, ou exporte de um perfil que já funciona.

Para IKEv2 a metade do certificado é uma consulta ao repositório. O -MachineCertificateIssuerFilter recebe um objeto de certificado, e o Windows o usa para achar um certificado de cliente utilizável em LocalMachine\My. O certificado precisa de uma chave privada e de uma cadeia em que o servidor confie; quando falta qualquer uma das duas, a autenticação falha sem detalhe útil, então confira o repositório primeiro:

Get-ChildItem Cert:\LocalMachine\My |
  Where-Object { $_.HasPrivateKey -and $_.NotAfter -gt (Get-Date) } |
  Select-Object Subject, Issuer, Thumbprint, NotAfter

Mantenha segredos fora do arquivo de script. Uma PSK passada na linha de comando ou embutida num .ps1 acaba em transcrições, sessões salvas e repositórios compartilhados, e o -RememberCredential guarda credenciais de usuário para depois, transformando um teste pontual numa autorização duradoura.

Passo 4: decida o escopo antes da primeira execução

O mesmo cmdlet grava em duas agendas telefônicas diferentes. Sem -AllUserConnection o perfil é seu e fica em %APPDATA\Microsoft\Network\Connections\Pbk\rasphone.pbk. Com ele, a partir de um prompt elevado, o perfil vai para %ProgramData\Microsoft\Network\Connections\Pbk\rasphone.pbk e fica visível para todas as contas, inclusive a tela de logon.

Escopo não é cosmético. Um perfil para todos os usuários é o que uma conta de serviço, uma tarefa agendada ou um cenário de pré-logon conseguem usar; um perfil por usuário é invisível para os três. Os objetos também são lidos de forma diferente: Get-VpnConnection lista as entradas do usuário atual, Get-VpnConnection -AllUserConnection lista as da máquina inteira. Escolha um agora, e trate uma mudança posterior como excluir e recriar em vez de editar:

# elevated prompt
Remove-VpnConnection -Name "Corp IKEv2" -Force
Add-VpnConnection -Name "Corp IKEv2" -ServerAddress "vpn.example.com" `
  -TunnelType Ikev2 -AuthenticationMethod MachineCertificate `
  -EncryptionLevel Required -AllUserConnection

Passo 5: teste o que um túnel realmente precisa entregar

Um ícone conectado prova que o túnel subiu e nada além disso. Conecte pela linha de comando primeiro, para que as falhas cheguem como texto e não como caixa de diálogo, e depois leia de volta o que o Windows registrou:

rasdial "Corp IKEv2"
Get-VpnConnection -Name "Corp IKEv2" |
  Select-Object Name, ServerAddress, TunnelType, ConnectionStatus, SplitTunneling
Get-NetRoute -DestinationPrefix "0.0.0.0/0"

As duas falhas que os usuários relatam enquanto o status ainda diz Conectado são DNS e roteamento. Resolva um nome interno e veja qual servidor respondeu; um perfil sem -DnsSuffix pode tunelar perfeitamente e ainda assim falhar em toda consulta da intranet. Depois olhe a rota padrão: com o split tunneling desligado, a rota 0.0.0.0/0 de menor métrica deve apontar para a interface da VPN, e com ele ligado apenas os prefixos que você espera. Se os dois parecem certos e o tráfego ainda morre, o problema está além do perfil, na política ou no filtro do gateway.

Quando a conexão falha de vez, o código estreita o passo a revisitar:

  • 691: o gateway rejeitou as credenciais. Volte ao passo 3, não ao túnel.
  • 809: o handshake IKEv2 nunca terminou. Confira UDP 500 e 4500, e a confiança no certificado.
  • 789: a chave pré-compartilhada do L2TP/IPsec está faltando ou errada.
  • 868: o nome do servidor não foi resolvido. Conserte o DNS antes de editar o perfil.

Guarde o comando que funciona junto das configurações que ele codifica, para que a próxima pessoa possa reconstruir em vez de fazer engenharia reversa do perfil pela interface. Se você realmente tiver de reconstruir, exclua a entrada e recrie com os mesmos parâmetros; remendar um perfil meio configurado deixa rotas obsoletas e estado de autenticação para trás. E se o arquivo nunca foi nativo, volte ao cliente que é dono dele. Um .ovpn fantasiado de perfil IKEv2 não é uma importação, é um chamado de suporte.

Artigos relacionados