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