WinRM shell (a.k.a. PowerShell Remoting) with file upload capability
WinRM κέλυφος (PowerShell Remoting) με δυνατότητα ανεβάσματος αρχείων
According to Microsoft, PowerShell Remoting is the recommended way to manage Windows systems. PowerShell Remoting uses Windows Remote Management (WinRM), which is the Microsoft implementation of the Web Services for Management (WS-Management) protocol, to allow users to run PowerShell commands on remote computers. But can we make use of it (i.e. connect) from a Linux machine?
Σύμφωνα με την Microsoft, το PowerShell Remoting είναι ο ενδεδειγμένος τρόπος για την απομακρυσμένη διαχείριση Windows συστημάτων. Το PowerShell Remoting χρησιμοποιεί το Windows Remote Management (WinRM), το οπόιο αποτελεί την υλοποίηση της Microsoft για το πρωτόκολλο Web Services for Management (WS-Management), που επιτρέπει στους χρήστες να εκτελούν εντολές PowerShell σε απομακρυσμένους υπολογιστές. Αλλά μπορούμε να κάνουμε χρήση του (δηλαδή να συνδεθούμε) από ένα Linux μηχάνημα;
For the time being, PowerShell on Linux is not mature and cannot communicate correctly with a Windows Machine using WinRM. Same goes for the Python modules I tested. The only thing that seems to work correctly on Linux is some Ruby modules (winrm and winrm-fs). So, I wrote the following Ruby script which also features a file upload capability.
Για την ώρα, το PowerShell στο Λίνουξ δεν είναι ώριμο και δεν είναι σε θέση να επικοινωνήσει σωστά με ένα Windows μηχάνημα μέσω του WinRM. Το ίδιο ισχύει και για κάποιες βιβλιοθήκες της Python που δοκίμασα. Το μόνο πράγμα που φαίνεται να δουλεύει σωστά στο Λίνουξ είναι κάποιες βιβλιοθήκες της Ruby (winrm και winrm-fs). Έτσι, έγραψα το παρακάτω πρόγραμμα Ruby που διαθέτει επίσης και δυνατότητα ανεβάσματος αρχείων.
require 'winrm-fs'
# Author: Alamot
# To upload a file type: UPLOAD local_path remote_path
# e.g.: PS> UPLOAD myfile.txt C:\temp\myfile.txt
conn = WinRM::Connection.new(
endpoint: 'https://IP:PORT/wsman',
transport: :ssl,
user: 'username',
password: 'password',
:no_ssl_peer_verification => true
)
class String
def tokenize
self.
split(/\s(?=(?:[^'"]|'[^']*'|"[^"]*")*$)/).
select {|s| not s.empty? }.
map {|s| s.gsub(/(^ +)|( +$)|(^["']+)|(["']+$)/,'')}
end
end
command=""
file_manager = WinRM::FS::FileManager.new(conn)
conn.shell(:powershell) do |shell|
until command == "exit\n" do
output = shell.run("-join($id,'PS ',$(whoami),'@',$env:computername,' ',$((gi $pwd).Name),'> ')")
print(output.output.chomp)
command = gets
if command.start_with?('UPLOAD') then
upload_command = command.tokenize
print("Uploading " + upload_command[1] + " to " + upload_command[2])
file_manager.upload(upload_command[1], upload_command[2]) do |bytes_copied, total_bytes, local_path, remote_path|
puts("#{bytes_copied} bytes of #{total_bytes} bytes copied")
end
command = "echo `nOK`n"
end
output = shell.run(command) do |stdout, stderr|
STDOUT.print(stdout)
STDERR.print(stderr)
end
end
puts("Exiting with code #{output.exitcode}")
end
You can download this tool from here: winrm_shell_with_upload.rb
Μπορείτε να κατεβάσετε αυτό το εργαλείο απο εδώ: winrm_shell_with_upload.rb