Proxy Configuration Switching
Late last year I wanted to move my RSS reader (currently Sauce Reader) from my work desktop to my laptop. Doing this meant that I was able to keep up-to-date with feeds over the weekend. It did come with a hitch though. My work desktop sits behind a proxy server and I haven’t yet come across a feed reader that does true auto-detection of proxy settings like IE does.
After I moved the feed reader to my laptop, it meant that I had to put the proxy settings either in the feed readers settings or in the IE settings. I know that a lot of other applications use IE’s settings so that was the best place as all the other applications would benefit from the settings. I set the feed reader to use the IE proxy settings and entered the proxy server and port number in the IE options dialog. Every time I went to work, I would have to go into the IE settings and enable the proxy setting so that IE and all the other applications would have Internet access. When I went home, I would have to disable the proxy settings again. This very quickly became a major hassle.
Just before Christmas, I thought that if I could identify the domain that the computer was on, I would be able to automatically determine if I was plugged into work or not and change the proxy settings as appropriate. It turns out that I wasn’t able to programmatically determine the current domain (anyone achieved this?), but at the start of January, I had another idea. I could get the IP address of a known computer name, in this case, my work computer.
It goes like this, when the computer starts, I get it to run my little proxy switch application. It gets a computer name from the command-line parameters and attempts to find its IP address. If the IP address exists, it enables the proxy setting through the registry, otherwise, the setting is disabled.
There are two problems with this idea. Firstly, when the IP address is determined, that value is cached. This means that if the computer falls off the network, the IP address is still returned for the computer name specified. Secondly, if I don’t have the network cable plugged in at work before I boot up, it will disable the proxy settings. As long as I turn the computer off when traveling between home and work, and I always ensure that the network cable is plugged in before boot-up at work, neither of these are an issue.
Here is the code:
#Region " Imports "
Imports System.Net
Imports Microsoft.Win32
#End Region
Module modGlobal
Public Sub Main(ByVal CmdArgs() As String)
Dim objEntry As System.Net.IPHostEntry
Dim objKey As RegistryKey = Registry.CurrentUser.OpenSubKey("Software\Microsoft\Windows\CurrentVersion\Internet Settings", True)
Dim bUseProxy As Boolean
Try
' Check if there is at least 1 command line parameter
If CmdArgs.Length > 0 Then
' Attempt to resolve the name to an IP address
objEntry = System.Net.Dns.Resolve(CmdArgs(0))
' We haven't failed, the resolve was successful
bUseProxy = True
End If ' End checking if there is at least one command line parameter
Catch
' Couldn't resolve the computer name to an IP address
bUseProxy = False
Finally
' Destroy the object
objEntry = Nothing
End Try
' Check if we want to use a proxy
If bUseProxy Then
objKey.SetValue("ProxyEnable", 1)
Else ' We don't want to use a proxy
objKey.SetValue("ProxyEnable", 0)
End If ' End checking if we want to use a proxy
End Sub
End Module