dsc/ext/PsOrg/StackExchangeResources/DSCResources/StackExchange_Pagefile/StackExchange_Pagefile.psm1


# Fallback message strings in en-US
DATA localizedData
{
    # same as culture = "en-US"
    ConvertFrom-StringData @'
AutomaticPageFileConfigured=The page file is set to automatic configuration.
PageFileStaticallyConfigured=The page file is statically configured with the initial size of {0} and a maximum size of {1}.
DisabledAutomaticPageFile=The automatic page file configuration is disabled.
RebootRequired=A reboot is required to finalize the changes to the page file.
InitialSizeDifferent=Configured Initial Size {0} different than Desired size {1}.
MaximumSizeDifferent=Configured Maximum Size {0} different than Desired size {1}.
'@

}

if (Test-Path $PSScriptRoot\en-us)
{
    Import-LocalizedData LocalizedData -filename PagefileProvider.psd1
}

function Get-TargetResource
{
    [OutputType([Hashtable])]
    param (
        [parameter(Mandatory = $true)]        
        [long]
        $InitialSize,
        [parameter(Mandatory = $true)]        
        [long]
        $MaximumSize,
        [parameter()]
        [ValidateSet('Present','Absent')]
        [string]
        $Ensure = 'Present'
    )

    #Needs to return a hashtable that returns the current
    #status of the configuration component
    $ComputerSystem = Get-WmiObject win32_computersystem 
    if ($ComputerSystem.AutomaticManagedPageFile)
    {
        Write-Verbose  $LocalizedData.AutomaticPageFileConfigured
        $Configuration = @{
            Ensure = 'Absent'
        }
    }
    else
    {        
        $PageFileSetting = Get-WmiObject Win32_PageFileSetting 
        $Configuration = @{
            Ensure = 'Present'
            InitialSize = $PageFileSetting.InitialSize * 1mb
            MaximumSize = $PageFileSetting.MaximumSize * 1mb
        }

        Write-Verbose ($LocalizedData.PageFileStaticallyConfigured -f $Configuration.InitialSize, $Configuration.MaximumSize)
    }
    return $Configuration
}

function Set-TargetResource
{
    param (
        [parameter(Mandatory = $true)]        
        [long]
        $InitialSize,
        [parameter(Mandatory = $true)]        
        [long]
        $MaximumSize,
        [parameter()]
        [ValidateSet('Present','Absent')]
        [string]
        $Ensure = 'Present'
    )
    $ComputerSystem = Get-WmiObject win32_computersystem 
  
    if ($ComputerSystem.AutomaticManagedPageFile)
    {
        if ($Ensure -like 'Present')
        {
            Write-Verbose  $LocalizedData.AutomaticPageFileConfigured
            $ComputerSystem.AutomaticManagedPageFile = $false
            $ComputerSystem.Put() | Out-Null
            Write-Verbose $LocalizedData.DisabledAutomaticPageFile
        }
        else
        {
            Write-Verbose "Nothing to configure here."
        }
    }
    else
    {   
        if ($Ensure -like 'Present')
        {   
            $PageFileSetting = Get-WmiObject Win32_PageFileSetting  
            $PageFileSetting.InitialSize = $InitialSize / 1MB
            $PageFileSetting.MaximumSize = $MaximumSize / 1MB                
            $PageFileSetting.put() | Out-Null

            Write-Verbose ($LocalizedData.PageFileStaticallyConfigured -f $InitialSize, $MaximumSize)            
        }
        else
        {                  
            $ComputerSystem.AutomaticManagedPageFile = $true
            $ComputerSystem.Put() | Out-Null
            Write-Verbose  $LocalizedData.AutomaticPageFileConfigured            
        }
    }
    
    Write-Verbose $LocalizedData.RebootRequired
    $global:DSCMachineStatus = 1
}

function Test-TargetResource
{
    [OutputType([boolean])]
    param (
        [parameter(Mandatory = $true)]        
        [long]
        $InitialSize,
        [parameter(Mandatory = $true)]        
        [long]
        $MaximumSize,
        [parameter()]
        [ValidateSet('Present','Absent')]
        [string]
        $Ensure = 'Present'
    )

    $Valid = $true
    $ComputerSystem = Get-WmiObject win32_computersystem 
    $PageFileSetting = Get-WmiObject Win32_PageFileSetting 

    if ($Ensure -like 'Present')
    {
         
        if ($ComputerSystem.AutomaticManagedPageFile)
        {
            Write-Verbose  $LocalizedData.AutomaticPageFileConfigured
            $Valid = $Valid -and $false
        }
        
           
        if ($PageFileSetting -ne $null)
        {
            if (-not ($PageFileSetting.InitialSize -eq ($InitialSize / 1MB)))
            {
                Write-Verbose ($LocalizedData.InitialSizeDifferent -f ($PageFileSetting.InitialSize * 1mb), $InitialSize)
                $Valid = $Valid -and $false
            }

            if (-not ($PageFileSetting.MaximumSize -eq ($MaximumSize / 1MB)))
            {
                Write-Verbose ($LocalizedData.MaximumSizeDifferent -f ($PageFileSetting.MaximumSize * 1mb), $MaximumSize)
                $Valid = $Valid -and $false
            }
        }
    }
    else
    {
        if (-not $ComputerSystem.AutomaticManagedPageFile)
        {
            Write-Verbose $LocalizedData.DisabledAutomaticPageFile
            $Valid = $Valid -and $false
        }
    }

    #Needs to return a boolean
    return $valid
}