none
Powershell Script Remote von Linux ausführen RRS feed

  • Allgemeine Diskussion

  • Hi,

    unter Linux gibt es ein Tool namens WinExe. Mit dem kann ich Scripte, z.B. Perl erfolgreich remote ausführen. Lieber wäre es mir aber Powershell zu benutzen.

    So rufe ich das Script unter Linux auf:

    [code]

    winexe -U "GH\user%pass" //hostname 'powershell.exe -File C:\Scripte\Powershell\remote_test.ps1'

    winexe -U "GH\user%pass" //hostname 'C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe -File C:\Scripte\Powershell\remote_test.ps1'

    winexe -U "GH\user%pass" //hostname 'C:\Windows\SysWOW64\WindowsPowerShell\v1.0\powershell.exe -File C:\Scripte\Powershell\remote_test.ps1'

    [/code]

    Script: remote_test.ps1

    [code]

    write-host "test"

    "test" > ".\test.txt"

    exit

    [/code]

     

    Egal wie, er startet immer die Powershell.exe*32, mit dem richtigem Benutzer. Leider im Hintergrund. Zuerst war die ExecutionPolicy nicht gesetzt und nach Linux wurde der enstehende Fehler auch übertragen (BlaBla keine Scripte). Jedoch wird der powershell.exe*32 Prozess danach nicht beendet und somit läuft auch der Linuxbefehl in ein Timeout.

    Dann habe die ExecutionPolicy gesetzt (unrestricted/bypass). Das im PS Script angegebene 'write-host "test"' wird nicht übertragen, die textdatei wird nicht erstellt und der PS Prozess bleibt bestehen. Erst wenn ich unter Linux Strg-C eingebe wird der PS Prozess beendet.

    Ich kann leider nicht sehen was passiert, da die PS Konsole im Hintergrund läuft. Kann sich jemand erklären warum das nicht funktioniert, bzw. benutzt jemand dieses WinExe Tool mit Powershell?

    Das geht:

    winexe -U "user%pass" //hostname 'powershell.exe /h'

    Ich kann auch:

    winexe -U "user%pass" //hostname 'cmd.exe'

    eigeben und habe dann die CMD-Konsole in meiner Putty-Linuxkonsole. Ich kann die Eingabeauforderung wie gewohnt benutzen.

    Bei:

    winexe -U "user%pass" //hostname 'powershell.exe'

    kommt nur das Copyrightbanner, doch die Eingabeauforderung startet nicht.

    Dienstag, 9. August 2011 10:57

