C# で VPN ゲートウェイの P2S 用 VPN クライアントセットアップをダウンロードする

Microsoft Azure の仮想ネットワークに VPN の P2S で繋ぐとき、Azure VPN Client を使うことになる。Azure VPN Client はポータルでダウンロードすれば事足りるけど、REST APISDK でもダウンロードできる。

www.nuget.org

実際には、Azure VPN Client セットアップを生成要求してダウンロード用 URL を取得し、その URL からダウンロードする形になる。

using Azure;
using Azure.Identity;
using Azure.ResourceManager;
using Azure.ResourceManager.Network;
using Azure.ResourceManager.Network.Models;
using Azure.ResourceManager.Resources;

const string ClientId = "クライアントID";
const string ClientSecret = "クライアントシークレット";
const string TenantId = "テナントID";
const string SubscriptionId = "サブスクリプションID";
const string ResourceGroupName = "リソースグループ名";
const string VirtualNetworkGatewayName = "VPNゲートウェイ名";

var credential = new ClientSecretCredential(
    tenantId: TenantId,
    clientId: ClientId,
    clientSecret: ClientSecret);
var client = new ArmClient(credential);

ResourceGroupResource resourceGroup = await client.GetSubscriptionResource(
    SubscriptionResource.CreateResourceIdentifier(SubscriptionId))
    .GetResourceGroupAsync(ResourceGroupName);

VirtualNetworkGatewayResource gateway = await resourceGroup.GetVirtualNetworkGatewayAsync(VirtualNetworkGatewayName);

// VPN クライアントセットアップの生成を要求し、
// ダウンロード用 URL を取得。
var generateOperation = await gateway.GeneratevpnclientpackageAsync(
    waitUntil: WaitUntil.Completed,
    vpnClientParameters: new VpnClientParameters
    {
        ProcessorArchitecture = ProcessorArchitecture.Amd64,
    });
string downloadUrl = await generateOperation.WaitForCompletionAsync();

// 生成された VPN クライアントセットアップをダウンロード
var httpClient = new HttpClient();
using var downloadStream = await httpClient.GetStreamAsync(downloadUrl);
using var writeStream = File.OpenWrite(
    Path.Combine(AppContext.BaseDirectory, "VpnClientSetupAmd64.exe"));
await downloadStream.CopyToAsync(writeStream);