VersionAnalyzerRules.psm1

<#
.SYNOPSIS
    Test commands against PowerShell version 3
.DESCRIPTION
    Test commands against PowerShell version 3
.EXAMPLE
    Test-PowerShellv3Command -CommandAst $CommandAst
.INPUTS
    [System.Management.Automation.Language.CommandAst]
.OUTPUTS
    [PSCustomObject[]]
.NOTES
    None.
#>

Function Test-PowerShellv3Command {
    [CmdletBinding()]
    [OutputType([PSCustomObject[]])]
    Param (
        [Parameter(Mandatory = $true)]
        [ValidateNotNullOrEmpty()]
        [System.Management.Automation.Language.CommandAst]$CommandAst
    )
    
    Process {
        $results = @()
        
        $cmds = @(
            "disable-pstrace",
            "disable-pswsmancombinedtrace",
            "disable-wsmantrace",
            "enable-pstrace",
            "enable-pswsmancombinedtrace",
            "enable-wsmantrace",
            "get-isesnippet",
            "get-logproperties",
            "import-isesnippet",
            "invoke-asworkflow",
            "new-isesnippet",
            "new-psworkflowsession",
            "set-logproperties",
            "start-trace",
            "stop-trace",
            "add-bitsfile",
            "add-jobtrigger",
            "complete-bitstransfer",
            "connect-pssession",
            "convertfrom-json",
            "convertto-json",
            "disable-jobtrigger",
            "disable-scheduledjob",
            "disconnect-pssession",
            "enable-jobtrigger",
            "enable-scheduledjob",
            "get-applockerfileinformation",
            "get-applockerpolicy",
            "get-bitstransfer",
            "get-cimassociatedinstance",
            "get-cimclass",
            "get-ciminstance",
            "get-cimsession",
            "get-controlpanelitem",
            "get-jobtrigger",
            "get-scheduledjob",
            "get-scheduledjoboption",
            "get-troubleshootingpack",
            "get-typedata",
            "invoke-cimmethod",
            "invoke-restmethod",
            "invoke-troubleshootingpack",
            "invoke-webrequest",
            "new-applockerpolicy",
            "new-ciminstance",
            "new-cimsession",
            "new-cimsessionoption",
            "new-jobtrigger",
            "new-pssessionconfigurationfile",
            "new-pstransportoption",
            "new-psworkflowexecutionoption",
            "new-scheduledjoboption",
            "new-winevent",
            "receive-pssession",
            "register-cimindicationevent",
            "register-scheduledjob",
            "remove-bitstransfer",
            "remove-ciminstance",
            "remove-cimsession",
            "remove-jobtrigger",
            "remove-typedata",
            "rename-computer",
            "resume-bitstransfer",
            "resume-job",
            "save-help",
            "set-applockerpolicy",
            "set-bitstransfer",
            "set-ciminstance",
            "set-jobtrigger",
            "set-scheduledjob",
            "set-scheduledjoboption",
            "show-command",
            "show-controlpanelitem",
            "start-bitstransfer",
            "suspend-bitstransfer",
            "suspend-job",
            "test-applockerpolicy",
            "test-pssessionconfigurationfile",
            "unblock-file",
            "unregister-scheduledjob",
            "update-help"
        )
        
        If ($CommandAst.GetCommandName() -eq $null) {
            Return $results
        } Else {
            $cmdName = $CommandAst.GetCommandName().ToLower();
        }
        
        If ($cmdName -in $cmds) {
            $result = [PSCustomObject]@{
                "Message" = "$cmdName requires PowerShell version 3 or higher.";
                "Extent" = $CommandAst.Extent;
                "RuleName" = "Test-PowerShellv3Command";
                "Severity" = "Warning"
            }
            $results += $result
        }
        
        Return $results
    }
}

<#
.SYNOPSIS
    Test commands against PowerShell version 4
.DESCRIPTION
    Test commands against PowerShell version 4
.EXAMPLE
    Test-PowerShellv4Command -CommandAst $CommandAst
.INPUTS
    [System.Management.Automation.Language.CommandAst]
.OUTPUTS
    [PSCustomObject[]]
.NOTES
    None.
#>

Function Test-PowerShellv4Command {
    [CmdletBinding()]
    [OutputType([PSCustomObject[]])]
    Param (
        [Parameter(Mandatory = $true)]
        [ValidateNotNullOrEmpty()]
        [System.Management.Automation.Language.CommandAst]$CommandAst
    )
    
    Process {
        $results = @()
        
        $cmds = @(
            "get-dscconfiguration",
            "get-dsclocalconfigurationmanager",
            "get-dscresource",
            "get-filehash",
            "new-dscchecksum",
            "restore-dscconfiguration",
            "test-dscconfiguration",
            "export-binarymilog",
            "import-binarymilog",
            "set-dsclocalconfigurationmanager",
            "start-dscconfiguration"
        )
        
        If ($CommandAst.GetCommandName() -eq $null) {
            Return $results
        } Else {
            $cmdName = $CommandAst.GetCommandName().ToLower();
        }
        
        If ($cmdName -in $cmds) {
            $result = [PSCustomObject]@{
                "Message" = "$cmdName requires PowerShell version 4 or higher.";
                "Extent" = $CommandAst.Extent;
                "RuleName" = "Test-PowerShellv4Command";
                "Severity" = "Warning"
            }
            $results += $result
        }
        
        Return $results
    }
}

<#
.SYNOPSIS
    Test commands against PowerShell version 5
.DESCRIPTION
    Test commands against PowerShell version 5
