Functions/Set-Display.ps1

function Set-Display {
<#
.SYNOPSIS
    Set-Display turns the display on or off via energy saver api. Can also set display brightness
.DESCRIPTION
    Set-Display turns the display on or off via energy saver api. Can also set display brightness
.PARAMETER On
    Switch to turn the display on
.PARAMETER Off
    Switch to turn the display off
.PARAMETER Brightness
    [int] representing the brightness. Valid range 1-100
.EXAMPLE
    Set-Display -Off ; Start-Sleep -Seconds 5 ; Set-Display -On
.EXAMPLE
    Set-Display -Brightness 75
.NOTES
    Inspired by
    # Turning off display http://community.idera.com/database-tools/powershell/powertips/b/tips/posts/turning-display-off-immediately
    # Turning on display https://www.codeproject.com/Articles/11099/Turn-on-off-monitor
    # Brightness https://winaero.com/change-screen-brightness-windows-10/
#>


    # todo - add Credential

    #region Parameter
    [CmdletBinding(ConfirmImpact = 'Low', DefaultParameterSetName = 'On')]
    [OutputType($null)]
    [Diagnostics.CodeAnalysis.SuppressMessageAttribute('PSReviewUnusedParameter', '')]
    [Diagnostics.CodeAnalysis.SuppressMessageAttribute('PSUseShouldProcessForStateChangingFunctions', '')]
    [Diagnostics.CodeAnalysis.SuppressMessageAttribute('PSAvoidUsingWMICmdlet', '')]

    param (
        [parameter(ParameterSetName = 'On')]
        [switch] $On,

        [parameter(ParameterSetName = 'Off')]
        [switch] $Off,

        [parameter(ParameterSetName = 'Brightness')]
        [validaterange(1,100)]
        [int] $Brightness
    )
    #endregion Parameter

    begin {
        Write-Verbose -Message "Starting [$($MyInvocation.Mycommand)]"
        Write-Verbose -Message "ParameterSetName [$($PsCmdlet.ParameterSetName)]"
        If ($Verbose) {
            Start-Sleep -Seconds 2
        }
        $code = @'
using System;
using System.Runtime.InteropServices;
public class PFAPI
{
  [DllImport("user32.dll")]
  public static extern
  int SendMessage(IntPtr hWnd, UInt32 Msg, IntPtr wParam, IntPtr lParam);
}
'@

    }

    process {
        $version = Get-CimInstance -ClassName win32_operatingsystem -Verbose:$false
        switch ($PsCmdlet.ParameterSetName) {
            'Off' {
                if ($version.version -match '^10') {
                    Start-Process -FilePath (Join-Path -Path $env:windir -ChildPath 'System32\scrnsave.scr') -ArgumentList '/s'
                } else {
                    $Display = Add-Type -TypeDefinition $code -PassThru
                    Start-Sleep -Seconds 1
                    $null = $Display::SendMessage(0xffff, 0x0112, 0xf170, 2)
                }
            }
            'On' {
                if ($version.version -match '^10') {
                    if (Get-Process -Name scrnsave.scr -ErrorAction SilentlyContinue) {
                        $pidToStop = [array] (Get-Process -Name scrnsave.scr -ErrorAction SilentlyContinue).id
                        Stop-Process -Id $pidToStop[0] -Force
                    }
                } else {
                    $Display = Add-Type -TypeDefinition $code -PassThru
                    Start-Sleep -Seconds 1
                    $null = $Display::SendMessage(0xffff, 0x0112, 0xf170, -1)
                }
            }
            'Brightness' {
                (Get-WmiObject -Namespace root/WMI -Class WmiMonitorBrightnessMethods).WmiSetBrightness(1,$Brightness)
            }
        }
    }

    end {
        Write-Verbose -Message "Ending [$($MyInvocation.Mycommand)]"
    }

}