PowerShell + FTP in EXE
spinnifex (Level 1) - Jetzt verbinden
06.03.2016, aktualisiert 19:09 Uhr, 3404 Aufrufe, 11 Kommentare, 1 Danke
Hallo Admins!
folgende Batch-Datei verrichtet bislang absolut brav ihren Dienst, indem sie eine bestimmte Datei von einem ftp-Server holt, ich sie in NP++ bearbeiten kann und sie anschließend wieder hochgeladen wird. Vor dem Upload wird das Datum der letzten Änderung der index.htm noch aktualisiert, die ein iframe mit der per d3src eingebundenen csv-Datei umrahmt. Die pause dienen dazu eventuelle ftp-Probleme manuell abzufangen.
Die in der Batch aufgerufene *.ftp-Datei für den Downoad hat folgenden Inhalt, der Upload läuft entsprechend.
JETZT SOLL DARAUS EINE EXE-DATEI WERDEN.
Das Update-Tool soll auch Kollegen zur Verfügung gestellt werden, die nicht unbedingt die ftp-Credentials wissen sollen. Meine Idee war, das ganze mit dem Batch to Exe Converter 2.4.2 von www.f2ko.de in eine EXE zu konvertieren. Leider ist der Versuch (auch mit anderen bat2exe-Tools) fehlgeschlagen, weil entweder ftp oder die ps-Befehle nicht verarbeitet werden. Ergebnis: Die EXE taucht zwar gleich drei Mal im Taskmanager auf, lässt sich aber nur per Neustart (vielleicht auch per Taskill) abschießen.
Wie müsste das ganze in PowerShell aussehen, das ich dann mit einem ps1 to exe-Converter umwandeln kann?
Lieben Dank allerseits!
spinnifex
folgende Batch-Datei verrichtet bislang absolut brav ihren Dienst, indem sie eine bestimmte Datei von einem ftp-Server holt, ich sie in NP++ bearbeiten kann und sie anschließend wieder hochgeladen wird. Vor dem Upload wird das Datum der letzten Änderung der index.htm noch aktualisiert, die ein iframe mit der per d3src eingebundenen csv-Datei umrahmt. Die pause dienen dazu eventuelle ftp-Probleme manuell abzufangen.
ftp -s:updt_gms_dl.ftp
pause
"C:\Program Files (x86)\Notepad++\notepad++.exe" "data.csv"
powershell -Executionpolicy ByPass -Command "(Get-Item 'index.htm').LastWriteTime = (Get-Date)"
ftp -s:updt_gms_ul.ftp
pause
del data.csv
del index.htm
open ftp.beispiel.de
XXXXXXX-ftp
PWxxxXXX999!
cd webseiten
cd project0816
get index.htm
cd data
get data.csv
bye
JETZT SOLL DARAUS EINE EXE-DATEI WERDEN.
Das Update-Tool soll auch Kollegen zur Verfügung gestellt werden, die nicht unbedingt die ftp-Credentials wissen sollen. Meine Idee war, das ganze mit dem Batch to Exe Converter 2.4.2 von www.f2ko.de in eine EXE zu konvertieren. Leider ist der Versuch (auch mit anderen bat2exe-Tools) fehlgeschlagen, weil entweder ftp oder die ps-Befehle nicht verarbeitet werden. Ergebnis: Die EXE taucht zwar gleich drei Mal im Taskmanager auf, lässt sich aber nur per Neustart (vielleicht auch per Taskill) abschießen.
Wie müsste das ganze in PowerShell aussehen, das ich dann mit einem ps1 to exe-Converter umwandeln kann?
Lieben Dank allerseits!
spinnifex
11 Antworten
- LÖSUNG altmetaller schreibt am 06.03.2016 um 13:32:31 Uhr
- LÖSUNG rubberman schreibt am 06.03.2016 um 13:34:15 Uhr
- LÖSUNG spinnifex schreibt am 06.03.2016 um 13:46:04 Uhr
- LÖSUNG rubberman schreibt am 06.03.2016 um 13:51:08 Uhr
- LÖSUNG spinnifex schreibt am 06.03.2016 um 13:57:11 Uhr
- LÖSUNG altmetaller schreibt am 06.03.2016 um 14:12:37 Uhr
- LÖSUNG 126919 schreibt am 06.03.2016 um 15:06:52 Uhr
- LÖSUNG spinnifex schreibt am 06.03.2016 um 15:24:27 Uhr
- LÖSUNG 126919 schreibt am 06.03.2016 um 15:28:27 Uhr
- LÖSUNG colinardo schreibt am 06.03.2016 um 15:44:16 Uhr
- LÖSUNG spinnifex schreibt am 06.03.2016 um 19:10:02 Uhr
- LÖSUNG spinnifex schreibt am 06.03.2016 um 15:24:27 Uhr
- LÖSUNG 126919 schreibt am 06.03.2016 um 15:06:52 Uhr
- LÖSUNG altmetaller schreibt am 06.03.2016 um 14:12:37 Uhr
- LÖSUNG spinnifex schreibt am 06.03.2016 um 13:57:11 Uhr
- LÖSUNG rubberman schreibt am 06.03.2016 um 13:51:08 Uhr
- LÖSUNG spinnifex schreibt am 06.03.2016 um 13:46:04 Uhr
LÖSUNG 06.03.2016 um 13:32 Uhr
Die Datei mit den Credentials hast Du ja auch dann, wenn Du die Batch konvertierst.
Vielleicht könnte man da ja mit Java glücklich werden: http://www.torsten-horn.de/techdocs/java-ftp.htm
Auf jeden Fall würde ich das Kennwort zumindest rudimentär "verschlüsseln". Ich mache das i.d.R. so, dass ich es wenigstens einmal mit meinem Geburtsdatum o.Ä. XOR-verknüpfe um wenigstens die "Zufallsfunde" abzudecken.
Vielleicht könnte man da ja mit Java glücklich werden: http://www.torsten-horn.de/techdocs/java-ftp.htm
Auf jeden Fall würde ich das Kennwort zumindest rudimentär "verschlüsseln". Ich mache das i.d.R. so, dass ich es wenigstens einmal mit meinem Geburtsdatum o.Ä. XOR-verknüpfe um wenigstens die "Zufallsfunde" abzudecken.
LÖSUNG 06.03.2016, aktualisiert um 13:47 Uhr
Hallo spinnefix.
Sorry, wenn das Off-Topic klingt, aber
Grüße
rubberman
EDIT Meine eigenen Erfahrungen:
"To Exe Converter" ...
Sorry, wenn das Off-Topic klingt, aber
JETZT SOLL DARAUS EINE EXE-DATEI WERDEN.
... bitte gar nicht erst drüber nachdenken. Der ganze Kram wird in Plaintext irgendwo in das temp Verzeichnis entpackt und ausgeführt. NULL Schutz! Vergiss diesen ...2exe Mist ganz schnell und auch sonst gehören Anmeldedaten nie hart in einen Programmcode.Grüße
rubberman
EDIT Meine eigenen Erfahrungen:
"To Exe Converter" ...
LÖSUNG 06.03.2016, aktualisiert um 13:47 Uhr
@ rubberman Danke für die klaren Worte ...! Gegen richtig neugierige User lässt sich das Passwort so offensichtlich nicht schützen. Ich weiß leider keine andere Lösung und
@ FA-jka die JAVA-Idee fällt leider mangels Laufzeit-Umgebung (und meiner Unfähigkeit in Java zu schreiben) aus.
Das Auslesen eines Temp-Verzeichnisses würde ich riskieren, zumal die meisten meiner Kollegen noch nicht einmal wissen, was das ist. Und endlich kann ich den Trasnfer wohl nur mit sTP gegen z.B. Wireshark schützen.
Ansonsten bin ich natürlich dankbar für jeden Alternativvorschlag...
spinnifex
@ FA-jka die JAVA-Idee fällt leider mangels Laufzeit-Umgebung (und meiner Unfähigkeit in Java zu schreiben) aus.
Das Auslesen eines Temp-Verzeichnisses würde ich riskieren, zumal die meisten meiner Kollegen noch nicht einmal wissen, was das ist. Und endlich kann ich den Trasnfer wohl nur mit sTP gegen z.B. Wireshark schützen.
Ansonsten bin ich natürlich dankbar für jeden Alternativvorschlag...
spinnifex
LÖSUNG 06.03.2016 um 13:51 Uhr
Hallo spinnefix,
hab zeitgleich mit deiner Antwort oben noch ein EDIT angehängt. Da gibt es noch einiges mehr, was dagegen spricht ...
Grüße
rubberman
hab zeitgleich mit deiner Antwort oben noch ein EDIT angehängt. Da gibt es noch einiges mehr, was dagegen spricht ...
Grüße
rubberman
LÖSUNG 06.03.2016 um 13:57 Uhr
Hallo rubberman,
Okay okay, ich hab's kapiert ...
Zum Glück habe ich nicht soviele Kollegen, die dann morgens an meinem Schreibtisch warten.
Gibt es trotzdem ein Idee, wie man das sicher und elegant löst? Eine Übersetzung bat nach ps1 wäre mir schon ein Hilfe.
spinnifex
Okay okay, ich hab's kapiert ...
Gibt es trotzdem ein Idee, wie man das sicher und elegant löst? Eine Übersetzung bat nach ps1 wäre mir schon ein Hilfe.
spinnifex
LÖSUNG 06.03.2016 um 14:12 Uhr
Eigentlich mit jeder beliebigen Programmiersprache deiner Wahl. Java war ja nur ein Beispiel.
Und - wie gesagt - eine Übersetzung .bat nach .ps1 wäre Dir keine Hilfe, da die Zugangsdaten in einer separaten Datei stehen. Diese Datei ist kein Bestandteil deiner "Programmierung", sondern lediglich eine Steuerdatei für den FTP-Client von Windows.
Die Kollegen werden also weiterhin "an deinem Schreibtisch warten müssen". Hoffentlich hast Du nie Urlaub
Und - wie gesagt - eine Übersetzung .bat nach .ps1 wäre Dir keine Hilfe, da die Zugangsdaten in einer separaten Datei stehen. Diese Datei ist kein Bestandteil deiner "Programmierung", sondern lediglich eine Steuerdatei für den FTP-Client von Windows.
Die Kollegen werden also weiterhin "an deinem Schreibtisch warten müssen". Hoffentlich hast Du nie Urlaub
LÖSUNG 06.03.2016, aktualisiert um 15:07 Uhr
Zumal bei FTP die Daten sowieso ungeschützt in den Äther hinausposaunt werden :-P
Gruß fk
Gruß fk
LÖSUNG 06.03.2016, aktualisiert um 15:35 Uhr
Zitat von @126919:
Zumal bei FTP die Daten sowieso ungeschützt in den Äther ...
Zumal bei FTP die Daten sowieso ungeschützt in den Äther ...
... weswegen ich ja mit einer Lösung, die wenigstens gegen Dummies geschützt ist, einverstanden wäre. Als Dummie würde ich schon reichen, denn es ist mir eben nicht gelungen, die von rubberman erwähnten temp-Dateien in einer Text-bat/exe zu finden. Weder nach Beenden des Scripts, noch zur Laufzeit.
Mein Weg bleibt demnach (auch des notwendigen Aufwands wegen) ps1 to exe ... Sorry! Hilft mir dennoch jemand bei der Übersetzung?
spinnifex
LÖSUNG 06.03.2016, aktualisiert um 15:29 Uhr
Dann bau dir halt direkt mit AutoIt,VB.Net, c# eine Exe... Oder benutze für jeden User explizite FTP-Credentials welche nur Lese-/Schreibrechte auf die jeweilige Datei auf dem FTP haben.
LÖSUNG 06.03.2016, aktualisiert 27.03.2016
Hallo spinnifex,
FTP-Down- und Upload nativ mit Powershell, kein Problem.
Du nutzt wirklich noch Plain-FTP ohne SSL ?? Dir sollte man mal kräftig mit CAT-9 den Hintern versohlen
Grüße Uwe
p.s. Powershell kann auch Verschlüsseln. Hier zwei Methoden zum Ver- und Entschlüsseln mit zusätzlichem Salt und Key.
FTP-Down- und Upload nativ mit Powershell, kein Problem.
Du nutzt wirklich noch Plain-FTP ohne SSL ?? Dir sollte man mal kräftig mit CAT-9 den Hintern versohlen
function Upload-File([string]$path,[string]$url,$username,$password){
try{
$request = [System.Net.FtpWebRequest]::Create($url)
$request.Method = [System.Net.WebRequestMethods+FTP]::UploadFile
$request.Credentials = New-Object System.Net.NetworkCredential($username,$password)
[byte[]] $bytes = [System.IO.File]::ReadAllBytes($path)
[System.IO.Stream]$stream = $request.GetRequestStream();
$stream.Write($bytes,0,$bytes.Length)
$stream.Close(); $stream.Dispose()
$response = [System.Net.FtpWebResponse]$request.GetResponse()
$result = $response.StatusDescription
$response.Close()
return $result
}catch{
throw $_.Exception.Message
return $false
}
}
function Download-File([string]$url,[string]$path,$username,$password){
try{
$request = [System.Net.FtpWebRequest]::Create($url)
$request.Method = [System.Net.WebRequestMethods+FTP]::DownloadFile
$request.Credentials = New-Object System.Net.NetworkCredential($username,$password)
$response = [System.Net.FtpWebResponse]$request.GetResponse()
[System.IO.Stream]$stream = $response.GetResponseStream()
[System.IO.FileStream]$outstream = New-Object System.IO.FileStream ($path,[System.IO.FileMode]::Create)
$stream.CopyTo($outstream)
$outstream.Close();$stream.Close();$response.Close()
$stream.Dispose();$outstream.Dispose();$response.Dispose()
return $true
}catch{
throw $_.Exception.Message
}
}
# Variablen ------------------------
$username = 'FTPUSER'
$password = 'PASSWORD'
$remotefile = 'ftp://ftp.beispiel.de/data.csv'
$localfile = "$env:TEMP\data.csv"
# ----------------------------------------
# Download file from FTP
Download-File -url $remotefile -path $localfile -username $username -password $password
# Start Editing file
Start-Process $localfile -Wait
# Upload file to FTP
Upload-File -path $localfile -url $remotefile -username $username -password $password
# remove local downloaded file
remove-item $localfile -Force
p.s. Powershell kann auch Verschlüsseln. Hier zwei Methoden zum Ver- und Entschlüsseln mit zusätzlichem Salt und Key.
function Encrypt-String($plaintext,$password,$salt='jj3h4h5+tbbj2j281273#+', $init='j3j35&#*23kkk35!'){
$p = new-Object System.Security.Cryptography.AesManaged
$p.Key = (new-Object Security.Cryptography.PasswordDeriveBytes ([Text.Encoding]::UTF8.GetBytes($password)), ([Text.Encoding]::UTF8.GetBytes($salt)), "SHA1", 5).GetBytes(32) #256/8
$p.IV = (new-Object Security.Cryptography.SHA1Managed).ComputeHash( [Text.Encoding]::UTF8.GetBytes($init) )[0..15]
$encryptor = $p.CreateEncryptor()
$msEncrypt = New-Object IO.MemoryStream
$csEncrypt = New-Object Security.Cryptography.CryptoStream $msEncrypt,$encryptor,"Write"
$swEncrypt = New-Object IO.StreamWriter $csEncrypt
$swEncrypt.Write($plaintext)
$swEncrypt.Close();$csEncrypt.Close();$msEncrypt.Close()
$p.Clear()
[byte[]]$result = $msEncrypt.toArray()
return [Convert]::ToBase64String($result)
}
function Decrypt-String($string,$password,$salt='jj3h4h5+tbbj2j281273#+', $init='j3j35&#*23kkk35!'){
$p = new-Object System.Security.Cryptography.AesManaged
$p.Key = (new-Object Security.Cryptography.PasswordDeriveBytes ([Text.Encoding]::UTF8.GetBytes($password)), ([Text.Encoding]::UTF8.GetBytes($salt)), "SHA1", 5).GetBytes(32) #256/8
$p.IV = (new-Object Security.Cryptography.SHA1Managed).ComputeHash( [Text.Encoding]::UTF8.GetBytes($init) )[0..15]
$decryptor = $p.CreateDecryptor()
$msDecrypt = New-Object IO.MemoryStream @(,([Convert]::FromBase64String($string)))
$csDecrypt = New-Object Security.Cryptography.CryptoStream $msDecrypt,$decryptor,"Read"
$srDecrypt = New-Object IO.StreamReader $csDecrypt
[string]$result = $srDecrypt.ReadtoEnd()
$srDecrypt.Close();$csDecrypt.Close();$msDecrypt.Close()
$p.Clear()
return $result
}
LÖSUNG 06.03.2016 um 19:10 Uhr
Hallo colinardo,
ich nehme auch gerne noch eine Rute aus CAT-5, Flachbandkabel und Twisted-Pair LoL
Vielen Dank für diesen DEUTLICHEN Hinweis
Den ps Code muss ich mir in Ruhe (weil ja eben Anänger) anschauen und werde mich morgen entsprechend demütig dazu äußern ...
VIELEN DANK!
spinnifex
ich nehme auch gerne noch eine Rute aus CAT-5, Flachbandkabel und Twisted-Pair LoL
Vielen Dank für diesen DEUTLICHEN Hinweis
Den ps Code muss ich mir in Ruhe (weil ja eben Anänger) anschauen und werde mich morgen entsprechend demütig dazu äußern ...
VIELEN DANK!
spinnifex