Control VPN Connections Through IIS

on Sunday, July 15, 2012

Using IIS as a service provider, you can call Windows internal Rasdial system to connect, disconnect, and check the status of VPN connections.

Rasdial.exe (http://technet.microsoft.com/en-us/library/ff859533(v=ws.10)) is an internal program which Windows uses to create VPN connections. It’s command line interface can also be used to disconnect a connection or check what connections are currently active. This is a small wrapper website that calls Rasdial, in order to handle VPN connections from a remote location through http.

To set this up, you’ll need an ASP.NET MVC website, and a few changes. This example is using IIS 7.5, ASP.NET MVC 4, on .NET 4.5.

Once the basic ASP.NET MVC website is created, the updates are:

1) Change the Default route:

routes.MapRoute(
    name: "Default",
    url: "{action}/{id}",
    defaults: new { controller = "Vpn", action = "Disconnect", id = UrlParameter.Optional }
);

2) Add a VpnController for the default route to use:


using System;   
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Timers;
using System.Web;
using System.Web.Mvc;
namespace mpfiles.VpnReset.Controllers
{
    public class VpnController : Controller
    {
        private const string DefaultName = "vpn connection name";

        public ActionResult Disconnect(string name = DefaultName)
        {
            var arguments = string.Format("\"{0}\" /d", name);
            return HandleRasDial(arguments);
        }

        public ActionResult Connect(
            string name = DefaultName,
            string username = "username",
            string password = "password"
        ) {
            var arguments = string.Format("\"{0}\" {1} {2}", name, username, password);
            return HandleRasDial(arguments);
        }

        public ActionResult Status(string name = DefaultName)
        {
            return HandleRasDial(string.Empty);
        }

        public ActionResult HandleRasDial(string arguments)
        {
            var startTime = DateTime.Now;
            var message = RasDial(arguments);
            message = message.Replace("\n", "<br />");
            var endTime = DateTime.Now;
            message += "<br />" + String.Format("[{0}]", (endTime - startTime));

            return new ContentResult { Content = message };
        }

        public string RasDial(string arguments)
        {
            var proc = new Process();

            proc.StartInfo.FileName = "rasdial";
            proc.StartInfo.WorkingDirectory = HttpContext.Request.PhysicalApplicationPath;
            proc.StartInfo.Arguments = arguments;
            proc.StartInfo.RedirectStandardError = true;
            proc.StartInfo.RedirectStandardOutput = true;
            proc.StartInfo.UseShellExecute = false;
            proc.StartInfo.CreateNoWindow = true;
            proc.EnableRaisingEvents = false;

            proc.Start();
            var output = proc.StandardOutput.ReadToEnd();
            output += proc.StandardError.ReadToEnd();
            proc.WaitForExit();
            proc.Dispose();

            return output;
        }

    }
}



I hope someone else will find this useful.

0 comments:

Post a Comment


Creative Commons License
This site uses Alex Gorbatchev's SyntaxHighlighter, and hosted by herdingcode.com's Jon Galloway.