UsersAndGroups/Install-User.ps1

# Copyright 2012 Aaron Jensen
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

function Install-User
{
    <#
    .SYNOPSIS
    Installs a *local* user account.
 
    .DESCRIPTION
    Creates a new *local* user account, or, if the account already exists, updates its password and description. In both cases, the users password is set to never expire. This should probably be a parameter. Send us a patch!
 
    .EXAMPLE
    Install-User -Username LSkywalker -Password "whydidn'tyoutellme" -Description "Luke Skywalker's account."
 
    Creates a new `LSkywalker` user account with the given password and description. Luke's password is set ot never expire.
    #>

    [CmdletBinding(SupportsShouldProcess=$true)]
    param(
        [Parameter(Mandatory=$true)]
        [ValidateLength(1,20)]
        [string]
        # The username for the user.
        $Username,
        
        [Parameter(Mandatory=$true)]
        [string]
        # The user's password.
        $Password,
        
        [Parameter()]
        [string]
        # A description of the user.
        $Description,
        
        [Parameter()]
        [string]
        # The full name of the user.
        $FullName
    )
    
    $userExists = Test-User -Username $username
    $operation = 'update'
    $logAction = 'Updating'
    $addArg = ''
    if( -not $userExists )
    {
        $addArg = '/ADD'
        $operation = 'create'
        $logAction = 'Creating'
    }
    
    if( $pscmdlet.ShouldProcess( $Username, "$operation local user" ) )
    {
        & (Resolve-NetPath) user $Username $Password $addArg /Comment:$Description /Fullname:$FullName /Y
        
        if( -not $userExists )
        {
            $user = Get-WmiLocalUserAccount -Username $Username
            $user.PasswordExpires = $false
            $user.Put()
        }
    }
}