Private/New-IntuneWin32AppDetectionRule.ps1

function New-IntuneWin32AppDetectionRule {
    [Diagnostics.CodeAnalysis.SuppressMessageAttribute("PSUseShouldProcessForStateChangingFunctions", "", Justification = "Accepted for Intune detection objects.")]
    [OutputType([System.Collections.ArrayList])]
    [CmdletBinding(SupportsShouldProcess = $false)]
    param (
        [Parameter(
            Mandatory = $true,
            Position = 0,
            ValueFromPipeline,
            HelpMessage = "Pass a VcList object from Save-VcRedist.")]
        [ValidateNotNullOrEmpty()]
        [System.Management.Automation.PSObject] $VcList,

        [Parameter(
            Mandatory = $true,
            Position = 1)]
        [ValidateNotNullOrEmpty()]
        [System.Management.Automation.PSObject] $IntuneManifest
    )

    begin {
        $DetectionRules = New-Object -TypeName "System.Collections.ArrayList"
    }

    process {
        foreach ($VcRedist in $VcList) {
            foreach ($DetectionRuleItem in $IntuneManifest.DetectionRule) {
                switch ($DetectionRuleItem.Type) {
                    "MSI" {
                        # Create a MSI installation based detection rule
                        $DetectionRuleArgs = @{
                            "ProductCode"            = $DetectionRuleItem.ProductCode
                            "ProductVersionOperator" = $DetectionRuleItem.ProductVersionOperator
                        }
                        if (-not([System.String]::IsNullOrEmpty($DetectionRuleItem.ProductVersion))) {
                            $DetectionRuleArgs.Add("ProductVersion", $DetectionRuleItem.ProductVersion)
                        }

                        # Create MSI based detection rule
                        $DetectionRule = New-IntuneWin32AppDetectionRuleMSI @DetectionRuleArgs
                    }
                    "Script" {
                        # Create a PowerShell script based detection rule
                        $DetectionRuleArgs = @{
                            "ScriptFile"            = (Join-Path -Path $AppSourceFolder -ChildPath $DetectionRuleItem.ScriptFile)
                            "EnforceSignatureCheck" = [System.Convert]::ToBoolean($DetectionRuleItem.EnforceSignatureCheck)
                            "RunAs32Bit"            = [System.Convert]::ToBoolean($DetectionRuleItem.RunAs32Bit)
                        }

                        # Create script based detection rule
                        $DetectionRule = New-IntuneWin32AppDetectionRuleScript @DetectionRuleArgs
                    }
                    "Registry" {
                        if ($VcRedist.UninstallKey -eq "32") { $Check32BitOn64System = $true } else { $Check32BitOn64System = $false }
                        switch ($DetectionRuleItem.DetectionMethod) {
                            "Existence" {
                                # Construct registry existence detection rule parameters
                                $DetectionRuleArgs = @{
                                    "Existence"            = $true
                                    "KeyPath"              = $DetectionRuleItem.KeyPath -replace "{guid}", $VcRedist.ProductCode
                                    "DetectionType"        = $DetectionRuleItem.DetectionType
                                    "Check32BitOn64System" = $Check32BitOn64System
                                }
                                if (-not([System.String]::IsNullOrEmpty($DetectionRuleItem.ValueName))) {
                                    $DetectionRuleArgs.Add("ValueName", $DetectionRuleItem.ValueName)
                                }
                            }
                            "VersionComparison" {
                                # Construct registry version comparison detection rule parameters
                                $DetectionRuleArgs = @{
                                    "VersionComparison"         = $true
                                    "KeyPath"                   = $DetectionRuleItem.KeyPath
                                    "ValueName"                 = $DetectionRuleItem.ValueName
                                    "VersionComparisonOperator" = $DetectionRuleItem.Operator
                                    "VersionComparisonValue"    = $DetectionRuleItem.Value
                                    "Check32BitOn64System"      = $Check32BitOn64System
                                }
                            }
                            "StringComparison" {
                                # Construct registry string comparison detection rule parameters
                                $DetectionRuleArgs = @{
                                    "StringComparison"         = $true
                                    "KeyPath"                  = $DetectionRuleItem.KeyPath
                                    "ValueName"                = $DetectionRuleItem.ValueName
                                    "StringComparisonOperator" = $DetectionRuleItem.Operator
                                    "StringComparisonValue"    = $DetectionRuleItem.Value
                                    "Check32BitOn64System"     = $Check32BitOn64System
                                }
                            }
                            "IntegerComparison" {
                                # Construct registry integer comparison detection rule parameters
                                $DetectionRuleArgs = @{
                                    "IntegerComparison"         = $true
                                    "KeyPath"                   = $DetectionRuleItem.KeyPath
                                    "ValueName"                 = $DetectionRuleItem.ValueName
                                    "IntegerComparisonOperator" = $DetectionRuleItem.Operator
                                    "IntegerComparisonValue"    = $DetectionRuleItem.Value
                                    "Check32BitOn64System"      = $Check32BitOn64System
                                }
                            }
                        }

                        # Create registry based detection rule
                        $DetectionRule = New-IntuneWin32AppDetectionRuleRegistry @DetectionRuleArgs
                    }
                    "File" {
                        if ($VcRedist.Architecture -eq "x86") { $Check32BitOn64System = $true } else { $Check32BitOn64System = $false }
                        switch ($DetectionRuleItem.DetectionMethod) {
                            "Existence" {
                                # Create a custom file based requirement rule
                                $DetectionRuleArgs = @{
                                    "Existence"            = $true
                                    "Path"                 = $DetectionRuleItem.Path
                                    "FileOrFolder"         = $DetectionRuleItem.FileOrFolder
                                    "DetectionType"        = $DetectionRuleItem.DetectionType
                                    "Check32BitOn64System" = $Check32BitOn64System
                                }
                            }
                            "DateModified" {
                                # Create a custom file based requirement rule
                                $DetectionRuleArgs = @{
                                    "DateModified"         = $true
                                    "Path"                 = $DetectionRuleItem.Path
                                    "FileOrFolder"         = $DetectionRuleItem.FileOrFolder
                                    "Operator"             = $DetectionRuleItem.Operator
                                    "DateTimeValue"        = $DetectionRuleItem.DateTimeValue
                                    "Check32BitOn64System" = $Check32BitOn64System
                                }
                            }
                            "DateCreated" {
                                # Create a custom file based requirement rule
                                $DetectionRuleArgs = @{
                                    "DateCreated"          = $true
                                    "Path"                 = $DetectionRuleItem.Path
                                    "FileOrFolder"         = $DetectionRuleItem.FileOrFolder
                                    "Operator"             = $DetectionRuleItem.Operator
                                    "DateTimeValue"        = $DetectionRuleItem.DateTimeValue
                                    "Check32BitOn64System" = $Check32BitOn64System
                                }
                            }
                            "Version" {
                                # Create a custom file based requirement rule
                                $DetectionRuleArgs = @{
                                    "Version"              = $true
                                    "Path"                 = $(Split-Path -Path $VcRedist.DetectionFile)
                                    "FileOrFolder"         = $(Split-Path -Path $VcRedist.DetectionFile -Leaf)
                                    "Operator"             = $DetectionRuleItem.Operator
                                    "VersionValue"         = $VcRedist.Version
                                    "Check32BitOn64System" = $Check32BitOn64System
                                }
                            }
                            "Size" {
                                # Create a custom file based requirement rule
                                $DetectionRuleArgs = @{
                                    "Size"                 = $true
                                    "Path"                 = $DetectionRuleItem.Path
                                    "FileOrFolder"         = $DetectionRuleItem.FileOrFolder
                                    "Operator"             = $DetectionRuleItem.Operator
                                    "SizeInMBValue"        = $DetectionRuleItem.SizeInMBValue
                                    "Check32BitOn64System" = $Check32BitOn64System
                                }
                            }
                        }

                        # Create file based detection rule
                        $DetectionRule = New-IntuneWin32AppDetectionRuleFile @DetectionRuleArgs
                    }
                }

                # Add detection rule to list
                $DetectionRules.Add($DetectionRule) | Out-Null
            }
        }
    }

    end {
        # Return the collection of detection rules
        return $DetectionRules
    }
}