.EXAMPLE
    Test-PowerShellv5Command -CommandAst $CommandAst
.INPUTS
    [System.Management.Automation.Language.CommandAst]
.OUTPUTS
    [PSCustomObject[]]
.NOTES
    None.
#>

Function Test-PowerShellv5Command {
    [CmdletBinding()]
    [OutputType([PSCustomObject[]])]
    Param (
        [Parameter(Mandatory = $true)]
        [ValidateNotNullOrEmpty()]
        [System.Management.Automation.Language.CommandAst]$CommandAst
    )
    
    Process {
        $results = @()
        
        $cmds = @(
            "compress-archive",
            "convertfrom-sddlstring",
            "disable-dscdebug",
            "disable-networkswitchethernetport",
            "disable-networkswitchfeature",
            "disable-networkswitchvlan",
            "enable-dscdebug",
            "enable-networkswitchethernetport",
            "enable-networkswitchfeature",
            "enable-networkswitchvlan",
            "expand-archive",
            "export-odataendpointproxy",
            "find-dscresource",
            "find-module",
            "find-script",
            "format-hex",
            "get-dscconfigurationstatus",
            "get-installedmodule",
            "get-installedscript",
            "get-networkswitchethernetport",
            "get-networkswitchfeature",
            "get-networkswitchglobaldata",
            "get-networkswitchvlan",
            "get-psrepository",
            "import-powershelldatafile",
            "install-module",
            "install-script",
            "new-guid",
            "new-networkswitchvlan",
            "new-scriptfileinfo",
            "new-temporaryfile",
            "publish-module",
            "publish-script",
            "register-psrepository",
            "remove-dscconfigurationdocument",
            "remove-networkswitchethernetportipaddress",
            "remove-networkswitchvlan",
            "restore-networkswitchconfiguration",
            "save-module",
            "save-networkswitchconfiguration",
            "save-script",
            "set-networkswitchethernetportipaddress",
            "set-networkswitchportmode",
            "set-networkswitchportproperty",
            "set-networkswitchvlanproperty",
            "set-psrepository",
            "stop-dscconfiguration",
            "test-scriptfileinfo",
            "uninstall-module",
            "uninstall-script",
            "unregister-psrepository",
            "update-dscconfiguration",
            "update-module",
            "update-modulemanifest",
            "update-script",
            "update-scriptfileinfo",
            "clear-recyclebin",
            "convertfrom-string",
            "convert-string",
            "debug-job",
            "debug-runspace",
            "disable-runspacedebug",
            "enable-runspacedebug",
            "enter-pshostprocess",
            "exit-pshostprocess",
            "find-package",
            "find-packageprovider",
            "get-clipboard",
            "get-cmsmessage",
            "get-itempropertyvalue",
            "get-package",
            "get-packageprovider",
            "get-packagesource",
            "get-pshostprocessinfo",
            "get-pssessioncapability",
            "get-runspace",
            "get-runspacedebug",
            "import-packageprovider",
            "install-package",
            "install-packageprovider",
            "invoke-dscresource",
            "new-psrolecapabilityfile",
            "protect-cmsmessage",
            "publish-dscconfiguration",
            "register-argumentcompleter",
            "register-packagesource",
            "save-package",
            "set-clipboard",
            "set-packagesource",
            "uninstall-package",
            "unprotect-cmsmessage",
            "unregister-packagesource",
            "wait-debugger",
            "write-information"
        )
        
        If ($CommandAst.GetCommandName() -eq $null) {
            Return $results
        } Else {
            $cmdName = $CommandAst.GetCommandName().ToLower();
        }
        
        If ($cmdName -in $cmds) {
            $result = [PSCustomObject]@{
                "Message" = "$cmdName requires PowerShell version 5 or higher.";
                "Extent" = $CommandAst.Extent;
                "RuleName" = "Test-PowerShellv5Command";
                "Severity" = "Warning"
            }
            $results += $result
        }
        
        Return $results
    }
}

<#
.SYNOPSIS
    Test commands against Windows 8.1/Windows Server 2012 R2
.DESCRIPTION
    Test commands against Windows 8.1/Windows Server 2012 R2
.EXAMPLE
    Test-OS62Command -CommandAst $CommandAst
.INPUTS
    [System.Management.Automation.Language.CommandAst]
.OUTPUTS
    [PSCustomObject[]]
.NOTES
    None.
#>

