Author Posts

September 18, 2017 at 4:37 pm

hello
I was hoping to add another server to my IIS environment running windows 2012r2 with Powershell 5.0.10586.117.
my other servers are running Powershell 4.0.
when I try to push out to the new server I get:
VERBOSE: [WEB3]: [[cWebApplication]intranetdev_abc_com_subsitetest_Application] Setting Application Pool for Application subsitetest in site intranetdev.abc.com
to intranetdev.abc.com
Cannot find path 'IIS:\Sites\intranetdev.abc.com\subsitetest' because it does not exist.
+ CategoryInfo : ObjectNotFound: (IIS:\Sites\intr...com\subsitetest:) [], CimException
+ FullyQualifiedErrorId : PathNotFound,Microsoft.PowerShell.Commands.SetItemPropertyCommand
+ PSComputerName : web3

here is my webapplication.
thanks


function Get-TargetResource
{
	[CmdletBinding()]
	[OutputType([System.Collections.Hashtable])]
	param
	(
		[parameter(Mandatory = $true)] [System.String] $Site,
		[parameter(Mandatory = $true)] [System.String] $Name,
		[parameter(Mandatory = $true)] [System.String] $PhysicalPath,
        [parameter(Mandatory = $true)] [System.String] $ApplicationPool,
		[ValidateSet("Present","Absent")] [System.String] $Ensure = 'Present',
		[ValidateSet('PassThrough','NamedUser')] [System.String] $AuthenticationType = 'PassThrough',
        [System.String] $UserName = ''
	)
    
    Write-Verbose "Application: $Site/$Name"

    #If there's no virtual directory to get, don't panic.
    $ExistingVirtual = Get-ItemProperty -Path "IIS:\Sites\$Site\$Name" -ErrorAction SilentlyContinue | Where-Object {$_.elementTagName -eq 'application'} #
    if ($ExistingVirtual)
    {
        if ($ExistingVirtual.userName -eq '') {$ExistingAuthType = 'PassThrough'} else {$ExistingAuthType='NamedUser'}
        

        Write-Verbose "Status: Present"
        Write-Verbose "PhysicalPath: $($ExistingVirtual.physicalPath)"
        Write-Verbose "ApplicationPool: $($ExistingVirtual.applicationPool)"
        Write-Verbose "UserName: $($ExistingVirtual.userName)"
        @{
            Site=$Site 
            Name=$Name 
            Ensure='Present'
            PhysicalPath=$ExistingVirtual.physicalPath
            ApplicationPool=$ExistingVirtual.applicationPool
            AuthenticationType=$ExistingAuthType 
            UserName = $ExistingVirtual.userName
        }
    }
    else 
    {
        Write-Verbose "Status: Absent"
        @{Site=$Site; Name=$Name; Ensure='Absent'}
    } 	
}

function Test-TargetResource
{
	[CmdletBinding()]
	[OutputType([System.Boolean])]
	param
	(
		[parameter(Mandatory = $true)] [System.String] $Site,
		[parameter(Mandatory = $true)] [System.String] $Name,
		[parameter(Mandatory = $true)] [System.String] $PhysicalPath,
        [parameter(Mandatory = $true)] [System.String] $ApplicationPool,
		[ValidateSet("Present","Absent")] [System.String] $Ensure = 'Present',
		[ValidateSet('PassThrough','NamedUser')] [System.String] $AuthenticationType = 'PassThrough',
        [System.String] $UserName = ''
	)
    
    Write-Verbose "Getting Target Resource"
    $Resource = Get-TargetResource -Site $Site -Name $Name -PhysicalPath $PhysicalPath -ApplicationPool $ApplicationPool
    Write-Verbose "Got Target Resource: $($Resource.Name)"
    if ($Resource.Ensure -ne $Ensure) 
    {
        Write-Verbose "Site: $Site"
        Write-Verbose "Name: $Name"
        Write-Verbose "Existing Application state $($Resource.Ensure) does not match $Ensure"
        return $false
    }
    if ($Resource.Ensure -eq 'Present') #Only Check additional properties if the Virtual Directory exists.
    {
        if ($Resource.PhysicalPath -ne $PhysicalPath) 
        {
            Write-Verbose "Site: $Site"
            Write-Verbose "Name: $Name"
            Write-Verbose "Existing Physical Path '$($Resource.PhysicalPath)' does not match '$PhysicalPath'"
            return $false
        }
        if ($Resource.ApplicationPool -ne $ApplicationPool) 
        {
            Write-Verbose "Site: $Site"
            Write-Verbose "Name: $Name"
            Write-Verbose "Existing Application Pool '$($Resource.ApplicationPool)' does not match '$ApplicationPool'"
            return $false
        }
        if ($Resource.AuthenticationType -ne $AuthenticationType) 
        {
            Write-Verbose "Site: $Site"
            Write-Verbose "Name: $Name"
            Write-Verbose "Physical Path: $PhysicalPath"
            Write-Verbose "Authentication Type of $($Resource.AuthenticationType) does not match $AuthenticationType"
            return $false
        }
        if ($Resource.UserName-ne $UserName) 
        {
            Write-Verbose "Site: $Site"
            Write-Verbose "Name: $Name"
            Write-Verbose "Physical Path: $PhysicalPath"
            Write-Verbose "Authentication Type: $AuthenticationType"
            Write-Verbose "User Name of $($Resource.UserName) does not match $UserName"
            return $false
        }
    }
    #If there are no issues, return $true.
    $true
}

