DSCResources/MSFT_xWebSiteDefaults/MSFT_xWebSiteDefaults.psm1
###################################################################################### # DSC Resource for IIS Server level Web Site Defaults # ApplicationHost.config: system.applicationHost/sites/siteDefaults # # only a limited number of settings are supported at this time # We try to cover the most common use cases # We have a single parameter for each setting ###################################################################################### data LocalizedData { # culture="en-US" ConvertFrom-StringData @' NoWebAdministrationModule=Please ensure that WebAdministration module is installed. SettingValue=Changing default value '{0}' to '{1}' ValueOk=Default value '{0}' is already '{1}' '@ } ###################################################################################### # The Get-TargetResource cmdlet. # This function will get all supported site default values ###################################################################################### function Get-TargetResource { [CmdletBinding()] [OutputType([System.Collections.Hashtable])] param ( [Parameter(Mandatory)] [ValidateSet('Machine')] [string]$ApplyTo ) # Check if WebAdministration module is present for IIS cmdlets CheckIISPoshModule return @{LogFormat = (GetValue 'siteDefaults/logFile' 'logFormat') TraceLogDirectory = ( GetValue 'siteDefaults/traceFailedRequestsLogging' 'directory') DefaultApplicationPool = (GetValue 'applicationDefaults' 'applicationPool') AllowSubDirConfig = (GetValue 'virtualDirectoryDefaults' 'allowSubDirConfig') ApplyTo = 'Machine' LogDirectory = (GetValue 'siteDefaults/logFile' 'directory')} } ###################################################################################### # The Set-TargetResource cmdlet. # This function will change a default setting if not already set ###################################################################################### function Set-TargetResource { param ( [ValidateSet('Machine')] [parameter(Mandatory = $true)] [string]$ApplyTo, [ValidateSet('W3C','IIS','NCSA','Custom')] [string]$LogFormat, [string]$LogDirectory, [string]$TraceLogDirectory, [string]$DefaultApplicationPool, [ValidateSet('true','false')] [string]$AllowSubDirConfig ) CheckIISPoshModule SetValue 'siteDefaults/logFile' 'logFormat' $LogFormat SetValue 'siteDefaults/logFile' 'directory' $LogDirectory SetValue 'siteDefaults/traceFailedRequestsLogging' 'directory' $TraceLogDirectory SetValue 'applicationDefaults' 'applicationPool' $DefaultApplicationPool SetValue 'virtualDirectoryDefaults' 'allowSubDirConfig' $AllowSubDirConfig } ###################################################################################### # The Test-TargetResource cmdlet. # This will test whether all given values are already set in the current configuration ###################################################################################### function Test-TargetResource { [OutputType([System.Boolean])] param ( [ValidateSet('Machine')] [parameter(Mandatory = $true)] [string]$ApplyTo, [ValidateSet('W3C','IIS','NCSA','Custom')] [string]$LogFormat, [string]$LogDirectory, [string]$TraceLogDirectory, [string]$DefaultApplicationPool, [ValidateSet('true','false')] [string]$AllowSubDirConfig ) CheckIISPoshModule # check for the various given settings: if (!(CheckValue -path 'virtualDirectoryDefaults' -name 'allowSubDirConfig' -newValue $AllowSubDirConfig)) { return $false } if (!(CheckValue -path 'siteDefaults/logFile' -name 'logFormat' -newValue $LogFormat)) { return $false } if (!(CheckValue -path 'siteDefaults/logFile' -name 'directory' -newValue $LogDirectory)) { return $false } if (!(CheckValue -path 'siteDefaults/traceFailedRequestsLogging' -name 'directory' -newValue $TraceLogDirectory)) { return $false } if (!(CheckValue -path 'applicationDefaults' -name 'applicationPool' -newValue $DefaultApplicationPool)) { return $false } # at this point all settings are ok and our desired state is met. return $true } ###################################################################################### # Helper Functions ###################################################################################### Function CheckValue([string]$path,[string]$name,[string]$newValue) { if (!$newValue) { # if no new value was specified, we assume this value is okay. return $true } $existingValue = GetValue -Path $path -Name $name if ($existingValue -ne $newValue) { return $false } else { $relPath = $path + '/' + $name Write-Verbose($LocalizedData.ValueOk -f $relPath,$newValue); return $true } } # some internal helper function to do the actual work: Function SetValue([string]$path,[string]$name,[string]$newValue) { # if the variable doesn't exist, the user doesn't want to change this value if (!$newValue) { return } # get the existing value to compare $existingValue = GetValue -Path $path -Name $name if ($existingValue -ne $newValue) { Set-WebConfigurationProperty -pspath 'MACHINE/WEBROOT/APPHOST' -filter "system.applicationHost/sites/$path" -name $name -value "$newValue" $relPath = $path + '/' + $name Write-Verbose($LocalizedData.SettingValue -f $relPath,$newValue); } } Function GetValue([string]$path,[string]$name) { return Get-WebConfigurationProperty -pspath 'MACHINE/WEBROOT/APPHOST' -filter "system.applicationHost/sites/$path" -name $name } Function CheckIISPoshModule { # Check if WebAdministration module is present for IIS cmdlets if(!(Get-Module -ListAvailable -Name WebAdministration)) { Throw $LocalizedData.NoWebAdministrationModule } } # FUNCTIONS TO BE EXPORTED Export-ModuleMember -function Get-TargetResource, Set-TargetResource, Test-TargetResource |