Function Test-OS62Command {
    [CmdletBinding()]
    [OutputType([PSCustomObject[]])]
    Param (
        [Parameter(Mandatory = $true)]
        [ValidateNotNullOrEmpty()]
        [System.Management.Automation.Language.CommandAst]$CommandAst
    )
    
    Process {
        $results = @()
        
        $cmds = @(
            "add-provisionedappxpackage",
            "apply-windowsunattend",
            "flush-volume",
            "get-provisionedappxpackage",
            "initialize-volume",
            "move-smbclient",
            "remove-provisionedappxpackage",
            "write-filesystemcache",
            "add-bcdatacacheextension",
            "add-bitlockerkeyprotector",
            "add-dnsclientnrptrule",
            "add-dtcclustertmmapping",
            "add-initiatoridtomaskingset",
            "add-mppreference",
            "add-neteventnetworkadapter",
            "add-neteventpacketcaptureprovider",
            "add-neteventprovider",
            "add-neteventvmnetworkadapter",
            "add-neteventvmswitch",
            "add-netiphttpscertbinding",
            "add-netlbfoteammember",
            "add-netlbfoteamnic",
            "add-netnatexternaladdress",
            "add-netnatstaticmapping",
            "add-netswitchteammember",
            "add-odbcdsn",
            "add-partitionaccesspath",
            "add-physicaldisk",
            "add-printer",
            "add-printerdriver",
            "add-printerport",
            "add-targetporttomaskingset",
            "add-virtualdisktomaskingset",
            "add-vpnconnection",
            "add-vpnconnectionroute",
            "add-vpnconnectiontriggerapplication",
            "add-vpnconnectiontriggerdnsconfiguration",
            "add-vpnconnectiontriggertrustednetwork",
            "backup-bitlockerkeyprotector",
            "block-smbshareaccess",
            "clear-assignedaccess",
            "clear-bccache",
            "clear-bitlockerautounlock",
            "clear-disk",
            "clear-dnsclientcache",
            "clear-filestoragetier",
            "close-smbopenfile",
            "close-smbsession",
            "connect-iscsitarget",
            "connect-virtualdisk",
            "copy-netfirewallrule",
            "copy-netipsecmainmodecryptoset",
            "copy-netipsecmainmoderule",
            "copy-netipsecphase1authset",
            "copy-netipsecphase2authset",
            "copy-netipsecquickmodecryptoset",
            "copy-netipsecrule",
            "debug-mmappprelaunch",
            "disable-bc",
            "disable-bcdowngrading",
            "disable-bcserveonbattery",
            "disable-bitlocker",
            "disable-bitlockerautounlock",
            "disable-damanualentrypointselection",
            "disable-mmagent",
            "disable-netadapter",
            "disable-netadapterbinding",
            "disable-netadapterchecksumoffload",
            "disable-netadapterencapsulatedpackettaskoffload",
            "disable-netadapteripsecoffload",
            "disable-netadapterlso",
            "disable-netadapterpowermanagement",
            "disable-netadapterqos",
            "disable-netadapterrdma",
            "disable-netadapterrsc",
            "disable-netadapterrss",
            "disable-netadaptersriov",
            "disable-netadaptervmq",
            "disable-netdnstransitionconfiguration",
            "disable-netfirewallrule",
            "disable-netiphttpsprofile",
            "disable-netipsecmainmoderule",
            "disable-netipsecrule",
            "disable-netnattransitionconfiguration",
            "disable-odbcperfcounter",
            "disable-physicaldiskindication",
            "disable-scheduledtask",
            "disable-smbdelegation",
            "disable-storageenclosureidentification",
            "disable-wdacbidtrace",
            "disconnect-iscsitarget",
            "disconnect-virtualdisk",
            "dismount-diskimage",
            "enable-bcdistributed",
            "enable-bcdowngrading",
            "enable-bchostedclient",
            "enable-bchostedserver",
            "enable-bclocal",
            "enable-bcserveonbattery",
            "enable-bitlocker",
            "enable-bitlockerautounlock",
            "enable-damanualentrypointselection",
            "enable-mmagent",
            "enable-netadapter",
            "enable-netadapterbinding",
            "enable-netadapterchecksumoffload",
            "enable-netadapterencapsulatedpackettaskoffload",
            "enable-netadapteripsecoffload",
            "enable-netadapterlso",
            "enable-netadapterpowermanagement",
            "enable-netadapterqos",
            "enable-netadapterrdma",
            "enable-netadapterrsc",
            "enable-netadapterrss",
            "enable-netadaptersriov",
            "enable-netadaptervmq",
            "enable-netdnstransitionconfiguration",
            "enable-netfirewallrule",
            "enable-netiphttpsprofile",
            "enable-netipsecmainmoderule",
            "enable-netipsecrule",
            "enable-netnattransitionconfiguration",
            "enable-odbcperfcounter",
            "enable-physicaldiskindication",
            "enable-scheduledtask",
            "enable-smbdelegation",
            "enable-storageenclosureidentification",
            "enable-wdacbidtrace",
            "export-bccachepackage",
            "export-bcsecretkey",
            "export-scheduledtask",
            "find-netipsecrule",
            "find-netroute",
            "format-volume",
            "get-appbackgroundtask",
            "get-appxlasterror",
            "get-appxlog",
            "get-assignedaccess",
            "get-bcclientconfiguration",
            "get-bccontentserverconfiguration",
            "get-bcdatacache",
            "get-bcdatacacheextension",
            "get-bchashcache",
            "get-bchostedcacheserverconfiguration",
            "get-bcnetworkconfiguration",
            "get-bcstatus",
            "get-bitlockervolume",
            "get-clusteredscheduledtask",
            "get-daclientexperienceconfiguration",
            "get-daconnectionstatus",
            "get-daentrypointtableitem",
            "get-disk",
            "get-diskimage",
            "get-dnsclient",
            "get-dnsclientcache",
            "get-dnsclientglobalsetting",
            "get-dnsclientnrptglobal",
            "get-dnsclientnrptpolicy",
            "get-dnsclientnrptrule",
            "get-dnsclientserveraddress",
            "get-dtc",
            "get-dtcadvancedhostsetting",
            "get-dtcadvancedsetting",
            "get-dtcclusterdefault",
            "get-dtcclustertmmapping",
            "get-dtcdefault",
            "get-dtclog",
            "get-dtcnetworksetting",
            "get-dtctransaction",
            "get-dtctransactionsstatistics",
            "get-dtctransactionstracesession",
            "get-dtctransactionstracesetting",
            "get-fileintegrity",
            "get-filestoragetier",
            "get-initiatorid",
            "get-initiatorport",
            "get-iscsiconnection",
            "get-iscsisession",
            "get-iscsitarget",
            "get-iscsitargetportal",
            "get-maskingset",
            "get-mmagent",
            "get-mpcomputerstatus",
            "get-mppreference",
            "get-mpthreat",
            "get-mpthreatcatalog",
            "get-mpthreatdetection",
            "get-ncsipolicyconfiguration",
            "get-net6to4configuration",
            "get-netadapter",
            "get-netadapteradvancedproperty",
            "get-netadapterbinding",
            "get-netadapterchecksumoffload",
            "get-netadapterencapsulatedpackettaskoffload",
            "get-netadapterhardwareinfo",
            "get-netadapteripsecoffload",
            "get-netadapterlso",
            "get-netadapterpowermanagement",
            "get-netadapterqos",
            "get-netadapterrdma",
            "get-netadapterrsc",
            "get-netadapterrss",
            "get-netadaptersriov",
            "get-netadaptersriovvf",
            "get-netadapterstatistics",
            "get-netadaptervmq",
            "get-netadaptervmqqueue",
            "get-netadaptervport",
            "get-netcompartment",
            "get-netconnectionprofile",
            "get-netdnstransitionconfiguration",
            "get-netdnstransitionmonitoring",
            "get-neteventnetworkadapter",
            "get-neteventpacketcaptureprovider",
            "get-neteventprovider",
            "get-neteventsession",
            "get-neteventvmnetworkadapter",
            "get-neteventvmswitch",
            "get-netfirewalladdressfilter",
            "get-netfirewallapplicationfilter",
            "get-netfirewallinterfacefilter",
            "get-netfirewallinterfacetypefilter",
            "get-netfirewallportfilter",
            "get-netfirewallprofile",
            "get-netfirewallrule",
            "get-netfirewallsecurityfilter",
            "get-netfirewallservicefilter",
            "get-netfirewallsetting",
            "get-netipaddress",
            "get-netipconfiguration",
            "get-netiphttpsconfiguration",
            "get-netiphttpsstate",
            "get-netipinterface",
            "get-netipsecdospsetting",
            "get-netipsecmainmodecryptoset",
            "get-netipsecmainmoderule",
            "get-netipsecmainmodesa",
            "get-netipsecphase1authset",
            "get-netipsecphase2authset",
            "get-netipsecquickmodecryptoset",
            "get-netipsecquickmodesa",
            "get-netipsecrule",
            "get-netipv4protocol",
            "get-netipv6protocol",
            "get-netisatapconfiguration",
            "get-netlbfoteam",
            "get-netlbfoteammember",
            "get-netlbfoteamnic",
            "get-netnat",
            "get-netnatexternaladdress",
            "get-netnatglobal",
            "get-netnatsession",
            "get-netnatstaticmapping",
            "get-netnattransitionconfiguration",
            "get-netnattransitionmonitoring",
            "get-netneighbor",
            "get-netoffloadglobalsetting",
            "get-netprefixpolicy",
            "get-netqospolicy",
            "get-netroute",
            "get-netswitchteam",
            "get-netswitchteammember",
            "get-nettcpconnection",
            "get-nettcpsetting",
            "get-netteredoconfiguration",
            "get-netteredostate",
            "get-nettransportfilter",
            "get-netudpendpoint",
            "get-netudpsetting",
            "get-odbcdriver",
            "get-odbcdsn",
            "get-odbcperfcounter",
            "get-offloaddatatransfersetting",
            "get-partition",
            "get-partitionsupportedsize",
            "get-pcsvdevice",
            "get-physicaldisk",
            "get-printconfiguration",
            "get-printer",
            "get-printerdriver",
            "get-printerport",
            "get-printerproperty",
            "get-printjob",
            "get-resiliencysetting",
            "get-scheduledtask",
            "get-scheduledtaskinfo",
            "get-smbbandwidthlimit",
            "get-smbclientconfiguration",
            "get-smbclientnetworkinterface",
            "get-smbconnection",
            "get-smbdelegation",
            "get-smbmapping",
            "get-smbmultichannelconnection",
            "get-smbmultichannelconstraint",
            "get-smbopenfile",
            "get-smbserverconfiguration",
            "get-smbservernetworkinterface",
            "get-smbsession",
            "get-smbshare",
            "get-smbshareaccess",
            "get-smbwitnessclient",
            "get-startapps",
            "get-storageenclosure",
            "get-storageenclosurevendordata",
            "get-storagejob",
            "get-storagenode",
            "get-storagepool",
            "get-storageprovider",
            "get-storagereliabilitycounter",
            "get-storagesetting",
            "get-storagesubsystem",
            "get-storagetier",
            "get-storagetiersupportedsize",
            "get-supportedclustersizes",
            "get-supportedfilesystems",
            "get-targetport",
            "get-targetportal",
            "get-virtualdisk",
            "get-virtualdisksupportedsize",
            "get-volume",
            "get-volumecorruptioncount",
            "get-volumescrubpolicy",
            "get-vpnconnection",
            "get-vpnconnectiontrigger",
            "get-wdacbidtrace",
            "get-windowsdeveloperlicense",
            "grant-smbshareaccess",
            "hide-virtualdisk",
            "import-bccachepackage",
            "import-bcsecretkey",
            "initialize-disk",
            "install-dtc",
            "lock-bitlocker",
            "mount-diskimage",
            "move-smbwitnessclient",
            "new-daentrypointtableitem",
            "new-eapconfiguration",
            "new-iscsitargetportal",
            "new-maskingset",
            "new-netadapteradvancedproperty",
            "new-neteventsession",
            "new-netfirewallrule",
            "new-netipaddress",
            "new-netiphttpsconfiguration",
            "new-netipsecdospsetting",
            "new-netipsecmainmodecryptoset",
            "new-netipsecmainmoderule",
            "new-netipsecphase1authset",
            "new-netipsecphase2authset",
            "new-netipsecquickmodecryptoset",
            "new-netipsecrule",
            "new-netlbfoteam",
            "new-netnat",
            "new-netnattransitionconfiguration",
            "new-netneighbor",
            "new-netqospolicy",
            "new-netroute",
            "new-netswitchteam",
            "new-nettransportfilter",
            "new-partition",
            "new-scheduledtask",
            "new-scheduledtaskaction",
            "new-scheduledtaskprincipal",
            "new-scheduledtasksettingsset",
            "new-scheduledtasktrigger",
            "new-smbmapping",
            "new-smbmultichannelconstraint",
            "new-smbshare",
            "new-storagepool",
            "new-storagesubsystemvirtualdisk",
            "new-storagetier",
            "new-virtualdisk",
            "new-virtualdiskclone",
            "new-virtualdisksnapshot",
            "new-volume",
            "new-vpnserveraddress",
            "open-netgpo",
            "optimize-volume",
            "publish-bcfilecontent",
            "publish-bcwebcontent",
            "read-printernfctag",
            "register-clusteredscheduledtask",
            "register-dnsclient",
            "register-iscsisession",
            "register-scheduledtask",
            "register-storagesubsystem",
            "remove-bcdatacacheextension",
            "remove-bitlockerkeyprotector",
            "remove-daentrypointtableitem",
            "remove-dnsclientnrptrule",
            "remove-dtcclustertmmapping",
            "remove-initiatorid",
            "remove-initiatoridfrommaskingset",
            "remove-iscsitargetportal",
            "remove-maskingset",
            "remove-mppreference",
            "remove-mpthreat",
            "remove-netadapteradvancedproperty",
            "remove-neteventnetworkadapter",
            "remove-neteventpacketcaptureprovider",
            "remove-neteventprovider",
            "remove-neteventsession",
            "remove-neteventvmnetworkadapter",
            "remove-neteventvmswitch",
            "remove-netfirewallrule",
            "remove-netipaddress",
            "remove-netiphttpscertbinding",
            "remove-netiphttpsconfiguration",
            "remove-netipsecdospsetting",
            "remove-netipsecmainmodecryptoset",
            "remove-netipsecmainmoderule",
            "remove-netipsecmainmodesa",
            "remove-netipsecphase1authset",
            "remove-netipsecphase2authset",
            "remove-netipsecquickmodecryptoset",
            "remove-netipsecquickmodesa",
            "remove-netipsecrule",
            "remove-netlbfoteam",
            "remove-netlbfoteammember",
            "remove-netlbfoteamnic",
            "remove-netnat",
            "remove-netnatexternaladdress",
            "remove-netnatstaticmapping",
            "remove-netnattransitionconfiguration",
            "remove-netneighbor",
            "remove-netqospolicy",
            "remove-netroute",
            "remove-netswitchteam",
            "remove-netswitchteammember",
            "remove-nettransportfilter",
            "remove-odbcdsn",
            "remove-partition",
            "remove-partitionaccesspath",
            "remove-physicaldisk",
            "remove-printer",
            "remove-printerdriver",
            "remove-printerport",
            "remove-printjob",
            "remove-smbbandwidthlimit",
            "remove-smbmapping",
            "remove-smbmultichannelconstraint",
            "remove-smbshare",
            "remove-storagepool",
            "remove-storagetier",
            "remove-targetportfrommaskingset",
            "remove-virtualdisk",
            "remove-virtualdiskfrommaskingset",
            "remove-vpnconnection",
            "remove-vpnconnectionroute",
            "remove-vpnconnectiontriggerapplication",
            "remove-vpnconnectiontriggerdnsconfiguration",
            "remove-vpnconnectiontriggertrustednetwork",
            "rename-daentrypointtableitem",
            "rename-maskingset",
            "rename-netadapter",
            "rename-netfirewallrule",
            "rename-netiphttpsconfiguration",
            "rename-netipsecmainmodecryptoset",
            "rename-netipsecmainmoderule",
            "rename-netipsecphase1authset",
            "rename-netipsecphase2authset",
            "rename-netipsecquickmodecryptoset",
            "rename-netipsecrule",
            "rename-netlbfoteam",
            "rename-netswitchteam",
            "rename-printer",
            "repair-fileintegrity",
            "repair-virtualdisk",
            "repair-volume",
            "reset-bc",
            "reset-daclientexperienceconfiguration",
            "reset-daentrypointtableitem",
            "reset-dtclog",
            "reset-ncsipolicyconfiguration",
            "reset-net6to4configuration",
            "reset-netadapteradvancedproperty",
            "reset-netdnstransitionconfiguration",
            "reset-netiphttpsconfiguration",
            "reset-netisatapconfiguration",
            "reset-netteredoconfiguration",
            "reset-physicaldisk",
            "reset-storagereliabilitycounter",
            "resize-partition",
            "resize-storagetier",
            "resize-virtualdisk",
            "restart-netadapter",
            "restart-pcsvdevice",
            "restart-printjob",
            "resume-bitlocker",
            "resume-printjob",
            "revoke-smbshareaccess",
            "save-netgpo",
            "set-assignedaccess",
            "set-bcauthentication",
            "set-bccache",
            "set-bcdatacacheentrymaxage",
            "set-bcminsmblatency",
            "set-bcsecretkey",
            "set-clusteredscheduledtask",
            "set-daclientexperienceconfiguration",
            "set-daentrypointtableitem",
            "set-disk",
            "set-dnsclient",
            "set-dnsclientglobalsetting",
            "set-dnsclientnrptglobal",
            "set-dnsclientnrptrule",
            "set-dnsclientserveraddress",
            "set-dtcadvancedhostsetting",
            "set-dtcadvancedsetting",
            "set-dtcclusterdefault",
            "set-dtcclustertmmapping",
            "set-dtcdefault",
            "set-dtclog",
            "set-dtcnetworksetting",
            "set-dtctransaction",
            "set-dtctransactionstracesession",
            "set-dtctransactionstracesetting",
            "set-fileintegrity",
            "set-filestoragetier",
            "set-initiatorport",
            "set-iscsichapsecret",
            "set-mmagent",
            "set-mppreference",
            "set-ncsipolicyconfiguration",
            "set-net6to4configuration",
            "set-netadapter",
            "set-netadapteradvancedproperty",
            "set-netadapterbinding",
            "set-netadapterchecksumoffload",
            "set-netadapterencapsulatedpackettaskoffload",
            "set-netadapteripsecoffload",
            "set-netadapterlso",
            "set-netadapterpowermanagement",
            "set-netadapterqos",
            "set-netadapterrdma",
            "set-netadapterrsc",
            "set-netadapterrss",
            "set-netadaptersriov",
            "set-netadaptervmq",
            "set-netconnectionprofile",
            "set-netdnstransitionconfiguration",
            "set-neteventpacketcaptureprovider",
            "set-neteventprovider",
            "set-neteventsession",
            "set-netfirewalladdressfilter",
            "set-netfirewallapplicationfilter",
            "set-netfirewallinterfacefilter",
            "set-netfirewallinterfacetypefilter",
            "set-netfirewallportfilter",
            "set-netfirewallprofile",
            "set-netfirewallrule",
            "set-netfirewallsecurityfilter",
            "set-netfirewallservicefilter",
            "set-netfirewallsetting",
            "set-netipaddress",
            "set-netiphttpsconfiguration",
            "set-netipinterface",
            "set-netipsecdospsetting",
            "set-netipsecmainmodecryptoset",
            "set-netipsecmainmoderule",
            "set-netipsecphase1authset",
            "set-netipsecphase2authset",
            "set-netipsecquickmodecryptoset",
            "set-netipsecrule",
            "set-netipv4protocol",
            "set-netipv6protocol",
            "set-netisatapconfiguration",
            "set-netlbfoteam",
            "set-netlbfoteammember",
            "set-netlbfoteamnic",
            "set-netnat",
            "set-netnatglobal",
            "set-netnattransitionconfiguration",
            "set-netneighbor",
            "set-netoffloadglobalsetting",
            "set-netqospolicy",
            "set-netroute",
            "set-nettcpsetting",
            "set-netteredoconfiguration",
            "set-netudpsetting",
            "set-odbcdriver",
            "set-odbcdsn",
            "set-partition",
            "set-pcsvdevicebootconfiguration",
            "set-physicaldisk",
            "set-printconfiguration",
            "set-printer",
            "set-printerproperty",
            "set-resiliencysetting",
            "set-scheduledtask",
            "set-smbbandwidthlimit",
            "set-smbclientconfiguration",
            "set-smbpathacl",
            "set-smbserverconfiguration",
            "set-smbshare",
            "set-storagepool",
            "set-storageprovider",
            "set-storagesetting",
            "set-storagesubsystem",
            "set-storagetier",
            "set-virtualdisk",
            "set-volume",
            "set-volumescrubpolicy",
            "set-vpnconnection",
            "set-vpnconnectionipsecconfiguration",
            "set-vpnconnectionproxy",
            "set-vpnconnectiontriggerdnsconfiguration",
            "set-vpnconnectiontriggertrustednetwork",
            "show-netfirewallrule",
            "show-netipsecrule",
            "show-virtualdisk",
            "show-windowsdeveloperlicenseregistration",
            "start-appbackgroundtask",
            "start-dtc",
            "start-dtctransactionstracesession",
            "start-mpscan",
            "start-neteventsession",
            "start-pcsvdevice",
            "start-scheduledtask",
            "stop-dtc",
            "stop-dtctransactionstracesession",
            "stop-neteventsession",
            "stop-pcsvdevice",
            "stop-scheduledtask",
            "suspend-bitlocker",
            "suspend-printjob",
            "sync-netipsecrule",
            "test-dtc",
            "test-netconnection",
            "unblock-smbshareaccess",
            "uninstall-dtc",
            "unlock-bitlocker",
            "unregister-appbackgroundtask",
            "unregister-clusteredscheduledtask",
            "unregister-iscsisession",
            "unregister-scheduledtask",
            "unregister-storagesubsystem",
            "unregister-windowsdeveloperlicense",
            "update-disk",
            "update-hoststoragecache",
            "update-iscsitarget",
            "update-iscsitargetportal",
            "update-mpsignature",
            "update-netipsecrule",
            "update-smbmultichannelconnection",
            "update-storagepool",
            "update-storageprovidercache",
            "write-dtctransactionstracesession",
            "write-printernfctag",
            "write-volumecache",
            "add-appxpackage",
            "add-appxprovisionedpackage",
            "add-certificateenrollmentpolicyserver",
            "add-kdsrootkey",
            "add-windowsdriver",
            "add-windowsimage",
            "add-windowspackage",
            "clear-kdscache",
            "clear-tpm",
            "clear-windowscorruptmountpoint",
            "complete-dtcdiagnostictransaction",
            "confirm-securebootuefi",
            "convertto-tpmownerauth",
            "disable-appbackgroundtaskdiagnosticlog",
            "disable-tlssessionticketkey",
            "disable-tpmautoprovisioning",
            "disable-windowserrorreporting",
            "disable-windowsoptionalfeature",
            "dismount-windowsimage",
            "enable-appbackgroundtaskdiagnosticlog",
            "enable-tlssessionticketkey",
            "enable-tpmautoprovisioning",
            "enable-windowserrorreporting",
            "enable-windowsoptionalfeature",
            "expand-windowsimage",
            "export-certificate",
            "export-pfxcertificate",
            "export-startlayout",
            "export-tlssessionticketkey",
            "export-windowsdriver",
            "export-windowsimage",
            "format-securebootuefi",
            "get-appxpackage",
            "get-appxpackagemanifest",
            "get-appxprovisionedpackage",
            "get-certificate",
            "get-certificateautoenrollmentpolicy",
            "get-certificateenrollmentpolicyserver",
            "get-certificatenotificationtask",
            "get-dapolicychange",
            "get-kdsconfiguration",
            "get-kdsrootkey",
            "get-pfxdata",
            "get-securebootpolicy",
            "get-securebootuefi",
            "get-tpm",
            "get-tpmendorsementkeyinfo",
            "get-tpmsupportedfeature",
            "get-wimbootentry",
            "get-winacceptlanguagefromlanguagelistoptout",
            "get-winculturefromlanguagelistoptout",
            "get-windefaultinputmethodoverride",
            "get-windowsdriver",
            "get-windowsedition",
            "get-windowserrorreporting",
            "get-windowsimage",
            "get-windowsimagecontent",
            "get-windowsoptionalfeature",
            "get-windowspackage",
            "get-windowssearchsetting",
            "get-winhomelocation",
            "get-winlanguagebaroption",
            "get-winsystemlocale",
            "get-winuilanguageoverride",
            "get-winuserlanguagelist",
            "import-certificate",
            "import-pfxcertificate",
            "import-startlayout",
            "import-tpmownerauth",
            "initialize-tpm",
            "join-dtcdiagnosticresourcemanager",
            "mount-windowsimage",
            "new-certificatenotificationtask",
            "new-dtcdiagnostictransaction",
            "new-netipsecauthproposal",
            "new-netipsecmainmodecryptoproposal",
            "new-netipsecquickmodecryptoproposal",
            "new-selfsignedcertificate",
            "new-tlssessionticketkey",
            "new-windowscustomimage",
            "new-windowsimage",
            "new-winuserlanguagelist",
            "optimize-windowsimage",
            "receive-dtcdiagnostictransaction",
            "remove-appxpackage",
            "remove-appxprovisionedpackage",
            "remove-certificateenrollmentpolicyserver",
            "remove-certificatenotificationtask",
            "remove-windowsdriver",
            "remove-windowsimage",
            "remove-windowspackage",
            "repair-windowsimage",
            "resolve-dnsname",
            "save-windowsimage",
            "send-dtcdiagnostictransaction",
            "set-appbackgroundtaskresourcepolicy",
            "set-appxprovisioneddatafile",
            "set-certificateautoenrollmentpolicy",
            "set-culture",
            "set-kdsconfiguration",
            "set-securebootuefi",
            "set-tpmownerauth",
            "set-winacceptlanguagefromlanguagelistoptout",
            "set-winculturefromlanguagelistoptout",
            "set-windefaultinputmethodoverride",
            "set-windowsedition",
            "set-windowsproductkey",
            "set-windowssearchsetting",
            "set-winhomelocation",
            "set-winlanguagebaroption",
            "set-winsystemlocale",
            "set-winuilanguageoverride",
            "set-winuserlanguagelist",
            "split-windowsimage",
            "start-dtcdiagnosticresourcemanager",
            "stop-dtcdiagnosticresourcemanager",
            "switch-certificate",
            "test-certificate",
            "test-kdsrootkey",
            "unblock-tpm",
            "undo-dtcdiagnostictransaction",
            "update-wimbootentry",
            "use-windowsunattend"
        )
        
        If ($CommandAst.GetCommandName() -eq $null) {
            Return $results
        } Else {
            $cmdName = $CommandAst.GetCommandName().ToLower();
        }
        
        If ($cmdName -in $cmds) {
            $result = [PSCustomObject]@{
                "Message" = "$cmdName requires Windows 8.1/Windows Server 2012 R2 or higher.";
                "Extent" = $CommandAst.Extent;
                "RuleName" = "Test-OS62Command";
                "Severity" = "Warning"
            }
            $results += $result
        }
        
        Return $results
    }
}

