Usage:
enableWinRm ‘RemoteServer’ get-credential
$remoteComputer='REMOTESERVER'
$winRmPort=5985
$adminCredential=get-credential
function enableWinRm($remoteComputer,$winRmPort=5985,$adminCredential){
function Check-NetConnection($computername,$port,$timeout=200,$verbose=$false) {
$tcp = New-Object System.Net.Sockets.TcpClient;
try {
$connect=$tcp.BeginConnect($computername,$port,$null,$null)
$wait = $connect.AsyncWaitHandle.WaitOne($timeout,$false)
if(!$wait){
$null=$tcp.EndConnect($connect)
$tcp.Close()
if($verbose){
Write-Host "Connection Timeout" -ForegroundColor Red
}
Return $false
}else{
$error.Clear()
$null=$tcp.EndConnect($connect) # Dispose of the connection to release memory
if(!$?){
if($verbose){
write-host $error[0].Exception.Message -ForegroundColor Red
}
$tcp.Close()
return $false
}
$tcp.Close()
Return $true
}
} catch {
return $false
}
}
if (!(get-command psexec)){
# Install Chocolatey
if (!(Get-Command choco.exe -ErrorAction SilentlyContinue)) {
[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12;
Set-ExecutionPolicy Bypass -Scope Process -Force; iex ((New-Object System.Net.WebClient).DownloadString('https://chocolatey.org/install.ps1'))
}
choco install sysinternals -y;
}
$success=check-netconnection $remoteComputer $winRmPort
write-host 'Attempting to use psexec to enable WinRM remotely...'
if(!$adminCredential -and !$success){ # Enable WinRM Remotely
$null=psexec.exe \\$remoteComputer -s C:\Windows\system32\winrm.cmd qc -quiet;
}elseif(!$success){
$username=$adminCredential.Username
$password=$adminCredential.GetNetworkCredential().Password
$null=psexec.exe \\$remoteComputer -u $username -p $password -s C:\Windows\system32\winrm.cmd qc -quiet
}else{
write-host "WinRm is already available on $remoteComputer" -ForegroundColor Green
}
return check-netconnection $remoteComputer $winRmPort
}
enableWinRm $remoteComputer $winRmPort $adminCredential
# Deprecated version
function enableWinRm($remoteComputer,$winRmPort){
function Check-NetConnection($computername, $port) {
$session = New-Object System.Net.Sockets.TcpClient;
try {
$session.Connect($computername, $port=5985);
$true;
} catch {
$false;
} finally {
$session.Close();
}
}
if (!(get-command psexec)){
# Install Chocolatey
if (!(Get-Command choco.exe -ErrorAction SilentlyContinue)) {
[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12;
Set-ExecutionPolicy Bypass -Scope Process -Force; iex ((New-Object System.Net.WebClient).DownloadString('https://chocolatey.org/install.ps1'))
}
choco install sysinternals -y;
}
$success=check-netconnection $remoteComputer $winRmPort
psexec.exe \\$remoteComputer -s C:\Windows\system32\winrm.cmd qc -quiet; # Enable WinRM Remotely
return check-netconnection $remoteComputer $winRmPort
}
Previous versions:
# Enable-WinRM-Remotely.ps1 # Set variables $remoteHost="192.168.500.1" $adminUsername="Administrator"; # Autogen variables $trustedHosts=$([void]($remoteHost -match "(.*)\.");$matches[1])+".*" # Assuming class C - I'll work on auto detection of netmask later $adminCredential=get-credential -UserName $adminUsername -Message "Enter password for account $adminUsername"; function computerIsDomainJoined{ if ((gwmi win32_computersystem).partofdomain -eq $true) { write-host -fore green "$ENV:computername is domain joined!" return $true; } else { write-host -fore red "$ENV:computername is on a workgroup!" return $false; } } function installPrerequisitesOnLocalhost{ if(!(get-command psexec -ErrorAction SilentlyContinue)){ if (!(Get-Command choco.exe -ErrorAction SilentlyContinue)) { Set-ExecutionPolicy Bypass -Scope Process -Force; iex ((New-Object System.Net.WebClient).DownloadString('https://chocolatey.org/install.ps1')) } choco install sysinternals -y } } function addWinRmTrustedHosts{ param($trustedHosts) Write-Host "Adding $trustedHosts as trusted on $env:computername..." winrm quickconfig -force|out-null; $addTrustedHostsLocal="winrm set winrm/config/client '@{TrustedHosts=`"$trustedHosts`"}'"; invoke-expression $addTrustedHostsLocal; } function enableWinRmRemotely{ Param( [string]$computername, [PScredential]$adminCredential, [string]$trustedHosts ) # Extract password from credential $adminUsername=$adminCredential.Username; $adminPassword=$adminCredential.GetNetworkCredential().Password; # Test to see if WinRM is indeed installed Write-Host "Checking $computername..." $winRmPortOpen=test-netconnection $computername -port 5985 -InformationLevel Quiet if($winRmPortOpen){ $session=New-PSSession $computername -Credential $adminCredential -ea SilentlyContinue; }else{ write-host "Port 5985 is not open on $computername"; return $false; } if (!($session)){ # Adding psexec on localhost to perform the next tasks installPrerequisitesOnLocalhost; # Ensuring the psexec ports are open $port135Open=test-netconnection $computername -port 135 -InformationLevel Quiet $port445Open=test-netconnection $computername -port 445 -InformationLevel Quiet if ($port135Open -and $port445Open){ # Base command: psexec.exe \\$computername -u $adminUsername -p $adminPassword -s C:\Windows\system32\winrm.cmd qc -quiet; $process=Start-Process -FilePath "psexec.exe" -ArgumentList "\\$computername -u $adminUsername -p $adminPassword -s C:\Windows\system32\winrm.cmd qc -quiet;" -PassThru; if ($process.ExitCode -ne 0){ write-host "PSExec has failed."; return $false; }else{ write-host "PSExec has succeeded."; if (computerIsDomainJoined){ write-host "This computer is joined to a domain. Kerberos Authentication will be the default."; }else{ write-host "This computer is not joined to a domain. Trusted Host must be set in lieu of Kerberos Authentication."; # Ensure that localhost trusts remote hosts $localTrustedHosts=(Get-item wsman:\localhost\Client\TrustedHosts).Value if ($localTrustedHosts -notcontains $trustedHosts){ addWinRmTrustedHosts -trustedHosts $trustedHosts; } # Settting trusted host on remote computer to enable WinRM authentication # psexec.exe \\$computername -u $adminUsername -p $adminPassword -s winrm set winrm/config/client '@{TrustedHosts="192.168.2.*"}' $addTrustedHostsRemote="psexec.exe \\$computername -u $adminUsername -p $adminPassword -h -d powershell.exe 'set-item WSMan:\localhost\Client\TrustedHosts -Value $trustedHosts -force'" Invoke-Expression $addTrustedHostsRemote; } return $true; } }else{ write-host "Please check port 135 & 445 ingress on $computername"; return $false; } }else{ Write-Host "WinRM has been already enabled. No changes to WinRM have been made."; remove-pssession $session; return $true; } } enableWinRmRemotely -computername $remoteHost -adminCredential $adminCredential -trustedHosts $trustedHosts
Old version:
# Set variables $server="SHERVER007" # Enable WinRM Remotely psexec.exe \\$remoteHost -s C:\Windows\system32\winrm.cmd qc -quiet # Invoke-WmiMethod -ComputerName $server -Class Win32_Process -Name Create -ArgumentList "C:\Windows\system32\winrm.cmd -q" # Test to see if WinRM is indeed installed test-netconnection $remoteHost -port 5985 # Enter PowerShell session on remote host enter-pssession $remotehost function enableRemoteWinRM{ Param([string]$computername) Write-Host "checking $computername..." function pingTest{ Param([string]$node) try{ Return Test-Connection $node -Count 1 -Quiet -ea Stop; } catch{Return $False} } if (pingTest $computername){ if (!(Test-WSMan $computername -ea SilentlyContinue)){ if(!(get-command psexec)){ if (!(Get-Command choco.exe -ErrorAction SilentlyContinue)) { Set-ExecutionPolicy Bypass -Scope Process -Force; iex ((New-Object System.Net.WebClient).DownloadString('https://chocolatey.org/install.ps1')) } choco install sysinternals -y } psexec.exe \\$computername -s C:\Windows\system32\winrm.cmd qc -quiet }else{Write-Host "WinRM has been already enabled. No changes to WinRM have been made."} } Else{Write-Host "Unable to determine if WinRM is enabled on $computername`.`n Ping test has failed. Check if this computer is online and whether there's a firewall blocking of ICMP";} }
Categories: