Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to update existing IIS 6 Web Site using PowerShell

I am trying to create a PowerShell script that creates a new IIS 6 web site and sets things like App Pool, Wildcard application maps, ASP.NET version, etc.

After extensive search on the Internet I found a script that allows me to create a new Web Site but not to modify all the properties I need.

$newWebsiteName = "WebSiteName"  
$newWebsiteIpAddress = "192.168.1.100"  
$newWebSiteDirPath = "c:\inetpub\wwwroot\WebSiteName"  
$iisWebService  = Get-WmiObject -namespace "root\MicrosoftIISv2" 
                                -class "IIsWebService"  
$bindingClass = [wmiclass]'root\MicrosoftIISv2:ServerBinding'  
$bindings = $bindingClass.CreateInstance()  
$bindings.IP = $newWebsiteIpAddress  
$bindings.Port = "80"  
$bindings.Hostname = ""  
$result = $iisWebService.CreateNewSite
               ($newWebsiteName, $bindings, $newWebSiteDirPath)  

Any help on how to expand example above is greatly appreciated.

like image 258
Plamen Iliev Avatar asked Feb 11 '10 11:02

Plamen Iliev


People also ask

How do you check if IIS is running using PowerShell?

5] Using Windows Powershell First, open Windows Powershell by searching for Powershell in the Cortana search box and run it with Administrator level privileges. It will look similar to this, Hence, you will find the version of IIS installed on your computer using Windows PowerShell. Hope this helps!


2 Answers

First of all, big thanks to jrista for pointing me in the right direction.

I also found this article very useful.

What follows here is a powershell script to create Application pool, Website and a SelfSsl certificate:


function CreateAppPool ([string]$name, [string]$user, [string]$password)
{
    # check if pool exists and delete it - for testing purposes
    $tempPool  = gwmi -namespace "root\MicrosoftIISv2" -class "IISApplicationPoolSetting" -filter "Name like '%$name%'"
    if (!($tempPool -eq $NULL)) {$tempPool.delete()}

    # create Application Pool
    $appPoolSettings = [wmiclass] "root\MicrosoftIISv2:IISApplicationPoolSetting"
    $newPool = $appPoolSettings.CreateInstance()

    $newPool.Name = "W3SVC/AppPools/" + $name
    $newPool.WAMUsername = $user
    $newPool.WAMUserPass = $password

    $newPool.PeriodicRestartTime = 1740
    $newPool.IdleTimeout = 20
    $newPool.MaxProcesses = 1
    $newPool.AppPoolIdentityType = 3

    $newPool.Put()
}

function CreateWebSite ([string]$name, [string]$ipAddress, [string]$localPath, [string] $appPoolName, [string] $applicationName)
{
    # check if web site exists and delete it - for testing purposes
    $tempWebsite  = gwmi -namespace "root\MicrosoftIISv2" -class "IISWebServerSetting" -filter "ServerComment like '%$name%'"
    if (!($tempWebsite -eq $NULL)) {$tempWebsite.delete()}

    # Switch the Website to .NET 2.0
    C:\windows\Microsoft.NET\Framework\v2.0.50727\aspnet_regiis.exe -sn W3SVC/

    $iisWebService  = gwmi -namespace "root\MicrosoftIISv2" -class "IIsWebService"

    $bindingClass = [wmiclass]'root\MicrosoftIISv2:ServerBinding'
    $bindings = $bindingClass.CreateInstance()
    $bindings.IP = $ipAddress
    $bindings.Port = "80"
    $bindings.Hostname = ""

    $iisWebService.CreateNewSite($name, $bindings, $localPath)

    # Assign App Pool
    $webServerSettings  = gwmi -namespace "root\MicrosoftIISv2" -class "IISWebServerSetting" -filter "ServerComment like '%$name%'"
    $webServerSettings.AppPoolId = $appPoolName
    $webServerSettings.put()

    # Add wildcard map
    $wildcardMap = "*, c:\somewildcardfile.dll, 0, All"
    $iis = [ADSI]"IIS://localhost/W3SVC"
    $webServer = $iis.psbase.children | where { $_.keyType -eq "IIsWebServer" -AND $_.ServerComment -eq $name }
    $webVirtualDir = $webServer.children | where { $_.keyType -eq "IIsWebVirtualDir" }
    $webVirtualDir.ScriptMaps.Add($wildcardMap)

    # Set Application name
    $webVirtualDir.AppFriendlyName = $applicationName

    # Save changes
    $webVirtualDir.CommitChanges()

    # Start the newly create web site
    if (!($webServer -eq $NULL)) {$webServer.start()}
}

function AddSslCertificate ([string] $websiteName, [string] $certificateCommonName)
{
    # This method requires for you to have selfssl on your machine
    $selfSslPath = "\program files\iis resources\selfssl"

    $certificateCommonName = "/N:cn=" + $certificateCommonName

    $certificateValidityDays = "/V:3650"
    $websitePort = "/P:443"
    $addToTrusted = "/T"
    $quietMode = "/Q"


    $webServerSetting = gwmi -namespace "root\MicrosoftIISv2" -class "IISWebServerSetting" -filter "ServerComment like '$websiteName'"
    $websiteId ="/S:" + $webServerSetting.name.substring($webServerSetting.name.lastindexof('/')+1)

    cd -path $selfSslPath
    .\selfssl.exe $addToTrusted $certificateCommonName $certificateValidityDays $websitePort $websiteId $quietMode
}

$myNewWebsiteName = "TestWebsite"
$myNewWebsiteIp = "192.168.0.1"
$myNewWebsiteLocalPath = "c:\inetpub\wwwroot\"+$myNewWebsiteName
$appPoolName = $myNewWebsiteName + "AppPool"
$myNewWebsiteApplicationName = "/"
$myNewWebsiteCertificateCommonName = "mynewwebsite.dev"

CreateAppPool $appPoolName "Administrator" "password"
CreateWebSite $myNewWebsiteName $myNewWebsiteIp $myNewWebsiteLocalPath $appPoolName $myNewWebsiteApplicationName
AddSslCertificate $myNewWebsiteName $myNewWebsiteCertificateCommonName
like image 200
Plamen Iliev Avatar answered Nov 15 '22 07:11

Plamen Iliev


The $result object contains the path to the newly created IIsWebServer object. You can get access to the virtual directory, where you can configure more properties, by doing the following:

$w3svcID = $result.ReturnValue -replace "IIsWebServer=", ""
$w3svcID = $w3svcID -replace "'", ""
$vdirName = $w3svcID + "/ROOT";

$vdir = gwmi -namespace "root\MicrosoftIISv2" 
             -class "IISWebVirtualDir" 
             -filter "Name = '$vdirName'";
# do stuff with $vdir
$vdir.Put();
like image 34
jrista Avatar answered Nov 15 '22 05:11

jrista