<#
.SYNOPSIS
    Test commands against Windows 10
.DESCRIPTION
    Test commands against Windows 10
.EXAMPLE
    Test-OS10Command -CommandAst $CommandAst
.INPUTS
    [System.Management.Automation.Language.CommandAst]
.OUTPUTS
    [PSCustomObject[]]
.NOTES
    None.
#>

Function Test-OS10Command {
    [CmdletBinding()]
    [OutputType([PSCustomObject[]])]
    Param (
        [Parameter(Mandatory = $true)]
        [ValidateNotNullOrEmpty()]
        [System.Management.Automation.Language.CommandAst]$CommandAst
    )
    
    Process {
        $results = @()
        
        $cmds = @(
            "disable-storagediagnosticlog",
            "enable-storagediagnosticlog",
            "get-disksnv",
            "get-physicaldisksnv",
            "get-storageenclosuresnv",
            "add-etwtraceprovider",
            "add-neteventwfpcaptureprovider",
            "assert-mockcalled",
            "assert-verifiablemocks",
            "block-fileshareaccess",
            "clear-pcsvdevicelog",
            "clear-storagediagnosticinfo",
            "debug-fileshare",
            "debug-storagesubsystem",
            "debug-volume",
            "disable-netadapterpacketdirect",
            "disable-physicaldiskidentification",
            "disable-pnpdevice",
            "disable-storagehighavailability",
            "enable-netadapterpacketdirect",
            "enable-physicaldiskidentification",
            "enable-pnpdevice",
            "enable-storagehighavailability",
            "get-autologgerconfig",
            "get-dedupproperties",
            "get-diskstoragenodeview",
            "get-etwtraceprovider",
            "get-etwtracesession",
            "get-fileshare",
            "get-fileshareaccesscontrolentry",
            "get-mockdynamicparameters",
            "get-netadapterpacketdirect",
            "get-neteventwfpcaptureprovider",
            "get-pcsvdevicelog",
            "get-physicaldiskstoragenodeview",
            "get-pnpdevice",
            "get-pnpdeviceproperty",
            "get-storageadvancedproperty",
            "get-storagediagnosticinfo",
            "get-storageenclosurestoragenodeview",
            "get-storagefaultdomain",
            "get-storagefileserver",
            "get-storagefirmwareinformation",
            "get-storagehealthaction",
            "get-storagehealthreport",
            "get-storagehealthsetting",
            "get-testdriveitem",
            "get-windowsupdatelog",
            "grant-fileshareaccess",
            "invoke-mock",
            "invoke-pester",
            "new-autologgerconfig",
            "new-etwtracesession",
            "new-fileshare",
            "new-fixture",
            "new-storagefileserver",
            "optimize-storagepool",
            "remove-autologgerconfig",
            "remove-etwtraceprovider",
            "remove-etwtracesession",
            "remove-fileshare",
            "remove-neteventwfpcaptureprovider",
            "remove-storagefileserver",
            "remove-storagehealthsetting",
            "revoke-fileshareaccess",
            "send-etwtracesession",
            "set-autologgerconfig",
            "set-dynamicparametervariables",
            "set-etwtraceprovider",
            "set-etwtracesession",
            "set-fileshare",
            "set-netadapterpacketdirect",
            "set-neteventwfpcaptureprovider",
            "set-pcsvdevicenetworkconfiguration",
            "set-pcsvdeviceuserpassword",
            "set-storagefileserver",
            "set-storagehealthsetting",
            "start-autologgerconfig",
            "start-mpwdoscan",
            "start-storagediagnosticlog",
            "stop-storagediagnosticlog",
            "stop-storagejob",
            "unblock-fileshareaccess",
            "update-storagefirmware",
            "add-appxvolume",
            "add-windowscapability",
            "disable-tlsciphersuite",
            "dismount-appxvolume",
            "enable-tlsciphersuite",
            "expand-windowscustomdataimage",
            "get-appxdefaultvolume",
            "get-appxvolume",
            "get-psreadlinekeyhandler",
            "get-psreadlineoption",
            "get-tlsciphersuite",
            "get-windowscapability",
            "mount-appxvolume",
            "move-appxpackage",
            "remove-appxvolume",
            "remove-psreadlinekeyhandler",
            "remove-windowscapability",
            "set-appxdefaultvolume",
            "set-psreadlinekeyhandler",
            "set-psreadlineoption"
        )
        
        If ($CommandAst.GetCommandName() -eq $null) {
            Return $results
        } Else {
            $cmdName = $CommandAst.GetCommandName().ToLower();
        }
        
        If ($cmdName -in $cmds) {
            $result = [PSCustomObject]@{
                "Message" = "$cmdName requires Windows 10 or higher.";
                "Extent" = $CommandAst.Extent;
                "RuleName" = "Test-OS10Command";
                "Severity" = "Warning"
            }
            $results += $result
        }
        
        Return $results
    }
}

