Scripting Games 2012 comments: #14 local computer name
Posted by: Richard Siddaway
There are a number of ways to pass the names of the local machine into a script or function:
- use the actual name
- use the IP address (if the processing in the script can work with IP addresses)
- use 127.0.0.1 – the loop back address (if the processing in the script can work with IP addresses)
- use a dot “.” to signify the local machine
- use “localhost”
- use the environmental variable holding the machine name
Normally we don’t use any of the first three because you either have to type out the name – chance of error or the functionality within the script won’t accept IP addresses. Also the PSsession cmdlets only use computer names by default
Traditionally we have used . or localhost especially when working with WMI
Get-WmiObject -Class Win32_OperatingSystem -ComputerName .
Get-WmiObject -Class Win32_OperatingSystem -ComputerName localhost
There are a number of cmdlets that will accept a computer name as a parameter
PS> Get-Help * -Parameter ComputerName | select name
Name
—-
Get-WinEvent
Get-Counter
Test-WSMan
Invoke-WSManAction
Connect-WSMan
Disconnect-WSMan
Get-WSManInstance
Set-WSManInstance
Remove-WSManInstance
New-WSManInstance
Invoke-Command
New-PSSession
Get-PSSession
Remove-PSSession
Receive-Job
Enter-PSSession
Get-EventLog
Clear-EventLog
Write-EventLog
Limit-EventLog
Show-EventLog
New-EventLog
Remove-EventLog
Get-WmiObject
Invoke-WmiMethod
Get-Process
Remove-WmiObject
Register-WmiEvent
Get-Service
Set-Service
Set-WmiInstance
Get-HotFix
Test-Connection
Restart-Computer
Stop-Computer
This works:
Get-Process -ComputerName .
but this throws an error
PS> Get-Process -ComputerName localhost
Get-Process : Couldn’t connect to remote machine.
At line:1 char:12
+ Get-Process <<<< -ComputerName localhost
+ CategoryInfo : NotSpecified: (:) [Get-Process], InvalidOperationException
+ FullyQualifiedErrorId : System.InvalidOperationException,Microsoft.PowerShell.Commands.GetProcessCommand
I’ve seen similar errors with Get-Eventlog
PS> Get-EventLog -List -ComputerName .
Max(K) Retain OverflowAction Entries Log
—— —— ————– ——- —
20,480 0 OverwriteAsNeeded 21,814 Application
512 7 OverwriteOlder 0 DemoMate
20,480 0 OverwriteAsNeeded 0 HardwareEvents
512 7 OverwriteOlder 0 Internet Explorer
20,480 0 OverwriteAsNeeded 0 Key Management Service
8,192 0 OverwriteAsNeeded 3 Media Center
512 7 OverwriteOlder 0 MyNewLog
128 0 OverwriteAsNeeded 357 OAlerts
20,480 0 OverwriteAsNeeded 1 Scripts
Security
20,480 0 OverwriteAsNeeded 56,225 System
15,360 0 OverwriteAsNeeded 10,646 Windows PowerShell
PS> Get-EventLog -List -ComputerName localhost
Get-EventLog : The network path was not found.
At line:1 char:13
+ Get-EventLog <<<< -List -ComputerName localhost
+ CategoryInfo : NotSpecified: (:) [Get-EventLog], IOException
+ FullyQualifiedErrorId : System.IO.IOException,Microsoft.PowerShell.Commands.GetEventLogCommand
My solution and recommendation is to use the environmental variable for the computer name.
PS> Get-ChildItem -Path env: | where {$_.name -like "*computer*"}
Name Value
—- —–
COMPUTERNAME RSLAPTOP01
The environment provider doesn’t allow the use of filters so we have to use where
How do we use this:
Get-WmiObject -Class Win32_OperatingSystem -ComputerName $env:COMPUTERNAME
Get-Process -ComputerName $env:COMPUTERNAME
Get-EventLog -List -ComputerName $env:COMPUTERNAME
It can also be used as the default value on a function parameter that asks for a computername – that way you get the local machine if you don’t specify a value to the parameter.
I have never seen this fail – doesn’t mean it can’t just that I’ve never seen it – and it has the advantage of being easier to read than using a dot




