How do I get the localhost (machine) name in PowerShell? I am using PowerShell 1.0.
13 Answers
You can just use the .NET Framework method:
[System.Net.Dns]::GetHostName()
also
$env:COMPUTERNAME
4 Comments
[System.Net.Dns]::GetHostName() (doesn't truncate) is better than $env:COMPUTERNAME (truncates)$env:COMPUTERNAME works fine on Windows 10 (please note dollar sign at the beginning)$env:COMPUTERNAME won't work on Linux and macOS. However, [Environment]::MachineName does.Don't forget that all your old console utilities work just fine in PowerShell:
PS> hostname
KEITH1
2 Comments
$name = $(hostname)Long form:
get-content env:computername
Short form:
gc env:computername
4 Comments
computername is the NetBIOS name, which is limited to 15 characters.A slight tweak on @grepit's answer, for the local FQDN:
[System.Net.DNS]::GetHostByName($Null).HostName
Comments
In PowerShell Core v6 (works on macOS, Linux and Windows):
[Environment]::MachineName
1 Comment
Not specifically for Powershell version 1.0 and more of an overview of different possible ways to get information via Powershell:
- Native CmdLet (usually the best, but sadly really slow to get the Computername):
(Get-ComputerInfo).CsDNSHostName
Returns the "Name of local computer according to the domain name server" (Info aboutGet-ComputerInfo, Info about its return value) - Classical CommandLine executable:
hostname.exe
Returns the "host name portion of the full computer name of the computer" (Info abouthostname.exe - Environment Variable:
$env:COMPUTERNAME - Registry:
(Get-ItemProperty HKLM:\SYSTEM\CurrentControlSet\Control\ComputerName\ActiveComputerName).ComputerName - Static .Net Property:
[Environment]::MachineName
Returns "the NetBIOS name of this local computer." (Info about theSystem.Environmentclass) - Static .Net Method:
[System.Net.Dns]::GetHostEntry("").HostName
Returns the DNS Hostname (fqdn) of the system (Info about theSystem.Net.Dns.GetHostEntryMethod) - Property of COM-Object (Computername via deprecated Scripting-Api):
(New-Object -ComObject WScript.Network).ComputerName
Returns "the name of the computer system." (Info about the WshNetwork Object, Info about the Windows Script Host Objects) - Property of WMI-Object:
(Get-CimInstance -ClassName Win32_ComputerSystem).Name
(Info about Win32_ComputerSystem) - P/Invoke a native API function:
Add-Type -TypeDefinition @'
public enum COMPUTER_NAME_FORMAT{
ComputerNameNetBIOS,
ComputerNameDnsHostname,
ComputerNameDnsDomain,
ComputerNameDnsFullyQualified,
ComputerNamePhysicalNetBIOS,
ComputerNamePhysicalDnsHostname,
ComputerNamePhysicalDnsDomain,
ComputerNamePhysicalDnsFullyQualified,
ComputerNameMax,
}
public static class Kernel32{
[System.Runtime.InteropServices.DllImport("Kernel32.dll", SetLastError = true, CharSet = System.Runtime.InteropServices.CharSet.Auto)]
public static extern bool GetComputerNameEx(COMPUTER_NAME_FORMAT NameType, System.Text.StringBuilder lpBuffer, ref uint lpnSize);
}
'@
$len = 0
[Kernel32]::GetComputerNameEx([COMPUTER_NAME_FORMAT]::ComputerNameDnsFullyQualified, $null, [ref]$len); #get required size
$sb = [System.Text.StringBuilder]::new([int]$len) #create StringBuilder with required capacity (ensure int constructor is used, otherwise powershell chooses string constructor for uint value...)
$len = $sb.Capacity #get actual capacity of StringBuilder (important, as maybe StringBuilder was constructed differently than expected)
[Kernel32]::GetComputerNameEx([COMPUTER_NAME_FORMAT]::ComputerNameDnsFullyQualified, $sb, [ref]$len);
$sb.ToString()
Returns "The fully qualified DNS name that uniquely identifies the local computer. This name is a combination of the DNS host name and the DNS domain name, using the form HostName.DomainName. If the local computer is a node in a cluster, lpBuffer receives the fully qualified DNS name of the cluster virtual server."
(Info about the GetComputerNameEx API function, Info about the COMPUTER_NAME_FORMAT enumeration, used c# signature of COMPUTER_NAME_FORMAT (unofficial), used c# signature of GetComputerNameEx (unofficial), short blogpost about P/Invoke in powershell)
Note: Use P/Invoke with caution. Sufficiently incorrect usage can actually make powershell crash. The Add-Type call is somewhat slow (but only needs to be called once in the script).
Comments
hostname also works just fine in Powershell
1 Comment
The most descriptive way for me is:
[System.Net.DNS]::GetHostByName($env:COMPUTERNAME).HostName
1 Comment
'' instead of the environment variable.You can store the value as follows
$name = $(hostname)
I want to add that simply executing $name = hostname will also save the localhost name of the PC into a variable.
3 Comments
hostname exists.I loved the code posted by T S above, and the links and explanations he posted, very thankful.
I got his code and wrapped into a function and cut all the other output, just to output the computer name. in my case this is very handy as it tells me which domain my computer lives in.
function Get-FullyQualifiedComputerName {
Add-Type -TypeDefinition @'
public enum COMPUTER_NAME_FORMAT{
ComputerNameNetBIOS,
ComputerNameDnsHostname,
ComputerNameDnsDomain,
ComputerNameDnsFullyQualified,
ComputerNamePhysicalNetBIOS,
ComputerNamePhysicalDnsHostname,
ComputerNamePhysicalDnsDomain,
ComputerNamePhysicalDnsFullyQualified,
ComputerNameMax,
}
public static class Kernel32{
[System.Runtime.InteropServices.DllImport("Kernel32.dll", SetLastError = true, CharSet = System.Runtime.InteropServices.CharSet.Auto)]
public static extern bool GetComputerNameEx(COMPUTER_NAME_FORMAT NameType, System.Text.StringBuilder lpBuffer, ref uint lpnSize);
}
'@ | Out-Null
$len = 0
[Kernel32]::GetComputerNameEx([COMPUTER_NAME_FORMAT]::ComputerNameDnsFullyQualified, $null, [ref]$len) | Out-Null
$sb = [System.Text.StringBuilder]::new([int]$len)
$len = $sb.Capacity
[Kernel32]::GetComputerNameEx([COMPUTER_NAME_FORMAT]::ComputerNameDnsFullyQualified, $sb, [ref]$len) | Out-Null
return $sb.ToString().Trim()
}
# Example of how to use it:
$fullyQualifiedComputerName = Get-FullyQualifiedComputerName
Write-Output $fullyQualifiedComputerName

