The other day I received an email from a student asking for some help in using PowerShell to take care of a user account on a local computer. He not only wanted to be able to set the password, which he had already figured out, but also how to enable or disable the account, which is not obvious or intuitive without experience using ADSI and the WinNT provider. I sent him some suggestions to get him started down the right path. But I realized, I should wrap up this functionality in a PowerShell tool since his task is something I assume many of you need and there are no cmdlets from Microsoft for managing local user accounts.
ManageEngine ADManager Plus - Download Free Trial
Exclusive offer on ADManager Plus for US and UK regions. Claim now!
First, let me point out that it is actually quite easy to manage local user accounts on remote computers using PowerShell. All you need to do is learn how to use the NET USER command and execute it using Invoke-Command.
invoke-command { net user } -computername chi-core01
invoke-command { net user localadmin } -computername chi-core01
The LocalAdmin account on CHI-CORE01 is currently disabled (account active is equal to no). But it is pretty easy to enable and set a new password.
invoke-command { net user localadmin P@ssw0rd /active:Yes } -computername chi-core01
However, this doesn't scale well and the capabilities of the NET USER command might vary by operating system. So here is a PowerShell function that utilizes ADSI to do the same thing.
#requires -version 2.0
Function Set-LocalUserAccount {
<#
.SYNOPSIS
Enable or disable a local user account.
.DESCRIPTION
This command will allow you to set the password of a local user account as well
as enable or disable it. By default, this command will not write anything to
the pipeline unless you use -Passthru. You must run this under credentials
that have administrator rights on the remote computer.
.PARAMETER ComputerName
The name of the computer to connect to. This parameter has an alias of CN.
.PARAMETER UserName
The name of the local user account on the computer.
.PARAMETER Password
The new password to set. This parameter has an alias of PWD.
.PARAMETER Status
Enable or disable the local user account.
.PARAMETER Passthru
Write the user account object to the pipeline
.EXAMPLE
PS C:\> Set-LocalUserAccount SERVER01,SERVER02 DBAdmin -status disable
Disable the local user account DBAdmin on SERVER01 and SERVER02
.EXAMPLE
PS C:\> get-content c:\work\computers.txt | set-localuseraccount LocalAdmin -password "^Crx33t7A"
Sets the password for account LocalAdmin on all computers in computers.txt
.NOTES
Version: 1.0
Author : Jeff Hicks (@JeffHicks)
Learn more:
PowerShell in Depth: An Administrator's Guide (http://www.manning.com/jones2/)
PowerShell Deep Dives (http://manning.com/hicks/)
Learn PowerShell 3 in a Month of Lunches (http://manning.com/jones3/)
Learn PowerShell Toolmaking in a Month of Lunches (http://manning.com/jones4/)
****************************************************************
* DO NOT USE IN A PRODUCTION ENVIRONMENT UNTIL YOU HAVE TESTED *
* THOROUGHLY IN A LAB ENVIRONMENT. USE AT YOUR OWN RISK. IF *
* YOU DO NOT UNDERSTAND WHAT THIS SCRIPT DOES OR HOW IT WORKS, *
* DO NOT USE IT OUTSIDE OF A SECURE, TEST SETTING. *
****************************************************************
.INPUTS
String
.OUTPUTS
None or System.DirectoryServices.DirectoryEntry
#>
[cmdletbinding(SupportsShouldProcess=$True)]
Param (
[Parameter(Position=0,ValueFromPipeline=$True,ValueFromPipelineByPropertyName=$True)]
[ValidateNotNullorEmpty()]
[Alias("cn")]
[string[]]$ComputerName=$env:COMPUTERNAME,
[Parameter(Position=1,Mandatory=$True,
HelpMessage="What is the name of the local user account?",
ValueFromPipelineByPropertyName=$True)]
[ValidateNotNullorEmpty()]
[string]$UserName,
[Parameter(ValueFromPipelineByPropertyName=$True)]
[Alias("pwd")]
[string]$Password,
[ValidateSet("Enable","Disable")]
[string]$Status="Enable",
[switch]$Passthru
)
Begin {
Write-Verbose "Starting $($myinvocation.mycommand)"
#define a constant to disable or enable an account
New-Variable ADS_UF_ACCOUNTDISABLE 0x0002 -Option Constant
Write-Verbose "Setting local user account $username"
} #begin
Process {
foreach ($computer in $computername) {
Write-Verbose "Connecting to $computer"
Write-Verbose "Getting user account"
$Account = [ADSI]"WinNT://$computer/$username,user"
#validate the user account was found
if (-NOT $Account.path) {
Write-Warning "Failed to find $username on $computername"
#bail out
Return
}
#Get current enabled/disabled status
if ($Account.userflags.value -band $ADS_UF_ACCOUNTDISABLE) {
$Enabled = $False
}
else {
$Enabled = $True
}
Write-verbose "Account enabled is $Enabled"
if ($enabled -AND ($Status -eq "Disable")) {
Write-Verbose "disabling the account"
$value=$Account.userflags.value -bor $ADS_UF_ACCOUNTDISABLE
$Account.put("userflags",$value)
}
elseif ((-NOT $enabled) -AND ($Status -eq "Enable")) {
Write-Verbose "Enabling the account"
$value=$Account.userflags.value -bxor $ADS_UF_ACCOUNTDISABLE
$Account.put("userflags",$value)
}
else {
#account is already in the desired state
Write-Verbose "No change necessary"
}
if ($Password) {
Write-Verbose "Setting acccount password"
$Account.SetPassword($Password)
}
#Whatif
if ($PSCmdlet.ShouldProcess("$computer\$username")) {
Write-Verbose "Committing changes"
$Account.SetInfo()
}
if ($Passthru) {
Write-Verbose "Passing object to the pipeline"
$Account
}
} #foreach
} #process
End {
Write-Verbose "Ending $($myinvocation.mycommand)"
} #end
} #end Set-LocalUserAccount function
This function should work in PowerShell 2.0 and later. The help content includes some usage examples. You can use this command to simply change the user password, or change the password while enabling or disabling the account. Enabling and disabling is accomplished with a bitwise operation with the userflags value and a constant flag that indicates the account is disabled.
There is probably more that could be added to the command such as setting the comment property and when the account expires. But I'll leave those changes to you for now.



2 thoughts on “Set Local User Account with PowerShell”
Comments are closed.