Alle Antworten

  • Das Problem hat mit großer Wahrscheinlichkeit nichts mit Powershell zu tun, sondern entweder mit der Syntax des Linux-Befehls oder mit der Art wie dieser auf Windows-Maschinen remote Anwendungen ausführt. Von daher würde ich vorschlagen diese Frage in einem Linux-Forum oder noch besser im Entwicklerforum von winexe anzubringen, die dürften dir eher helfen können.

    Grüße, Denniver


    Blog: http://bytecookie.wordpress.com

    Hilf mit und markiere hilfreiche Beiträge als "Hilfreich" und Beiträge die deine Frage ganz oder teilweise beantwortet haben als "Antwort".
    Dienstag, 9. August 2011 11:22
    Moderator
  • Die Art wie es aufgerufen wird ist definitiv entscheident. Ich habe auch die PSTools. Wenn ich von einem Windowshost mit PSExec.exe das Script, bzw. Powershell aufrufe, bekomme ich das selbe Ergebniss. CMD.exe klappt. Naja, mal schaun.
    Dienstag, 9. August 2011 14:10
  • Möglicherweise ist es wirklich das gleiche Problem wie bei PSexec. Dann lies mal hier.

    Abgesehen davon würde ich von einem Windows-Host aus, Powershell Remoting benutzen. Gut erklärt hier.

    Grüße, Denniver


    Blog: http://bytecookie.wordpress.com

    Hilf mit und markiere hilfreiche Beiträge als "Hilfreich" und Beiträge die deine Frage ganz oder teilweise beantwortet haben als "Antwort".


    Dienstag, 9. August 2011 14:15
    Moderator
  • Ja hatte ich dann auch gedacht. Aber so ein Encrypted Command kann ich nicht mit Linux machen.

    Aber ich muss ganz nahe dran sein:

    winexe -U "user%pass" //hostname "cmd.exe /c echo . | powershell.exe -Command get-process"

    Mit PSExec gehts schonmal. Das Problem ist wohl, dass er "powershell.exe -Command get-process" als Pfad sieht und nicht Powershell mit Parameterübergabe "-Command..." aufruft.

    Leider habe ich Batch übersprungen und weiss nicht ob es eine Möglichkeit gibt, den Teil hinter der Pipe irgendwie einzuklammern. Wenn ich folgendes mache:

    winexe -U "user%pass" //hostname "cmd.exe /c echo . | 'powershell.exe -Command get-process'"

    winexe -U "user%pass" //hostname 'cmd.exe /c echo . | "powershell.exe -Command get-process"'

    kommt folgende Fehlermeldung:

    Der Befehl "'powershell.exe" ist entweder falsch geschrieben oder konnte nicht gefunden werden (Ganze Pfade gehen auch nicht).

     

    PS: Ich muss es von Linux aus machen da Nagios (Monitoring) dort läuft.

    Dienstag, 9. August 2011 15:04
  • Moin,

    ich klinke mich hier mal ein, da ich demnächst auch vor der Aufgabe stehe, von Linux aus die PowerShell auszuführungen und da ich bisher überhaupt keinen Schimmer hatte, wie ich das machen könnte, hilft mir der Ansatz hier schon mal.

    Warum benutzt Du dort das "echo . |"?

    Wenn ich auf einem Windows-System in Start -> Ausführen folgendes eingeben:

    cmd.exe /c powershell.exe -Command get-process

    dann wird eine CMD mit PowerShell gestartet, Prozesse aufgelistet und wieder geschlossen.

    Wie das von einem Linux aussieht, kann ich aber nicht nachprüfen.


    Grüße aus Berlin schickt Robert
    MVP Exchange Server
    Dienstag, 9. August 2011 17:09
  • Moin,

    also beim dem "echo . |" muss ich zugeben, dass ich keine Ahnung habe warum und ich suche auch schon die ganze Zeit nach einer Erklährung.

    Ich habe hier ein Beispiel für PSExec.exe gefunden, wo dieses "echo . |" vorkommt:

    http://www.leeholmes.com/blog/2007/10/02/using-powershell-and-psexec-to-invoke-expressions-on-remote-computers/

     

    Zurück zum Linux-Winexe Problem:

    Es scheint irgendwie doch ein grösseres Problem mit Rechten zu geben. Es wird zwar mit dem richtigen Benutzer gestartet, aber wohl nicht mit der richtigen Gruppe (Netzwerkgruppe). Ich meinte ja das "powershell.exe -Command get-process" als Pfad angesehen wird. Das stimmt wohl nicht. Ich habe eher das Gefühl, dass in welchen Dateien auch immer der Code für die CmdLets ist (.dll?), diese nicht geladen werden. Ich habe in meinem PS Script "write-host" benutzt und bekomme folgende Fehlermeldung:

    Write-Host : Der Zugriff auf den Pfad wurde verweigert.
    Bei Zeile:1 Zeichen:11
    + write-host <<<<  "test"
        + CategoryInfo          : NotSpecified: (:) [Write-Host], UnauthorizedAcce
       ssException
        + FullyQualifiedErrorId : System.UnauthorizedAccessException,Microsoft.Pow
       erShell.Commands.WriteHostCommand

    Wenn ich nur "powershell.exe -Command" ohne Parameter angebe, kommt folgendes:

    Der Befehl kann nicht verarbeitet werden, da ein Parameter fehlt. Auf "-Command" muss ein Befehl folgen.

    Bedeutet (evtl): Er ruft Powershell richtig auf, startet auch das Script kann aber mit Befehlen wie "write-host" nichts anfangen.

    Mittwoch, 10. August 2011 07:17
  • Das

    echo . | powershell.....
    

    ist ein Weg um über den Kommadointerpreter (cmd.exe) eine Ausgabe (echo) an Powershell zu übergeben (|).

    Grüße, Denniver

    Blog: http://bytecookie.wordpress.com

    Hilf mit und markiere hilfreiche Beiträge als "Hilfreich" und Beiträge die deine Frage ganz oder teilweise beantwortet haben als "Antwort".


    Mittwoch, 10. August 2011 13:30
    Moderator
  • Hast du mittlerweile eine Lösung gefunden? Wenn ja poste Sie doch bitte hier. Vielleicht haben noch andere  früher oder später diese Aufgabe....

    Blog: http://bytecookie.wordpress.com

    Hilf mit und markiere hilfreiche Beiträge als "Hilfreich" und Beiträge die deine Frage ganz oder teilweise beantwortet haben als "Antwort".
    Mittwoch, 17. August 2011 09:21
    Moderator
  • Ich habe auch das Thema, und eine Lösung, wenngleich auch nicht die direkte Antwort auf die Frage. Man kann interaktiv quasi eine powershell-session füttern mit:

     winexe -U DOMAIN\\username //hostname 'powershell -ExecutionPolicy RemoteSigned -NoExit -Command -'

    Dann einfach PS-Kommandos eingeben.

    Wenn fertig, einfach exit eingeben.

    Das lässt sich wunderbar per Program, z.B. perl nutzen ...

    Donnerstag, 11. Juli 2013 11:33
  • 'powershell -ExecutionPolicy RemoteSigned -NoExit -Command -'

    ЭТО РАБОТАЕТ!!! IT'S WORK!!! ES FUNKTIONIERT!

    Спасибо большое! Очень долго искал решение данной проблемы! Кто бы знал, что найду в немецкой ветке! :)

    Thank you very much! A very long time looking for a solution to this problem! Who would have known that I would find in the German branch! :)

    Thank you very much! Eine sehr lange Zeit auf der Suche nach einer Lösung für dieses Problem! Wer hätte gewusst, dass ich in der deutschen Niederlassung zu finden Branche! :)

    Sorry for my English and German =)

    Mittwoch, 9. Oktober 2013 09:13