IIS 7 scripting met PowerShell

Het configureren van een website in IIS 7 en alles daarrond kan flink wat van je tijd opslopren als je dat telkens volgens een uniforme wijze wil gedaan hebben. Gelukkig kunnen we een aardig stukje scripten. Anno 2011 gaat dat bijzonder eenvoudig met behulp van Powershell en de nodige snap-in’s.

Zie hier een scriptje dat op een voor de eindgebruiker eenvoudige wijze een propere website configureert.  Er wordt een website aangemaakt, in een eigen app pool ondergebracht, er wordt een map voorzien om de IIS logs in te plaatsen (LOGS), een map waarin de website kan schrijven (DATA), plaats voor een eventuele Access DB …


# Enkele Variabelen

$basis = "c:webserver"
$defaultpass = "*********"
$ftpsite = "FTP General"

# Inladen van de belangrijkste module van dit script WebAdministration
 Import-Module WebAdministration

# Domeinnaam opvragen en indien nodig converteren naar upper case
 do
 {
    $domain = Read-Host "Domein ? (geen http:// of www) "
 } while (Test-Path("$basis$domain"))
 $domain = $domain.ToUpper()

# Filesysteem klaarmaken voor onze nieuwe website
 md "$basis$domain"
 md "$basis$domainWWW"
 md "$basis$domainLOGS"
 md "$basis$domainDATA"
 md "$basis$domainDB"

# Application pool aanmaken en de .NET versie instellen op 4
 New-WebAppPool -Name $domain
 $AppPool = Get-Item "IIS:AppPools$domain"
 $AppPool.managedRuntimeVersion = "v4.0"
 $AppPool.Enable32BitAppOnWin64 = "true"
 $AppPool | Set-Item

# Website aanmaken met 2 hostheaders (domain + www.domain), 
juiste app pool gebruiken, logs juist plaatsen
 New-WebSite -Name $domain -Port 80 -HostHeader $domain
    -PhysicalPath "$basis$domainwww"
 Set-ItemProperty "IIS:Sites$domain" ApplicationPool $Domain
 New-ItemProperty "IIS:Sites$domain" -name bindings
    -value (@{protocol="http";bindingInformation="*:80:WWW.$domain"})
 Set-ItemProperty "IIS:Sites$domain" -name logFile.directory
    -value "$basis$domainlogs"

# Gebruiker aanmaken met default password
$objOu = [ADSI]"WinNT://localhost"
$objUser = $objOU.Create("User", $domain)
$objUser.setpassword($defaultpass)
$objUser.SetInfo()

# Modify rechten voor de Gebruiker op de root van de hosting
$acl = Get-Acl "$basis$domain"
$permission = "$domain","Modify","ContainerInherit, 
    ObjectInherit", "None", "Allow"
$accessRule = New-Object System.Security.AccessControl.
    FileSystemAccessRule $permission
$acl.SetAccessRule($accessRule)
$acl | Set-Acl "$basis$domain"

# Lees en uitvoer rechten voor de App Pool gebruiker op de 
# root van de hosting
$acl = Get-Acl "$basis$domain"
$permission = "IIS AppPool$domain","ReadAndExecute","ContainerInherit, 
    ObjectInherit", "None", "Allow"
$accessRule = New-Object System.Security.AccessControl.
    FileSystemAccessRule $permission
$acl.SetAccessRule($accessRule)
$acl | Set-Acl "$basis$domain"

# Modify rechten voor de App Pool gebruiker op de DB en DATA map
$acl = Get-Acl "$basis$domainDATA"
$permission = "IIS AppPool$domain","Modify","ContainerInherit, 
    ObjectInherit", "None", "Allow"
$accessRule = New-Object System.Security.AccessControl.
    FileSystemAccessRule $permission
$acl.SetAccessRule($accessRule)
$acl | Set-Acl "$basis$domainDATA"

# Modify rechten voor de App Pool gebruiker op de DB en DATA map
$acl = Get-Acl "$basis$domainDB"
$permission = "IIS AppPool$domain","Modify","ContainerInherit, 
    ObjectInherit", "None", "Allow"
$accessRule = New-Object System.Security.AccessControl.
    FileSystemAccessRule $permission
$acl.SetAccessRule($accessRule)
$acl | Set-Acl "$basis$domainDB"

# FTP Virtuale map aanmaken (virtuel map naam = gebruikersnaam = 
#    direct binnenkomen in deze map)
New-WebVirtualDirectory -Site "$ftpsite" -Name "$domain"
    -PhysicalPath "$basis$domain"

# Op niveau van de FTP site (niet op de virtuele map) geven we de user
# toestemming op de FTP site te lezen/schrijven (NTFS rechten beperken de rest)
Add-WebConfiguration -Filter /System.FtpServer/Security/Authorization
    -Value (@{AccessType="Allow"; Users="$domain";
        Permissions="Read, Write"})
    -PSPath IIS: -Location "$ftpsite"


Bij vragen of problemen met dit script hoor ik graag van u.