powershell

Powershell

SCRIPT: Automatically Change Proxy Settings

When you’re in the consulting business, you travel a lot between companies. That what I consider the beautiful part of the job. Downside is that every company has it’s own policy for Internet usage. A lot of companies regulate their internet access through so called proxy servers. When you visit a lot of companies you have to change the internet settings multiple times a day to match the desired settings for that company. Therefore I wrote a powershell script that detects the DNS suffix of the company you’re at and matches the proxy settings according to the configured settings read from a XML file.

What does the script do:

  • Change Proxy Server settings for Internet Explorer and Chrome
  • Add Proxy Exceptions to bypass the proxy
  • When connected to multiple networks a known location takes presence
  • When a location is not known, the configuration defaults to “Direct Connection”
  •  Notifies you which settings are used.

What the script does NOT do:

  • Detect networks based on IP Address (Never will, too general way of checking)
  • Change Proxy settings for FireFox (#1 on my wishlist)
  • Detect network changes dynamically.

Installation/Configuration

Copy the PS1 and XML to a convinient location (eg. C:\Windows). Configure the XML file for use with proxy servers. Each location must be in its own <Sites> node.

<Name>  The name for your location is must be in the Name node.
<DNSDomain> The DNS Domain that should be checked is in this node
<ProxyServer> In this node you enter the proxy server name
<ProxyPort> In this node you enter the proxy port that should be used
<ProxyOverRide> All exceptions that should bypass the proxy server are entered in this node, each exception should be separated with a semi column.

Example Configuration

<Sites>
 <Name>My Location</Name>
 <DNSDomain>company-a.com</DNSDomain>
 <ProxyServer>www-proxy.company-a.com</ProxyServer>
 <ProxyPort>8080</ProxyPort>
 <ProxyOverRide>intranet.company-a.com;dev.company-a.com;</ProxyOverRide>
 </Sites>

Each location should look like the above example, you can append multiple sites to the <Global> node. I’ve tested the script on Windows 7 (x64) but it should work on Windows XP as well. to hide the Powershell command-box you can start the powershell script with:

C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe -WindowStyle “Hidden” C:\Windows\SetProxy.ps1

I’ve created a scheduled task that executes the script on login and unlock, that covers it for me. additionaly you can create a shortcut on your desktop to launch the script manually.

Please let me know what you think.

Download :  Set Proxy (3110)

Powershell

SCRIPT: Check your WAN IP and get Notified on change

One of the first powershell scripts I wanted to share is a script that checks your WAN ip and notifies you by e-mail when it changes.

Background:

I’ve used to sign up with a dynamic DNS provider but my router stopped updating my ip address to that DynDNS provider. After a while I received an e-mail that my host was being deleted from the database if I did not take action. A few e-mail later I decided to say goodbye to that DynDNS provider because my IP-Address does not change that much at all (I still have the same address as a year ago). So I wrote a script that checks the IP address of your FQDN and uses the automation page of  WhatisMyIP.com  to read you current WAN ip address and sends you an e-mail when it has changed.

Code Break down:

This is where you put your router’s FQDN

$TargetDomain = "Your Host FQDN" #Enter your FQDN that is linked to your WAN ip address

This function takes care of sending the e-mail

Function SendMail {
$EmailFrom = "from@yourdomain.com" #Enter the e-mail address it should send the message from.
$EmailTo = "to@yourdomain.com" #Enter the e-mail address it should send the message to.
$Subject = "External IP Address Has Changed ($Current_WAN_IP)" #Enter your subject the e-mail message should contain.
$Body = "Please Update your DNS records to $Current_WAN_IP" #Enter the message that the e-mail should contain.
$SMTPServer = "SMTP SERVER FQDN" #Enter the FQDN of your SMTP server eg. smtp.gmail.com
$SMTPClient = New-Object Net.Mail.SmtpClient($SmtpServer, 587) #Enter your SMTP Port eg. 587
$SMTPClient.EnableSsl = $true # Change to $false if you don't want to use SSL
$SMTPClient.Credentials = New-Object System.Net.NetworkCredential("your smtp username", "your smtpserver password") #Comment line with '#' if you don't need authentication
$SMTPClient.Send($EmailFrom, $EmailTo, $Subject, $Body)
}

Here is where the magic happens, this code checks your WAN IP and executes the correct action

# Do not change anything below this line.
$DNS_WAN_IP = [System.Net.Dns]::GetHostAddresses("$TargetDomain") | select-object IPAddressToString -expandproperty IPAddressToString
Write-host "Resolved IP Address of $TargetDomain = $DNS_WAN_IP"
$Current_WAN_IP = (New-Object System.Net.WebClient).DownloadString("http://automation.whatismyip.com/n09230945.asp")
Write-host "Current WAN IP Address = $Current_WAN_IP"
if ($Current_WAN_IP -ne $DNS_WAN_IP) {
 if ((@([Byte[]][char[]]$Current_WAN_IP -eq 46).Count)-ne 3) {write-host "No Valid IP Address Retrieved";Exit}
 Write-Host "IP Address Has Changed, Sending e-mail"
 SendMail
 exit
 }
 Else {write-host "No IP Address Change Detected";Exit}

This script is tested with Powershell V2 but should work in V1 as well. I’ll Hope you like the script full version can be downloaded here: CheckWANIP (1338)

Citrix PVS command-line tools

After exploring and mastering a product through the GUI, It always tickles me to get to the CLI and get myself fimiliar with the true power and scripting possibilities of that product.  The standard tool for Citrix PVS is MCLI.exe and is installed by default when the console is installed. after installing the PVS Console you may have to run the setup of the SOAP Server Communication, use this command to set the values for the SOAP Server

connection:
MCLI Run SetupConnection -p name=value[ name2=value2]
Setup the SOAP server connection that will be used for the MCLI and PowerShell command line interfaces.

-p Parameters needed for this Run.

Optional
server Server used for the connection.
Default=localhost

port Port used for the connection.
Default=8000

user User used for the connection.
Default=Current user

domain User domain used for the connection.
Default=Current user

password User password used for the connection.
Default=Current user

Add a device
MCLI Add Device -r deviceName=Device1 deviceMac=1a-2b-3c-4d-5e-6f description=”A description”

Remove a device:
MCLI Delete Device -p deviceName=Device1

To get a detailed overview of the capabilities of this interface I have attached the programmer’s guide, there is a Powershell guide available too.

MCLI Powershell Guide (1650)
MCLI Programming Guide (1205)