function Set-TargetResource
{
	[CmdletBinding()]
	param
	(
		[parameter(Mandatory = $true)] [System.String] $Site,
		[parameter(Mandatory = $true)] [System.String] $Name,
		[parameter(Mandatory = $true)] [System.String] $PhysicalPath,
        [parameter(Mandatory = $true)] [System.String] $ApplicationPool,
		[ValidateSet("Present","Absent")] [System.String] $Ensure = 'Present',
		[ValidateSet('PassThrough','NamedUser')] [System.String] $AuthenticationType = 'PassThrough',
        [System.String] $UserName = ''
	)

    $Resource = Get-TargetResource -Site $Site -Name $Name -PhysicalPath $PhysicalPath -ApplicationPool $ApplicationPool
    
    
    if ($Ensure -eq 'Present')
    {
        if ($Resource.Ensure -ne 'Present' ) #If the Virtual Directory doesn't exist.
        {
            Write-Verbose "Creating new Application $Name in site $Site to path $PhysicalPath"
            New-WebApplication -Site $Site -Name $Name -PhysicalPath $PhysicalPath  -ApplicationPool $ApplicationPool
        }
        elseif ($Resource.PhysicalPath -ne $PhysicalPath) #If it exists but the path is wrong, delete and recreate
        {
            Write-Verbose "Removing Application $Name in site $Site"
            Remove-WebApplication -Site $site -Name $name
            Write-Verbose "Creating new Application $Name in site $Site to path $PhysicalPath"
            New-WebApplication -Site $Site -Name $Name -PhysicalPath $PhysicalPath -ApplicationPool $ApplicationPool
        }

        if ($Resource.ApplicationPool -ne $ApplicationPool) 
        {
            Write-Verbose "Setting Application Pool for Application $Name in site $Site to $ApplicationPool"
            set-ItemProperty -Path "IIS:\Sites\$Site\$Name" -Name applicationPool -Value $ApplicationPool
        } 


        if (($AuthenticationType -eq 'PassThrough') -and ($Resource.AuthenticationType -ne $AuthenticationType)) 
        {
            Write-Verbose "Removing UserName from Application $Name in site $Site to set Pass-Through Authentication."
            set-ItemProperty -Path "IIS:\Sites\$Site\$Name" -Name userName -Value '' #Null Username is how you set passthrough
        } 
        if (($AuthenticationType -eq 'NamedUser')   -and ($Resource.UserName-ne $UserName)) 
        {
            Write-Verbose "Setting UserName $UserName on Application $Name in site $Site and disabling Pass-Through Authentication."
            set-ItemProperty -Path "IIS:\Sites\$Site\$Name" -Name userName -Value $UserName #Setting password is not supported yet
        } 
    }

    else #if ($Ensure -eq 'Absent')
    {
        Write-Verbose "Removing virtual directory $Name in site $Site"
        Remove-WebApplication -Site $site -Name $name
    }


}

Export-ModuleMember -Function *-TargetResource

September 19, 2017 at 2:14 pm

Have you confirmed that WebAskinistation is present and loadable?