Tired of guessing or remembering which prefix to use when setting up a new computer? Or what about when you by accident fat finger it, and you have to redo it? Or even, you have multiple people in your department, and you want to make sure everyone is creating them the same way?
This function I created will solve all of these issues, and you can customize it to your company standards very easily.
I’ll break it down to smaller parts, then we will put it all together.
function Rename-ComputerWithTag {
First we name our function with the function “verb-noun” naming convention then the { and we will add a closing one below it(If you are using VSCode it will automatically create it).
[CmdletBinding(SupportsShouldProcess=$true)]
param (
Then we add [CmdletBinding(SupportShouldProcess=true)], to make it an advanced function and also to support -WhatIf and -Confirm, which I highly recommend when you are changing(adding/deleteting) anything with PowerShell. WhatIf will show you what is going on without actually doing it and Confirm will ask you to confirm that is what you really want to do.
[Parameter(Mandatory = $true, Position = 0)]
[ValidateSet('CA', 'MA', 'NC', 'NY', 'FL')]
[string]$Prefix,
Next we have have the parameters for the function. The mandatory = $true, means you can’t go any farther unless this is filled out. The position 0 means that it muse be the first or only unnamed parameter. A quick example that would work is Rename-ComputerWithTag NY-23221, but if you did Rename-ComputerWithTag 9322 NY-23221, where the 9322 is the asset tag number, this wouldn’t work because the computer name isn’t first.
Then we have one of my favorites, ValidateSet. It is exactly what you think it is, if you don’t put in one of those values, you can’t go any further. This is great for a couple of reasons; you can ensure the user is inputting a company approved value and it gives them tab completion, so if they can’t remember the exact spelling, they can just press tab and it will tab through each option for that parameter. This has saved me many times!
Finally, we get to the variable, where you see [string] right before it. The reason for that is to define what type of variable it is and so that PowerShell knows to handle that value as a string, and not like a date. I always define the type, as I’ve been burned before when I wasn’t getting the expected results and troubleshooted longer than I’d like to admit!
[Parameter(Mandatory = $false, Position = 1)]
[string]$AssetTag,
Here you can see that the $AssetTag parameter isn’t required, and should be in the 2nd position. I know it’s a little confusing at first if your new to PowerShell/Coding, but I promise you’ll learn quickly. Again, you see that we used the string type for the asset tag as it could have both letters and numbers in it.
[Parameter(Mandatory = $true)]
[string]$ComputerName
For the final parameter in the function, you can see that the computer name is mandatory, but there is no required position for it. You can also just put (Mandatory) instead of Mandatory = $true, if you want. I’m just use to still doing the = $true, but both ways work.
$ComputerStatus = Test-Connection -ComputerName $ComputerName -Count 1 -Quiet
The next part of this script is making sure the computer you want to change of the of is reachable. Make sure that the computer you are trying to change the name of can be pinged, if not it will fail. Test-Connection is what sends the ping, -Count is how many times do you want to try and ping the computer, and -Quiet makes it so it returns back $true or $false depending on the state of the computer. Then it is saved into the $ComputerStatus variable for future use.
if ($ComputerStatus -eq $true) {
Write-Verbose -Message "$ComputerName was found. Beginning Rename Process"
}
What this does is take the result from $ComputerStatus, and if it returns $true, then write a message if -Verbose is used, to say that it was found and it will begin renaming the computer.
else {
Write-Error "The computer $ComputerName is offline. Please try again when the computer is online."
}
And this will write an error that the computer is offline if the $ComputerStatus comes back as $flase
if (-not $AssetTag) {
$AssetTag = (Get-CimInstance -ClassName Win32_BIOS).SerialNumber
}
Now that we know if we’ve gotten this far that the computer is online. Now we will check if an Asset Tag was given, if not it will find the computer’s serial number and use that.
$NewName = '{0}-{1}' -f $Prefix, $AssetTag
This will combine the Prefix and the AssetTag(or serial) with a hyphen inbetween, and save it to the $NewName variable. It knows to format it like this due to the -f and assigns the Prefix the 0 position and the AssetTag the 1 position.
if ($PSCmdlet.ShouldProcess($ComputerName, $NewName, "Rename-Computer")) {
Rename-Computer -ComputerName $ComputerName -NewName $NewName -Force
}
Now the part we have all been waiting for… the actual renaming of the computer! What this does is makes sure that the -WhatIf and -Confirm do work, and we have it so it will force the renaming. This will not automatically reboot the computer, it will ask you to, but if you wanted to, you could add that feature in.
Write-Verbose -Message "$ComputerName changed to $NewName"
$NewName
And this will write that the computer name has changed if you use -verbose, and if you don’t this will just show the computer’s new name.
I didn’t go line by line on the Help for it, but I’ll do another Blog Post specifically on help and it’s importance(It’s very important!)
Hoping you found this useful, as it it makes it very easy to make sure everyone follows the same procedures when naming computers.
If you have any questions or see anyway to improve the function, please reach out!
Below is the full function, and here is the link to the GitHub
PowerShellGeneral/Rename-ComputerWithTag.ps1 at main · DevClate/PowerShellGeneral
<#
.SYNOPSIS
Renames a computer with a prefix and asset tag.
.DESCRIPTION
This function renames the local computer with a prefix of CA, MA, NC, NY, or FL followed by a hyphen and an asset tag. If an asset tag isn't given, it uses the computer's serial number with CIM.
.PARAMETER Prefix
The prefix to use for the new computer name.
.PARAMETER AssetTag
The asset tag to use for the new computer name. Optional.
.PARAMETER ComputerName
Computer you want to change the name of. Local or Remote.
.PARAMETER WhatIf
Displays what the command would do if run, without actually running the command.
.PARAMETER Confirm
Prompts you for confirmation before running the command.
.EXAMPLE
Rename-ComputerWithTag -Prefix CA -AssetTag 900123 -Confirm
This prompts you for confirmation before renaming the computer with the prefix "CA" and the asset tag "900123".
.EXAMPLE
Rename-ComputerWithTag -Prefix FL -WhatIf
This displays what the command would do if run, without actually renaming the computer. The new computer name will have the prefix "FL" and the asset tag set to the computer's serial number.
.EXAMPLE
Rename-ComputerWithTag -Prefix NC -AssetTag 900134 -ComputerName DESKTOP-4I9DF1
This prompts you for confirmation before renaming the remote computer "DESKTOP-4I9DF1" with the prefix "NC" and the asset tag "900134".
#>
function Rename-ComputerWithTag {
[CmdletBinding(SupportsShouldProcess=$true)]
param (
[Parameter(Mandatory = $true, Position = 0)]
[ValidateSet('CA', 'MA', 'NC', 'NY', 'FL')]
[string]$Prefix,
[Parameter(Mandatory = $false, Position = 1)]
[string]$AssetTag,
[Parameter(Mandatory = $true)]
[string]$ComputerName
)
#Check if the computer is online
$ComputerStatus = Test-Connection -ComputerName $ComputerName -Count 1 -Quiet
#If the computer is online, proceed with the name change
if ($ComputerStatus -eq $true) {
#Write that computer was found and beginning renaming process
Write-Verbose -Message "$ComputerName was found. Beginning Rename Process"
}
#If the computer is offline, display an error message
else {
Write-Error "The computer $ComputerName is offline. Please try again when the computer is online."
}
# Get the computer's serial number with CIM if an asset tag isn't given
if (-not $AssetTag) {
$AssetTag = (Get-CimInstance -ClassName Win32_BIOS).SerialNumber
}
# Build the new computer name
$NewName = '{0}-{1}' -f $Prefix, $AssetTag
# Rename the computer
if ($PSCmdlet.ShouldProcess($ComputerName, $NewName, "Rename-Computer")) {
Rename-Computer -ComputerName $ComputerName -NewName $NewName -Force
}
# Output the new computer name
Write-Verbose -Message "$ComputerName changed to $NewName"
$NewName
}