First off, I want to give a shout out to Author: Martin
Schvartzman and his blog posting https://blogs.technet.microsoft.com/pstips/2014/06/09/dynamic-validateset-in-a-dynamic-parameter/.
A question that I often get when teaching parameter
validation is "can you load the values of a parameter dynamically?" Up until now, my answer was no.  Time to change that.  After getting that question again, I did some
more research and found Martin’s article. 
Simply adjusting 1 line of the code from his blog posting allowed me to
load the SamAccountNames of all users in the domain as the valid, and TAB complete capable, values of a parameter.  Below is that
code:
# Author: Martin Schvartzman
#
https://blogs.technet.microsoft.com/pstips/2014/06/09/dynamic-validateset-in-a-dynamic-parameter/
# Minor modifications: Jason Yoder
function Test-DynamicValidateSet
{
    [CmdletBinding()]
    Param(
        # Any
other parameters can go here
    )
    DynamicParam
{
            # Set
the dynamic parameters' name
            $ParameterName
= 'User'
            #
Create the dictionary 
            $RuntimeParameterDictionary
= New-Object System.Management.Automation.RuntimeDefinedParameterDictionary
            #
Create the collection of attributes
            $AttributeCollection
= New-Object System.Collections.ObjectModel.Collection[System.Attribute]
            #
Create and set the parameters' attributes
            $ParameterAttribute
= New-Object System.Management.Automation.ParameterAttribute
            $ParameterAttribute.Mandatory
= $true
            $ParameterAttribute.Position
= 1
            # Add
the attributes to the attributes collection
            $AttributeCollection.Add($ParameterAttribute)
            #
Generate and set the ValidateSet.
            #
Change the next line to produce what you want to auto populate for the
parameter.
            #
Make sure it is DataType String.
            $arrSet
= Get-ADUser -Filter
* | Select-Object
-ExpandProperty SamAccountName
            $ValidateSetAttribute
= New-Object System.Management.Automation.ValidateSetAttribute($arrSet)
            # Add
the ValidateSet to the attributes collection
            $AttributeCollection.Add($ValidateSetAttribute)
            #
Create and return the dynamic parameter
            $RuntimeParameter
= New-Object System.Management.Automation.RuntimeDefinedParameter($ParameterName, [string],
$AttributeCollection)
            $RuntimeParameterDictionary.Add($ParameterName, $RuntimeParameter)
            return
$RuntimeParameterDictionary
    }
    begin {
        # Bind
the parameter to a friendly variable
        $User
= $PsBoundParameters[$ParameterName]
    }
    process
{
        # Your
code goes here
        Get-ADUser
-Identity $USer
    }
}
Comments