<#
.SYNOPSIS
    Test commands against Windows Server OS
.DESCRIPTION
    Test commands against Windows Server OS
.EXAMPLE
    Test-ClientOSCommand -CommandAst $CommandAst
.INPUTS
    [System.Management.Automation.Language.CommandAst]
.OUTPUTS
    [PSCustomObject[]]
.NOTES
    None.
#>

Function Test-ServerOSCommand {
    [CmdletBinding()]
    [OutputType([PSCustomObject[]])]
    Param (
        [Parameter(Mandatory = $true)]
        [ValidateNotNullOrEmpty()]
        [System.Management.Automation.Language.CommandAst]$CommandAst
    )
    
    Process {
        $results = @()
        
        $cmds = @(
            "get-isesnippet",
            "import-isesnippet",
            "new-isesnippet",
            "get-applockerfileinformation",
            "get-applockerpolicy",
            "get-troubleshootingpack",
            "invoke-troubleshootingpack",
            "new-applockerpolicy",
            "set-applockerpolicy",
            "test-applockerpolicy"
        )
        
        If ($CommandAst.GetCommandName() -eq $null) {
            Return $results
        } Else {
            $cmdName = $CommandAst.GetCommandName().ToLower();
        }
        
        If ($cmdName -in $cmds) {
            $result = [PSCustomObject]@{
                "Message" = "$cmdName does not run on server core.";
                "Extent" = $CommandAst.Extent;
                "RuleName" = "Test-ServerOSCommand";
                "Severity" = "Warning"
            }
            $results += $result
        }
        
        Return $results
    }
}

Export-ModuleMember -Function "Test-*"