Question:
Using Powershell 1.0 under Windows Server 2003 with IIS 6.
I have about 200 sites that I would like to change the IP address for (as listed in the website properties on the “website” tab in the “Web site identification” section “IP address” field.
I found this code:
1 2 3 4 |
$site = [adsi]"IIS://localhost/w3svc/$siteid" $site.ServerBindings.Insert($site.ServerBindings.Count, ":80:$hostheader") $site.SetInfo() |
How can I do something like this but:
- Loop through all the sites in IIS
- Not insert a host header value, but change an existing one.
Answer:
The following PowerShell script should help:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 |
$oldIp = "172.16.3.214" $newIp = "172.16.3.215" # Get all objects at IIS://Localhost/W3SVC $iisObjects = new-object ` System.DirectoryServices.DirectoryEntry("IIS://Localhost/W3SVC") foreach($site in $iisObjects.psbase.Children) { # Is object a website? if($site.psbase.SchemaClassName -eq "IIsWebServer") { $siteID = $site.psbase.Name # Grab bindings and cast to array $bindings = [array]$site.psbase.Properties["ServerBindings"].Value $hasChanged = $false $c = 0 foreach($binding in $bindings) { # Only change if IP address is one we're interested in if($binding.IndexOf($oldIp) -gt -1) { $newBinding = $binding.Replace($oldIp, $newIp) Write-Output "$siteID: $binding -> $newBinding" $bindings[$c] = $newBinding $hasChanged = $true } $c++ } if($hasChanged) { # Only update if something changed $site.psbase.Properties["ServerBindings"].Value = $bindings # Comment out this line to simulate updates. $site.psbase.CommitChanges() Write-Output "Committed change for $siteID" Write-Output "=========================" } } } |