Skip to main content

Finding the Required Parameters in Parameter Sets

Every once and a while, a good mystery can be fun.  For IT Professionals taking a class, not so much.  During my last PowerShell class, one of my students made an observation in a help file.  The Cmdlet in question was Set-ADUser. Take a look at the help information on these two parameters.

-Identity <ADUser>
        Specifies an Active Directory user object by providing one of the following property values. The identifier in parentheses is the LDAP display name for the attribute. The acceptable values for this parameter are:
       
        -- A Distinguished Name
        -- A GUID (objectGUID)
        -- A Security Identifier (objectSid)
        -- A SAM Account Name (sAMAccountName)
       

        Required?                    true
        Position?                    1
        Default value               
        Accept pipeline input?       True (ByValue)
        Accept wildcard characters?  false

-Identity <ADUser>
        Specifies an Active Directory user object by providing one of the following property values. The identifier in parentheses is the LDAP display name for the attribute. The acceptable values for this parameter are:
       
        -- A Distinguished Name
        -- A GUID (objectGUID)
        -- A Security Identifier (objectSid)
        -- A SAM Account Name (sAMAccountName)
       

        Required?                    true
        Position?                    1
        Default value               
        Accept pipeline input?       True (ByValue)
        Accept wildcard characters?  false

 

Notice how both are “required” but we do not have to use both of them.  There is our mystery. This behavior is because they are in different parameters sets.  A parameter set is created when the author of the cmdlet adds functionality in which some of the parameters cannot be used at the same time as other parameters.  If you use a parameter that is in a parameter set other than the default set, then all the parameters that are not part of the new set are filtered out of TAB completion and the ISE intellisense. The problem is that the help files do not make note of which parameter set these parameters are a part of.  I decided to play around a little bit and create a cmdlet that uncovers this mystery.

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

Function Get-RequiredParameters

{

Param (

    $Cmdlet

)

    # Get all the parameters from the source.

    $Sets = Get-help $Cmdlet -full |

    Select -ExpandProperty Syntax |

    Select -ExpandProperty SyntaxItem

 

    # Create the object template for the output.

    $Object = New-Object -TypeName PSObject -Property @{

        Set = $Null

        Parameter = $Null

        Required = $False

    }

 

    # Get the Parameter Sets from the Source

    $CMD = Get-Command -Name $Cmdlet

    $SetNames = $Cmd.ParameterSets.Name

   

    # Used to cycle through the Parameter sets

    # whiel creating the output.

    $Index = 0

 

    ForEach ($Set in $Sets)

    {

       

        $Items = $Set

       

        ForEach ($Item in $Items)

        {

           

            ForEach ($P in $Item.Parameter)

            {

                $Obj = $Object

                $Obj.Set = $SetNames[$Index]

                $Obj.Parameter = $P.Name

                $Obj.Required = $P.Required

            

                Write-Output $Obj

               

            }

            $Index++

        }

    }

<#

.SYNOPSIS

Displays all parameter Sets and the required parameters of a Cmdlet

 

.DESCRIPTION

Displays all parameter Sets and the required parameters of a Cmdlet.

This will help to clear up any confusion as to why a help files says

that a parameter is required, when it may not be.

 

.PARAMETER Cmdlet

The name of the cmdlet (or script) that you want to view the parameter

information from.

 

.Example

Get-RequiredParameters -Cmdlet Measure-object

Parameter           Required Set          

---------           -------- ---          

Property            false    GenericMeasure

Average             false    GenericMeasure

InformationAction   false    GenericMeasure

InformationVariable false    GenericMeasure

InputObject         false    GenericMeasure

Maximum             false    GenericMeasure

Minimum             false    GenericMeasure

Sum                 false    GenericMeasure

Property            false    TextMeasure  

Character           false    TextMeasure  

IgnoreWhiteSpace    false    TextMeasure  

InformationAction   false    TextMeasure  

InformationVariable false    TextMeasure  

InputObject         false    TextMeasure  

Line                false    TextMeasure  

Word                false    TextMeasure

 

Displays the parameter information for each parameter set of Measure-Object

 

.Example

Get-RequiredParameters -Cmdlet Set-ADUser | where Required -eq $True

Parameter                     Required                     Set                        

---------                     --------                     ---                        

Identity                      true                         Identity                   

Instance                      true                         Instance

 

Displays only the parameters that are required in each parameter set,

 

.NOTES

===============================================================================

== Cmdlet: Get-RequiredParameters                                            ==

== Author: Jason A. Yoder                                                    ==

== Company: MCTExpert of Arizona                                             ==

== Date: December 3, 2015                                                    ==

== Copyright: All rights reserved.                                           ==

== Version: 1.0.0.0                                                          ==

== Legal: The user assumes all responsibility and liability for the usage of ==

== this PowerShell code.  MCTExpert of Arizona, Its officers, shareholders,  ==

== owners, and their relatives are not liable for any damages.  As with all  ==

== code, review it and understand it prior to usage.  It is recommended that ==

== this code be fully tested and validated in a test environment prior to    ==

== usage in a production environment.                                        ==

==                                                                           ==

== Does this code make changes: NO                                           ==

===============================================================================

#>

}

Comments

Popular posts from this blog

Adding a Comment to a GPO with PowerShell

As I'm writing this article, I'm also writing a customization for a PowerShell course I'm teaching next week in Phoenix.  This customization deals with Group Policy and PowerShell.  For those of you who attend my classes may already know this, but I sit their and try to ask the questions to myself that others may ask as I present the material.  I finished up my customization a few hours ago and then I realized that I did not add in how to put a comment on a GPO.  This is a feature that many Group Policy Administrators may not be aware of. This past summer I attended a presentation at TechEd on Group Policy.  One organization in the crowd had over 5,000 Group Policies.  In an environment like that, the comment section can be priceless.  I always like to write in the comment section why I created the policy so I know its purpose next week after I've completed 50 other tasks and can't remember what I did 5 minutes ago. In the Group Policy module for PowerShell V3, th

Return duplicate values from a collection with PowerShell

If you have a collection of objects and you want to remove any duplicate items, it is fairly simple. # Create a collection with duplicate values $Set1 = 1 , 1 , 2 , 2 , 3 , 4 , 5 , 6 , 7 , 1 , 2   # Remove the duplicate values. $Set1 | Select-Object -Unique 1 2 3 4 5 6 7 What if you want only the duplicate values and nothing else? # Create a collection with duplicate values $Set1 = 1 , 1 , 2 , 2 , 3 , 4 , 5 , 6 , 7 , 1 , 2   #Create a second collection with duplicate values removed. $Set2 = $Set1 | Select-Object -Unique   # Return only the duplicate values. ( Compare-Object -ReferenceObject $Set2 -DifferenceObject $Set1 ) . InputObject | Select-Object – Unique 1 2 This works with objects as well as numbers.  The first command creates a collection with 2 duplicates of both 1 and 2.   The second command creates another collection with the duplicates filtered out.  The Compare-Object cmdlet will first find items that are diffe

How to list all the AD LDS instances on a server

AD LDS allows you to provide directory services to applications that are free of the confines of Active Directory.  To list all the AD LDS instances on a server, follow this procedure: Log into the server in question Open a command prompt. Type dsdbutil and press Enter Type List Instances and press Enter . You will receive a list of the instance name, both the LDAP and SSL port numbers, the location of the database, and its status.