
Data Structure
Networking
RDBMS
Operating System
Java
MS Excel
iOS
HTML
CSS
Android
Python
C Programming
C++
C#
MongoDB
MySQL
Javascript
PHP
- Selected Reading
- UPSC IAS Exams Notes
- Developer's Best Practices
- Questions and Answers
- Effective Resume Writing
- HR Interview Questions
- Computer Glossary
- Who is Who
How PowerShell Remoting Works
There are several ways to connect to remote computer cmdlets. These computers can be in the same domain, different domains, or for the workgroups using PowerShell. Here, we will mainly focus on the inbuilt parameter, Invoke-Command, and to execute PSSession command remotely.
Inbuilt -ComputerName parameter.
Many cmdlets in PowerShell supports the -ComputerName parameter, which describes the remote computer names. For example, Get-Service, Get-Process, and Get-WMIObject, etc.. cmdlets.
Example
If the remote server is in the same domain then you just need to simply add -ComputerName credentials.
Get-Service Spooler -ComputerName Test1-Win2k12
Output
PS C:\Users\Administrator> Get-Service Spooler -ComputerName Test1-Win2k12 Status Name DisplayName ------ ---- ----------- Running Spooler Print Spooler
Or to get the Computer BIOS information using WMI,
Get-WmiObject win32_bios -ComputerName Test1-win2k12
Output
PS C:\Users\Administrator> Get-WmiObject win32_bios -ComputerName Test1-win2k12 SMBIOSBIOSVersion : 6.00 Manufacturer : Phoenix Technologies LTD Name : PhoenixBIOS 4.0 Release 6.0 SerialNumber : VMware-56 4d 0d 7f 8a 7e f6 fa-f2 55 1d b6 a3 52 80 9f Version : INTEL - 6040000
But if your remote server is in a different domain then you may get the following authentication error message.
PS C:\> Get-Service -ComputerName Test1-Win2k12 Get-Service : Cannot open Service Control Manager on computer 'Test1- Win2k12'. This operation might require other privileges. At line:1 char:1 + Get-Service -ComputerName Test1-Win2k12 + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : NotSpecified: (:) [Get- Service], InvalidOperationException + FullyQualifiedErrorId : System.InvalidOperationException,Microsoft.PowerShe ll.Commands.GetServiceCommand
To get rid out of the domain and standalone server authentication issue, many cmdlets support -Credential parameter which is the credentials for the destination server. For example, Copy-Item cmdlet, which has the -Credential parameter, in such case, you can directly pass the remote server credentials and the command works.
Copy-Item 'C:\Temp\Encoding Time.csv' -Destination \Test1-Win2k12\C$\Temp - Credential $creds
But many commands like Get-Service, Get-Process, etc. don’t support the -Credential parameter, in that case, you need to use the other two methods described below.
Using Invoke-Command method.
Invoke-Command is one of the most convenient methods to process commands on the remote computer. You need to provide a computer name and script block to run your commands remotely.
Example
Invoke-Command -ComputerName Test1-Win2k12 -ScriptBlock{Get-Service Spooler}
PS C:\Users\Administrator> Invoke-Command -ComputerName Test1-Win2k12 - ScriptBlock{Get-Service Spooler} Status Name DisplayName PSComputerName ------ ---- ----------- -------------- Running Spooler Print Spooler Test1-Win2k12
In the above example, we assume that Test1-Win2k12 is in the same domain so no more additional credentials required to connect to the remote server. If the server is in the different domain or workgroup, -Credential parameter supported by Invoke-Command should be used. For example,
$creds = Get-Credential Invoke-Command -ComputerName Test2-Win2k12 -ScriptBlock{Get-Service Spooler} - Credential $creds
Output
Status Name DisplayName PSComputerName ------ ---- ----------- -------------- Running Spooler Print Spooler Test2-Win2k12
Using the PSSession method.
With the PSSession method, you can either enter into PSSession and run the command or you can store the session into a session variable and when running command pass this session variable so that the command can run remotely.
Enter-PSSession cmdlet.
When you use the Enter-PSSession cmdlet you can directly connect to domain join computers or provide the credentials using -Credential parameter in the cmdlet for the different domain or Workgroup computers.
For the domain-joined computers.
Enter-PSSession Test1-Win2k12
Once you run the command followed by the computer name, you will notice the Computer name in front of the path, which indicates you are now into the remote shell and then you can run the command.
Output
PS C:\Users\Administrator> Enter-PSSession Test1-Win2k12 [Test1-Win2k12]: PS C:\Users\Administrator.LABDOMAIN\Documents> [Test1-Win2k12]: PS C:\Users\Administrator.LABDOMAIN\Documents> Get-Service Spooler Status Name DisplayName ------ ---- ----------- Running Spooler Print Spooler
If your computer is in the different workgroup then pass the Credentials in the cmdlet. For example,
Enter-PSSession Test2-Win2k12 -Credential (Get-Credential)
Output
[Test2-Win2k12]: PS C:\Users\Administrator\Documents> Hostname Test2-Win2k12
You can end the existing session using the Exit-PSSession command.
Using the Session Variable.
You can also use the session variable to connect to the server remotely. To do that, you need to use the New-PSSession cmdlet and followed by the remote computer name and have to store that session in the new variable and later this variable can be used by the supported cmdlet like Invoke-Command or Enter-PSSession.
For example,
$sess = New-PSSession Test1-Win2k12
When you check the value of $sess variable,
You can use this variable to retrieve the outputs from cmdlets on Test1-Win2k12 machine.
Invoke-Command -Session $sess -ScriptBlock{Get-Service Spooler} PS C:\Users\Administrator> Invoke-Command -Session $sess -ScriptBlock{Get- Service Spooler} Status Name DisplayName PSComputerName ------ ---- ----------- -------------- Running Spooler Print Spooler Test1-Win2k12