{"id":13461,"date":"2011-07-01T00:01:00","date_gmt":"2011-07-01T00:01:00","guid":{"rendered":"https:\/\/blogs.technet.microsoft.com\/heyscriptingguy\/2011\/07\/01\/naming-and-designing-advanced-powershell-functions\/"},"modified":"2011-07-01T00:01:00","modified_gmt":"2011-07-01T00:01:00","slug":"naming-and-designing-advanced-powershell-functions","status":"publish","type":"post","link":"https:\/\/devblogs.microsoft.com\/scripting\/naming-and-designing-advanced-powershell-functions\/","title":{"rendered":"Naming and Designing Advanced PowerShell Functions"},"content":{"rendered":"<p><b><br \/>Summary<\/b>: Microsoft Scripting Guy Ed Wilson discusses naming and designing advanced Windows PowerShell functions in relation to his Local User Management Module.\nMicrosoft Scripting Guy Ed Wilson here. The cool thing about today is that it is <a href=\"http:\/\/en.wikipedia.org\/wiki\/Canada_Day\">Canada Day<\/a>. This means that my boss back in Redmond is off today. Of course, <a href=\"http:\/\/en.wikipedia.org\/wiki\/Independence_Day_(United_States)\">Monday is July 4<sup>th<\/sup><\/a>, and the Scripting Wife and I will be off celebrating.&nbsp;The cool thing about this dual country celebration is that we effectively get a four-day weekend. In fact, the Scripting Wife and I will be heading to Canada in October for three weeks.&nbsp;We will be in Ottawa, Quebec City, and in Montreal. I am working with my friend, Georges Maheu, on a new workshop, and we will be conducting Train the Trainer sessions up there. I am also hoping to meet up with at least one users group while I am north of the border. It will be an awful lot of fun, and if we are lucky, maybe we can score some <a href=\"http:\/\/en.wikipedia.org\/wiki\/Poutine\">poutine<\/a> while we are in Quebec City.\n<a href=\"http:\/\/blogs.technet.comhttps:\/\/devblogs.microsoft.com\/scripting\/use-parameter-sets-to-simplify-powershell-commands\/\">In yesterday&rsquo;s post<\/a>, I talked a little bit about writing the <a href=\"http:\/\/gallery.technet.microsoft.com\/scriptcenter\/f75801e7-169a-4737-952c-1341abea5823?SRC=Home\">Local User Management Module<\/a> and how I used parameter sets to simplify some of the code syntax. On the page for the Local User Management Module in the Scripting Guys Script Repository, a couple of questions have already appeared. The first one is, &#8220;Does it work on domain users and groups?&#8221;&nbsp;To be honest I did not test that scenario. I do know that the WinNT provider (which I used in the module) can be used to make some modifications to Active Directory. I have always advocated that newbies stay away from that approach as it leads to serious confusion early on. After scripters have learned the difference between using the WinNT provider and the LDAP provider, there are some nice shortcuts that can be used with the WinNT provider that will simplify a few scenarios. The reason I called my module the Local User Management Module was specifically because I wanted to fill the hole that currently exists with local user accounts. For domain accounts, you should use either the Quest AD cmdlets or the Microsoft Windows 2008 R2 AD cmdlets (there is also the 2008 Gateway).\nThis having been said, there are some additional scenarios I will examine for the Local User Management Module, and I can guarantee there will be a V2 release soon.&nbsp;There may even be a V3.&nbsp;Send email to me at <a href=\"http:\/\/blogs.technet.commailto:Scripter@Microsoft.Com\">scripter@microsoft.com<\/a>, and let me know what you would like to see. In response to a <a href=\"http:\/\/blogs.technet.comhttps:\/\/devblogs.microsoft.com\/scripting\/use-parameter-sets-to-simplify-powershell-commands\/#comments\">comment on yesterday&rsquo;s Hey, Scripting Guy! Blog post<\/a>, I am thinking about incorporating security into the mixture.\nThere was an <a href=\"http:\/\/gallery.technet.microsoft.com\/scriptcenter\/f75801e7-169a-4737-952c-1341abea5823?SRC=Home\">additional question<\/a> about why I created a function named <strong>Set-LocalUser<\/strong> instead of creating two functions&#8211;one called <strong>Enable-LocalUser<\/strong> and another called <strong>Disable-LocalUser<\/strong>. The first part of the discussion needs to take a look at the verb.&nbsp;In fact, the entire discussion revolves around the verb. The first thing I do when deciding a verb name is to use the <strong>Get-Verb<\/strong> cmdlet. When I use that cmdlet, I am able to see which verbs are allowed. The listing appears here, along with the command I used to obtain the results.<\/p>\n<p style=\"padding-left: 30px\">PS C:Usersed.WOODGROVE&gt; get-verb | sort verb<\/p>\n<p style=\"padding-left: 30px\">Verb &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Group<\/p>\n<p style=\"padding-left: 30px\">&#8212;&#8212; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#8212;&#8212;-<\/p>\n<p style=\"padding-left: 30px\">Add &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Common<\/p>\n<p style=\"padding-left: 30px\">Approve &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Lifecycle<\/p>\n<p style=\"padding-left: 30px\">Assert &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Lifecycle<\/p>\n<p style=\"padding-left: 30px\">Backup &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Data<\/p>\n<p style=\"padding-left: 30px\">Block &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Security<\/p>\n<p style=\"padding-left: 30px\">Checkpoint &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Data<\/p>\n<p style=\"padding-left: 30px\">Clear &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Common<\/p>\n<p style=\"padding-left: 30px\">Close &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Common<\/p>\n<p style=\"padding-left: 30px\">Compare &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Data<\/p>\n<p style=\"padding-left: 30px\">Complete &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Lifecycle<\/p>\n<p style=\"padding-left: 30px\">Compress &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Data<\/p>\n<p style=\"padding-left: 30px\">Confirm &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Lifecycle<\/p>\n<p style=\"padding-left: 30px\">Connect &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Communications<\/p>\n<p style=\"padding-left: 30px\">Convert &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Data<\/p>\n<p style=\"padding-left: 30px\">ConvertFrom &nbsp;&nbsp; Data<\/p>\n<p style=\"padding-left: 30px\">ConvertTo &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Data<\/p>\n<p style=\"padding-left: 30px\">Copy &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Common<\/p>\n<p style=\"padding-left: 30px\">Debug &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Diagnostic<\/p>\n<p style=\"padding-left: 30px\">Deny &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Lifecycle<\/p>\n<p style=\"padding-left: 30px\">Disable &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Lifecycle<\/p>\n<p style=\"padding-left: 30px\">Disconnect &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Communications<\/p>\n<p style=\"padding-left: 30px\">Dismount &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Data<\/p>\n<p style=\"padding-left: 30px\">Edit &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Data<\/p>\n<p style=\"padding-left: 30px\">Enable &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Lifecycle<\/p>\n<p style=\"padding-left: 30px\">Enter &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Common<\/p>\n<p style=\"padding-left: 30px\">Exit &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Common<\/p>\n<p style=\"padding-left: 30px\">Expand &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Data<\/p>\n<p style=\"padding-left: 30px\">Export &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Data<\/p>\n<p style=\"padding-left: 30px\">Find &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Common<\/p>\n<p style=\"padding-left: 30px\">Format&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Common<\/p>\n<p style=\"padding-left: 30px\">Get &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Common<\/p>\n<p style=\"padding-left: 30px\">Grant &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Security<\/p>\n<p style=\"padding-left: 30px\">Group &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Data<\/p>\n<p style=\"padding-left: 30px\">Hide &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Common<\/p>\n<p style=\"padding-left: 30px\">Import&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Data<\/p>\n<p style=\"padding-left: 30px\">Initialize &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Data<\/p>\n<p style=\"padding-left: 30px\">Install &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Lifecycle<\/p>\n<p style=\"padding-left: 30px\">Invoke&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Lifecycle<\/p>\n<p style=\"padding-left: 30px\">Join &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Common<\/p>\n<p style=\"padding-left: 30px\">Limit &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Data<\/p>\n<p style=\"padding-left: 30px\">Lock &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Common<\/p>\n<p style=\"padding-left: 30px\">Measure &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Diagnostic<\/p>\n<p style=\"padding-left: 30px\">Merge &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Data<\/p>\n<p style=\"padding-left: 30px\">Mount &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Data<\/p>\n<p style=\"padding-left: 30px\">Move &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Common<\/p>\n<p style=\"padding-left: 30px\">New &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Common<\/p>\n<p style=\"padding-left: 30px\">Open &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Common<\/p>\n<p style=\"padding-left: 30px\">Out &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Data<\/p>\n<p style=\"padding-left: 30px\">Ping &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Diagnostic<\/p>\n<p style=\"padding-left: 30px\">Pop &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Common<\/p>\n<p style=\"padding-left: 30px\">Protect&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Security<\/p>\n<p style=\"padding-left: 30px\">Publish&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Data<\/p>\n<p style=\"padding-left: 30px\">Push &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Common<\/p>\n<p style=\"padding-left: 30px\">Read &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Communications<\/p>\n<p style=\"padding-left: 30px\">Receive &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Communications<\/p>\n<p style=\"padding-left: 30px\">Redo &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Common<\/p>\n<p style=\"padding-left: 30px\">Register &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Lifecycle<\/p>\n<p style=\"padding-left: 30px\">Remove &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Common<\/p>\n<p style=\"padding-left: 30px\">Rename &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Common<\/p>\n<p style=\"padding-left: 30px\">Repair &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Diagnostic<\/p>\n<p style=\"padding-left: 30px\">Request &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Lifecycle<\/p>\n<p style=\"padding-left: 30px\">Reset &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Common<\/p>\n<p style=\"padding-left: 30px\">Resolve &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Diagnostic<\/p>\n<p style=\"padding-left: 30px\">Restart&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Lifecycle<\/p>\n<p style=\"padding-left: 30px\">Restore &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Data<\/p>\n<p style=\"padding-left: 30px\">Resume &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Lifecycle<\/p>\n<p style=\"padding-left: 30px\">Revoke &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Security<\/p>\n<p style=\"padding-left: 30px\">Save &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Data<\/p>\n<p style=\"padding-left: 30px\">Search&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Common<\/p>\n<p style=\"padding-left: 30px\">Select &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Common<\/p>\n<p style=\"padding-left: 30px\">Send &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Communications<\/p>\n<p style=\"padding-left: 30px\">Set &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Common<\/p>\n<p style=\"padding-left: 30px\">Show &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Common<\/p>\n<p style=\"padding-left: 30px\">Skip &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Common<\/p>\n<p style=\"padding-left: 30px\">Split &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Common<\/p>\n<p style=\"padding-left: 30px\">Start &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Lifecycle<\/p>\n<p style=\"padding-left: 30px\">Step &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Common<\/p>\n<p style=\"padding-left: 30px\">Stop &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Lifecycle<\/p>\n<p style=\"padding-left: 30px\">Submit&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Lifecycle<\/p>\n<p style=\"padding-left: 30px\">Suspend &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Lifecycle<\/p>\n<p style=\"padding-left: 30px\">Switch &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Common<\/p>\n<p style=\"padding-left: 30px\">Sync &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Data<\/p>\n<p style=\"padding-left: 30px\">Test &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Diagnostic<\/p>\n<p style=\"padding-left: 30px\">Trace &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Diagnostic<\/p>\n<p style=\"padding-left: 30px\">Unblock &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Security<\/p>\n<p style=\"padding-left: 30px\">Undo &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Common<\/p>\n<p style=\"padding-left: 30px\">Uninstall &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Lifecycle<\/p>\n<p style=\"padding-left: 30px\">Unlock &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Common<\/p>\n<p style=\"padding-left: 30px\">Unprotect &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Security<\/p>\n<p style=\"padding-left: 30px\">Unpublish &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Data<\/p>\n<p style=\"padding-left: 30px\">Unregister &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Lifecycle<\/p>\n<p style=\"padding-left: 30px\">Update&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Data<\/p>\n<p style=\"padding-left: 30px\">Use &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Other<\/p>\n<p style=\"padding-left: 30px\">Wait &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Lifecycle<\/p>\n<p style=\"padding-left: 30px\">Watch &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Common<\/p>\n<p style=\"padding-left: 30px\">Write &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Communications\n&nbsp;\nAs you can see from the above list, there are <strong>Enable<\/strong> and <strong>Disable<\/strong> verbs,&nbsp;so why did I not use them if they are available? For one thing, they are listed as lifecycle verbs.\nSee <a href=\"http:\/\/msdn.microsoft.com\/en-us\/library\/ms714654.aspx\">MSDN for a great article that talks about some of the nuances between the different verbs<\/a>.\nIf <strong>Enable<\/strong> and <strong>Disable<\/strong> are lifecycle verbs, I need to see the other lifecycle verbs so that I can get a feel for how they behave (unfortunately, there is no help for the <strong>Get-Verb<\/strong> cmdlet to describe what the categories actually mean). Here is the command I used to get all the lifecycle verbs; the output from the commands also appears.<\/p>\n<p style=\"padding-left: 30px\">PS C:Usersed.WOODGROVE&gt; get-verb | where { $_.group -eq &#8216;lifecycle&#8217;}<\/p>\n<p style=\"padding-left: 30px\">Verb &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Group<\/p>\n<p style=\"padding-left: 30px\">&#8212;&#8212; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#8212;&#8212;-<\/p>\n<p style=\"padding-left: 30px\">Approve &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Lifecycle<\/p>\n<p style=\"padding-left: 30px\">Assert &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Lifecycle<\/p>\n<p style=\"padding-left: 30px\">Complete &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Lifecycle<\/p>\n<p style=\"padding-left: 30px\">Confirm &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Lifecycle<\/p>\n<p style=\"padding-left: 30px\">Deny &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Lifecycle<\/p>\n<p style=\"padding-left: 30px\">Disable &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Lifecycle<\/p>\n<p style=\"padding-left: 30px\">Enable &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Lifecycle<\/p>\n<p style=\"padding-left: 30px\">Install &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Lifecycle<\/p>\n<p style=\"padding-left: 30px\">Invoke&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Lifecycle<\/p>\n<p style=\"padding-left: 30px\">Register &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Lifecycle<\/p>\n<p style=\"padding-left: 30px\">Request &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Lifecycle<\/p>\n<p style=\"padding-left: 30px\">Restart&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Lifecycle<\/p>\n<p style=\"padding-left: 30px\">Resume &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Lifecycle<\/p>\n<p style=\"padding-left: 30px\">Start &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Lifecycle<\/p>\n<p style=\"padding-left: 30px\">Stop &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Lifecycle<\/p>\n<p style=\"padding-left: 30px\">Submit&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Lifecycle<\/p>\n<p style=\"padding-left: 30px\">Suspend &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Lifecycle<\/p>\n<p style=\"padding-left: 30px\">Uninstall &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Lifecycle<\/p>\n<p style=\"padding-left: 30px\">Unregister &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Lifecycle<\/p>\n<p style=\"padding-left: 30px\">Wait &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Lifecycle\n&nbsp;\nThe output from the lifecycle verbs did not help too much. The next thing I did was see how the <strong>Enable<\/strong> and <strong>Disable<\/strong> verbs are used in Windows PowerShell. To do that, I used the <strong>Get-Command<\/strong> cmdlet with the <i>verb<\/i> parameter. Because the <i>verb<\/i> parameter will accept an array, I can obtain the output I seek in a single command. The command and returned information appear here.<\/p>\n<p style=\"padding-left: 30px\">PS C:Usersed.WOODGROVE&gt; Get-Command -Verb enable, disable | select name<\/p>\n<p style=\"padding-left: 30px\">Name<\/p>\n<p style=\"padding-left: 30px\">&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;<\/p>\n<p style=\"padding-left: 30px\">Disable-ComputerRestore<\/p>\n<p style=\"padding-left: 30px\">Disable-PSBreakpoint<\/p>\n<p style=\"padding-left: 30px\">Disable-PSRemoting<\/p>\n<p style=\"padding-left: 30px\">Disable-PSSessionConfiguration<\/p>\n<p style=\"padding-left: 30px\">Disable-WSManCredSSP<\/p>\n<p style=\"padding-left: 30px\">Enable-ComputerRestore<\/p>\n<p style=\"padding-left: 30px\">Enable-PSBreakpoint<\/p>\n<p style=\"padding-left: 30px\">Enable-PSRemoting<\/p>\n<p style=\"padding-left: 30px\">Enable-PSSessionConfiguration<\/p>\n<p style=\"padding-left: 30px\">Enable-WSManCredSSP\nAs I looked over the listing of cmdlets, I saw things like <strong>Enable<\/strong>\/<strong>Disable<\/strong> <strong>PSRemoting<\/strong> and <strong>Enable<\/strong>\/<strong>Disable<\/strong> <strong>ComputerRestore<\/strong>. I then decided to look at cmdlets with a noun of <strong>Service<\/strong>. Here is the command and results.<\/p>\n<p style=\"padding-left: 30px\">PS C:Usersed.WOODGROVE&gt; Get-Command -Noun service | select name<\/p>\n<p style=\"padding-left: 30px\">Name<\/p>\n<p style=\"padding-left: 30px\">&#8212;&#8212;&#8212;&#8212;-<\/p>\n<p style=\"padding-left: 30px\">Get-Service<\/p>\n<p style=\"padding-left: 30px\">New-Service<\/p>\n<p style=\"padding-left: 30px\">Restart-Service<\/p>\n<p style=\"padding-left: 30px\">Resume-Service<\/p>\n<p style=\"padding-left: 30px\">Set-Service<\/p>\n<p style=\"padding-left: 30px\">Start-Service<\/p>\n<p style=\"padding-left: 30px\">Stop-Service<\/p>\n<p style=\"padding-left: 30px\">Suspend-Service\nIn the above listing, you will see that there is no&nbsp;<strong>Enable<\/strong>\/<strong>Disable<\/strong> service cmdets. They do have <strong>Set-Service<\/strong>. To disable or enable a service, I use <strong>Set-Service<\/strong>. This is because I am not actually disabling the service, but am instead changing a property of the service to <em>Disabled<\/em>. I will admit it causes confusion, and I have known a lot of people who resort to using WMI to&nbsp;<strong>Enable<\/strong>\/<strong>Disable<\/strong> a service because they do not realize they can do it via the <strong>Set-Service<\/strong> cmdlet.\nThe next thing to look at is what is my <strong>Set-LocalUser<\/strong> cmdlet actually doing? When I disable the user, it does not actually disable the user; rather, it sets a <em>userflag<\/em> property to the <strong>ADS_USER_FLAG_ENUM<\/strong> value of 2. It also sets the <em>description<\/em> property of the user at the same time. To enable a user, the <strong>Set-LocalUser<\/strong> function performs three actions: it sets the password, the userflags, and the description.&nbsp;Because of this, I decided that it was more than a simple&nbsp;<strong>Enable<\/strong>\/<strong>Disable<\/strong> action that was being performed.\nThe <strong>Set-LocalGroup<\/strong> function was a bit trickier.&nbsp;Here, I am simply calling either the <i>add<\/i> or the <i>remove<\/i> method,&nbsp;and from our listing of approved verbs, <strong>Add<\/strong> and <strong>Remove <\/strong>are on the list. But what should I call the function? <strong>Add-Group<\/strong>, <strong>Remove-Group<\/strong>? Of course not! If I am creating a group or deleting a group, I use <strong>Add-Group<\/strong>\/<strong>Remove-Group<\/strong> (or more specifically in my case <strong>Add-LocalGroup<\/strong> and <strong>Remove-LocalGroup<\/strong>). The next thing I thought about was using the names <strong>Add-ToLocalGroup<\/strong> and <strong>Remove-FromLocalGroup<\/strong>. In the end, it seemed that <strong>Set-LocalGroup<\/strong> was the right decision because I am actually setting the group membership (regardless of the actual methods in use in the code). The other advantage is that I avoided having to create two functions;&nbsp;I was able to use only one function to perform both the <em>add<\/em> and the <em>remove<\/em> methods to the group membership.\nNow, let&rsquo;s go back and look at the <strong>Set-LocalUser<\/strong>. I could have used <strong>Enable<\/strong> and <strong>Disable<\/strong>,&nbsp;and I actually did spend a lot of time thinking about the name. As you can see from the above discussion, one problem with <strong>Set-Service<\/strong> is that people do not think about using it to enable or to disable a service. According to the verbs, I guess I can use either <strong>Enable<\/strong>\/<strong>Disable<\/strong> or <strong>Set<\/strong>, and still be following the guidelines. There is one other guideline that I probably violated and that is the principle of least shock, which is&nbsp;also an issue with <strong>Set-Service<\/strong>. If everyone who uses the software expects something to be called <strong>Enable-LocalUser<\/strong>, discoverability becomes an issue. Again, the overriding factor for me was wanting to incorporate the functionality, follow good Windows PowerShell naming conventions, and get the thing written in time for yesterday&rsquo;s Hey, Scripting Guy! Blog post to be edited and published. You see, when it comes right down to it, to ship is to choose.\nWell, this concludes another edition of the Hey, Scripting Guy! Blog. Join me tomorrow when I will show you how to use the Local User Management Module .\nI invite you to follow me on <a href=\"http:\/\/bit.ly\/scriptingguystwitter\">Twitter<\/a> and <a href=\"http:\/\/bit.ly\/scriptingguysfacebook\">Facebook<\/a>. If you have any questions, send email to me at <a href=\"http:\/\/blogs.technet.commailto:scripter@microsoft.com\">scripter@microsoft.com<\/a>, or post your questions on the <a href=\"http:\/\/bit.ly\/scriptingforum\">Official Scripting Guys Forum<\/a>. See you tomorrow. Until then, peace.\n<b>Ed Wilson, Microsoft Scripting Guy<\/b>\n<b><\/b>&nbsp;<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Summary: Microsoft Scripting Guy Ed Wilson discusses naming and designing advanced Windows PowerShell functions in relation to his Local User Management Module. Microsoft Scripting Guy Ed Wilson here. The cool thing about today is that it is Canada Day. This means that my boss back in Redmond is off today. Of course, Monday is July [&hellip;]<\/p>\n","protected":false},"author":595,"featured_media":87096,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[1],"tags":[69,3,4,45,77],"class_list":["post-13461","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-scripting","tag-functions","tag-scripting-guy","tag-scripting-techniques","tag-windows-powershell","tag-writing"],"acf":[],"blog_post_summary":"<p>Summary: Microsoft Scripting Guy Ed Wilson discusses naming and designing advanced Windows PowerShell functions in relation to his Local User Management Module. Microsoft Scripting Guy Ed Wilson here. The cool thing about today is that it is Canada Day. This means that my boss back in Redmond is off today. Of course, Monday is July [&hellip;]<\/p>\n","_links":{"self":[{"href":"https:\/\/devblogs.microsoft.com\/scripting\/wp-json\/wp\/v2\/posts\/13461","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/devblogs.microsoft.com\/scripting\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/devblogs.microsoft.com\/scripting\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/scripting\/wp-json\/wp\/v2\/users\/595"}],"replies":[{"embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/scripting\/wp-json\/wp\/v2\/comments?post=13461"}],"version-history":[{"count":0,"href":"https:\/\/devblogs.microsoft.com\/scripting\/wp-json\/wp\/v2\/posts\/13461\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/scripting\/wp-json\/wp\/v2\/media\/87096"}],"wp:attachment":[{"href":"https:\/\/devblogs.microsoft.com\/scripting\/wp-json\/wp\/v2\/media?parent=13461"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/scripting\/wp-json\/wp\/v2\/categories?post=13461"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/scripting\/wp-json\/wp\/v2\/tags?post=13461"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}