As Microsoft no longer supports creating local user accounts on domain machines using GPO, I’ve put together this script below to achieve this. However note that once the account is created it can be modified using GPO.
This script will create a local user account on a remote domain machine, set the account password to never expire and add the account to the local Administrators security group (or which ever other group you desire – just change variable).
Run this script on a domain controller server using a domain administrator account, before executing the script, create a txt or csv file containing all the names of the computers on which you wish to create the local user account on (and place it in the root of the C drive), and define the user account variables (such as username, password, description) in the variables section of the script.
#Define variables $computers = Get-Content C:\Computers.txt #$computers = Import-CSV C:\Computers.csv | select Computer $username = "Username" $password = "Password" $fullname = "Fullname" $local_security_group = "Administrators" $description = "Description" Foreach ($computer in $computers) { $users = $null $comp = [ADSI]"WinNT://$computer" #Check if username exists Try { $users = $comp.psbase.children | select -expand name if ($users -like $username) { Write-Host "$username already exists on $computer" } else { #Create the account $user = $comp.Create("User","$username") $user.SetPassword("$password") $user.Put("Description","$description") $user.Put("Fullname","$fullname") $user.SetInfo() #Set password to never expire #And set user cannot change password $ADS_UF_DONT_EXPIRE_PASSWD = 0x10000 $ADS_UF_PASSWD_CANT_CHANGE = 0x40 $user.userflags = $ADS_UF_DONT_EXPIRE_PASSWD + $ADS_UF_PASSWD_CANT_CHANGE $user.SetInfo() #Add the account to the local admins group $group = [ADSI]"WinNT://$computer/$local_security_group,group" $group.add("WinNT://$computer/$username") #Validate whether user account has been created or not $users = $comp.psbase.children | select -expand name if ($users -like $username) { Write-Host "$username has been created on $computer" } else { Write-Host "$username has not been created on $computer" } } } Catch { Write-Host "Error creating $username on $($computer.path): $($Error[0].Exception.Message)" } }