With Powershell you are able to connect to remote computers and execute statements. For example this allows you to start and stop IIS on a remote webserver, install/uninstall Windows Services when deploying new software and more.
Snippet: connect to a remote computer
# Server to connect to $TargetServerName = "server.lanedirt.local" # Username and password of account which has local admin and local logon rights to the server above $RemoteUsername = "administrator" $RemotePassword = "[password here]" # Convert password to a secure string $SecurePassword = ConvertTo-SecureString $RemoteUsername -AsPlainText -Force # Create credential object with username and secure password $SecureCredential = New-Object -TypeName System.Management.Automation.PSCredential -ArgumentList $RemoteUsername,$SecurePassword # Create remote connection with the just created credential object $RemoteConn = New-PSSession -ComputerName $TargetServerName -Credential $SecureCredential # ================ Execute code on remote server ================ Invoke-Command -Session $RemoteConn -ScriptBlock { # Enter code to execute on remote computer here # .... } -argumentlist $Argument0,$Argument1 # Tip: you can optionally pass on arguments via the argumentList. These arguments will then be available within the ScriptBlock via $args[0], $args[1] etc.
Remote execute examples
Below you will find a few examples of things to run on a remote computer via Powershell.
a) Copy files from local to remote server
Note: the code below does 2 things:
- Delete all files on remote server, except files matching a filter (in this case, appsettings.json files are NOT deleted) — this is done on the remote server, so it uses a RemoteConn ScriptBlock.
- Copy all files from local server to remote server (this is initiated from the local server, so this statement needs te be outside of the ScriptBlock.
$CopySource = "C:\Solution\MyService\bin\Release\net5.0\*" $CopyDest = "C:\Services\MyService" Invoke-Command -Session $RemoteConn -ScriptBlock { # Remove all files on remote server except appsettings.json files. Get-ChildItem -Path $args[0] -Recurse -exclude "appsettings.*.json", "appsettings.json" | Remove-Item -Recurse -force } -argumentlist $CopyDest Copy-Item $CopySource -Recurse -Force -Destination $CopyDest -ToSession $RemoteConn -Container
b) Install a Windows Service
The code below should be inserted between the parentheses in the RemoteConn ScriptBlock.
# Install Windows Service Write-Host " -- Starting installation of Windows Service 'MyWindowsService'" Invoke-Expression "cmd.exe /c 'sc.exe create MyWindowsService binpath=C:\Services\MyWindowsService\MyWindowsService.exe'" # Optional: configure Windows Service to run as a certain user. You will need to pass on the username/passwords via the ArgumentList option! Invoke-Expression ("cmd.exe /c 'sc.exe config MyWindowsService obj= """ + $args[0] + """ password= """ + $args[1] + """'") # Set service to auto-start Invoke-Expression "cmd.exe /c 'sc config MyWindowsService start= auto'" # Start service immediately Invoke-Expression "cmd.exe /c 'sc start MyWindowsService '" Write-Host " -- Finished installation of Windows Service 'MyWindowsService'"
c) Uninstall a Windows Service
The code below should be inserted between the parentheses in the RemoteConn ScriptBlock.
# Uninstall Windows Service Write-Host " -- Starting uninstall of Windows Service 'MyWindowsService'" Invoke-Expression "cmd.exe /c 'sc.exe stop MyWindowsService'" Invoke-Expression "cmd.exe /c 'sc.exe delete MyWindowsService'" Write-Host " -- Finished uninstallation of Windows Service 'MyWindowsService'"
d) Stop and start IIS
The code below should be inserted between the parentheses in the RemoteConn ScriptBlock.
# Stop IIS Invoke-Expression "iisreset /STOP" # Start IIS Invoke-Expression "iisreset /START"
e) Create EventViewer EventSources
The code below should be inserted between the parentheses in the RemoteConn ScriptBlock.
$eventSources = @("MyApp1","MyApp2") foreach ($source in $eventSources) { if ([System.Diagnostics.EventLog]::SourceExists($source) -eq $false) { [System.Diagnostics.EventLog]::CreateEventSource($source, "Application") } }