none
Executing a remote command using powershell RRS feed

  • Frage

  • Hi!


    I'd like to run a command on a remote computer using Windows 7. So far I've come to the conclusion, that powershell should be the way to go. As a first example, I'd simply like to start the file manager "Explorer" on the remote machine. After setting permissions, I'm able to run somehting like the following successfully:

    PS C:\Users\hans> Invoke-Command -computername 192.168.123.227 -Credential wurst {Get-UICulture}
    
    LCID             Name             DisplayName                                PSComputerName
    ----             ----             -----------                                --------------
    1031             de-DE            Deutsch (Deutschland)                      192.168.123.227

    So far - ok. Permissions seem to be correct and I am able to exectue remote commands. But I can't get the explorer to run. I've tried several different methods, for example by using a script, that I run remotely. The content of my powershell-script is the following:

    Invoke-Expression -Command:"C:\Windows\explorer.exe"
    I am calling this script using the following command line:

    Invoke-Command -computername 192.168.123.227 -Credential wurst -FilePath c:\test.ps1
    test.ps1 is saved on my local machine in C:\

    Calling the command mentioned simply returns, but there is nothing to see on the remote machine. If I call a script with the same content on the remote machine with no remote administration - meaning sitting in front of it and using its own powershell - i get an explorer opened.

    What am I doing wrong? Is there a final step I need to do in order to start a program remotely? All the examples found on http://technet.microsoft.com/en-us/library/hh849719.aspx did not help me.

    Any help would be appreciated.

    Best regards,

    Dennis

    Donnerstag, 18. September 2014 14:03

Antworten

  • 1.)

    Invoke-Command ist eine Temporäre Ausführungsumgebung!
    Invoke-Command verbindet sich mit dem Rechner und erstellt eine Ausführungsumgebung (Session oder auch Runspace genannt)
    Nachdem die Kommandos ausgeführt worden sind wird diese Verbindung wieder abgebaut und die Ausführungsumgebung (die Session) wird vernichtet.
    Beim Vernichten der Session werden alle darin befindlichen Prozesse und Variablen ebenfalls vernichtet!

    Für dauerhafte Sitzungen gibt es das Cmdlet Enter-PSSession.

    Seit PowerShell 3.0 gibt es auch disconnected sessions die weiterlaufen können wenn man sich von der session abmeldet.

    1a.)

    Die Session (der Prozess der Session) läuft mit dem User Account den du in -Credentials angibst wenn du keine Credentials angibst wird die Session mit dem Aktuellen User Account ausgeführt.
    Dies ist eine Anmeldung (Log-On) und wenn die Session wieder abgebaut wird ist dies ein Log-Off!

    2.)

    Wie gesagt, seit Windows Vista gibt es die Benutzerkontensteuerung (User Account Control, UAC).
    Die dadurch bedingte Session 0 Isolierung erlaubt es nur Prozesse, die im Kontext des Angemeldeten User laufen, sichtbare Fenster Anzuzeigen.

    Was willst du denn erreichen?


    PowerShell Artikel, Buchtipps und kostenlose PowerShell Tutorials + E-Books
    auf der deutschsprachigen PowerShell Community

    Mein 21 Teiliger PowerShell Video Grundlehrgang
    Deutsche PowerShell Videos auf Youtube
    Folge mir auf:
    Twitter | Facebook | Google+

    Freitag, 19. September 2014 09:18
  • Hallo Dennis,

    dann wuerde ich aus dem entfernten Rechner einen Task (StartBackup) im AufgabenPlaner bauen, analog dem Link.

    Diesen Task kannst du dann von einem anderen Rechner (BackupStarter) so starten.

    Invoke-Command -ComputerName BakupME {
     SCHTASKS /Run /TN "StartBackup"
    }

    Das kannst Du dann ja auch wieder hinter einem schoenen Icon  auf dem BackupStarter verstecken.

    Somit wird dann der Task auf dem entfernten Rechner BakupME durch den BackupStarter angestossen, der wiederum das Backup startet womit du erreichst das das eigentliche Backup lokal, also vom BakupME kontrolliert wird, der Process also unabhaengig von der Invoke Session ist, die ja nur dazu gedient hat den Backup Process anzustossen.

    Beste Gruesse
    brima

    Freitag, 19. September 2014 12:33

Alle Antworten

  • Hallo Dennis!

    Das Remoting läuft als ein Dienst im unsichtbar im Hintergrund genauso wie z.B. Scheduled Tasks als Dienst unsichtbar im Hintergrund laufen.

    Du kannst zwar Programme Starten die ein Fenster öffnen aber niemand wird diese Fenster jemals zu sehen bekommen, da ein Dienst im unsichtbar im Hintergrund läuft ;-)

    Siehe auch Session 0 Isolierung:

    http://msdn.microsoft.com/de-de/library/aa480152.aspx#ID0EFZAE

    AM besten du führst einen DOS oder PowerShell Befehl aus der dir etwas zurück liefert.
    Der folgende Befehl wird auf dem Zielrechner ausgeführt und gibt den Rechnernamen des Rechners zurück. Daran erkennst du das du auf dem richtigen Rechner bist ;-)

    Nur Administratoren dürfen per default Remoting auf andere Rechner machen!

    Invoke-Command -computername 192.168.123.227 -ScriptBlock { $env:ComputerName }


    PowerShell Artikel, Buchtipps und kostenlose PowerShell Tutorials + E-Books
    auf der deutschsprachigen PowerShell Community

    Mein 21 Teiliger PowerShell Video Grundlehrgang
    Deutsche PowerShell Videos auf Youtube
    Folge mir auf:
    Twitter | Facebook | Google+

    Donnerstag, 18. September 2014 15:06
  • Hallo Peter!

    Vielen herzlichen Dank für Deine Antwort. Das hat mein Verständnis für die Thematik deutlich erhöht. Um Deine Aussagen gegenzuprüfen, habe mein Script etwas abgeändert:

    Invoke-Expression -Command:"echo hallo >> C:\nachricht"

    Wenn ich dann das Script als C:\test.ps1 speichere und folgendes mache:

    Invoke-Command -computername 192.168.123.227 -Credential wurst -FilePath c:\test.ps1

    , finde ich auf dem Zielrechner (192.168.123.227) die Datei C:\nachricht mit dem Inhalt "hallo". Klappt also.

    Soweit, so gut. Allerdings verstehe ich nach wie vor nicht, wieso ich kein "Programm" auf dem entfernten Rechner starten kann. Wenn ich den Task-Manager aufrufe auf dem Zielrechner und dann mein Script wie ganz am Anfang gehabt starte (mit dem Aufruf von C:\Windows\Explorer.exe), startet kein neuer "explorer.exe"-Prozess auf dem Zielrechner.

    Ich weiß, was Hintergrundprozesse sind und ich habe nun auch (denke ich) verstanden, wie ich entfernte Befehle ausführen kann, aber einen Eingriff in das "Userinterface" (so nenne ich es jetzt mal) bekomme ich nach wie vor nicht hin.

    Könntest Du mir bitte abermals einen heißen Tipp geben?

    Viele Grüße und abermals herzlichen Dank,

    Dennis

    Freitag, 19. September 2014 07:46
  • 1.)

    Invoke-Command ist eine Temporäre Ausführungsumgebung!
    Invoke-Command verbindet sich mit dem Rechner und erstellt eine Ausführungsumgebung (Session oder auch Runspace genannt)
    Nachdem die Kommandos ausgeführt worden sind wird diese Verbindung wieder abgebaut und die Ausführungsumgebung (die Session) wird vernichtet.
    Beim Vernichten der Session werden alle darin befindlichen Prozesse und Variablen ebenfalls vernichtet!

    Für dauerhafte Sitzungen gibt es das Cmdlet Enter-PSSession.

    Seit PowerShell 3.0 gibt es auch disconnected sessions die weiterlaufen können wenn man sich von der session abmeldet.

    1a.)

    Die Session (der Prozess der Session) läuft mit dem User Account den du in -Credentials angibst wenn du keine Credentials angibst wird die Session mit dem Aktuellen User Account ausgeführt.
    Dies ist eine Anmeldung (Log-On) und wenn die Session wieder abgebaut wird ist dies ein Log-Off!

    2.)

    Wie gesagt, seit Windows Vista gibt es die Benutzerkontensteuerung (User Account Control, UAC).
    Die dadurch bedingte Session 0 Isolierung erlaubt es nur Prozesse, die im Kontext des Angemeldeten User laufen, sichtbare Fenster Anzuzeigen.

    Was willst du denn erreichen?


    PowerShell Artikel, Buchtipps und kostenlose PowerShell Tutorials + E-Books
    auf der deutschsprachigen PowerShell Community

    Mein 21 Teiliger PowerShell Video Grundlehrgang
    Deutsche PowerShell Videos auf Youtube
    Folge mir auf:
    Twitter | Facebook | Google+

    Freitag, 19. September 2014 09:18
  • Hallo,

    um das zu sehen was Perter erklaert hat kannst Du ja mal folgendes machen.

    Invoke-Command -computername SrvA {notepad.exe}

    Den Notepad Process wirst Du auf dem Zielsystem nicht sehen, denn nach dem du Enter gedrueckt hast und diese Taste wieder losgelassen hast ist Notepad auf dem Zielsystem bereist wieder beendet.

    Invoke-Command -computername SrvA {notepad.exe;start-sleep -seconds 30}
    Wenn du es so machst wird die Session nach dem Start vom Notepad noch 30 Sekunden gehalten und der Notepad Process ist auch im Task Manger des Zielsystemes zu sehen. Er verschwindet dann genau nach 30 Sekunden, weil dann die Session beendet wird und somit auch alles was darin laeuft.

    Beste Gruesse
    brima



    • Bearbeitet brima Freitag, 19. September 2014 09:41
    Freitag, 19. September 2014 09:36
  • Hey Peter!

    Ich möchte auf einem Rechner per "Desktop-Link" (also ein schickes Icon, was den Otto-Normal-User nicht an der Existenz eines Computergottes zweifeln lässt) ein Backup starten lassen. Der entfernte Rechner hat eine USB-Backup Platte, die nur hin und wieder angesteckt wird. Wenn die dann angesteckt wird, soll der User an einem bestimmten Rechner zu einer Uhrzeit, die er selbst frei wählen kann, ferngesteuert das Backup starten können auf dem Rechner, der zwei Etagen höher steht. Das passiert mit Acronis True Image. Einen Link dafür hab ich schon auf dem Desktop des entfernten Rechners liegen, jetzt muss ich nur diesen Link noch aus der Ferne starten können. Weil ich's für den Nutzer möglichst einfach halten will, fällt auch eine VNC-Lösung raus.

    Unter *nix wäre das alles kein Problem, ssh sei Dank. Aber leider bin ich nicht sehr Windows-bewandert und stehe hier vor einem gänzlich neuen Problem.

    Soviel zu Deiner Frage "Was willst du denn erreichen?"

    Viele Grüße

    Dennis

    Freitag, 19. September 2014 11:11
  • Hallo Dennis,

    dann wuerde ich aus dem entfernten Rechner einen Task (StartBackup) im AufgabenPlaner bauen, analog dem Link.

    Diesen Task kannst du dann von einem anderen Rechner (BackupStarter) so starten.

    Invoke-Command -ComputerName BakupME {
     SCHTASKS /Run /TN "StartBackup"
    }

    Das kannst Du dann ja auch wieder hinter einem schoenen Icon  auf dem BackupStarter verstecken.

    Somit wird dann der Task auf dem entfernten Rechner BakupME durch den BackupStarter angestossen, der wiederum das Backup startet womit du erreichst das das eigentliche Backup lokal, also vom BakupME kontrolliert wird, der Process also unabhaengig von der Invoke Session ist, die ja nur dazu gedient hat den Backup Process anzustossen.

    Beste Gruesse
    brima

    Freitag, 19. September 2014 12:33
  • @Brima Welcher Link ??

    Unter Windows benötigen viele Aufgaben Administrationsrechte, da gibt es auch kein sudo.

    Wenn der User Remote auf den anderen Rechner Arbeiten können soll, dann muss er dort als Admin eingetragen sein oder du musst für den User eine Sessionconfiguration bereitstellen oder die rechte von der vorhandenen Sessionconfiguration modifizieren.

    siehe: http://blogs.msdn.com/b/powershell/archive/2009/11/23/you-don-t-have-to-be-an-administrator-to-run-remote-powershell-commands.aspx

    Ich empfehle eine neue eigene eingeschränkte Sessionconfiguration zu erstellen, da der User mit der default Konfiguration alles machen kann, was PowerShell bietet. Bei einer eingeschränkte Sessionconfiguration kann man auswählen welche Befehle der User ausführen darf.

    Ich empfehle dazu diese Blog Serie:

    1. Introduction to PowerShell Endpoints
    2. Build Constrained PowerShell Endpoint Using Startup Script
    3. Build Constrained PowerShell Endpoint Using Configuration File
    4. Use Delegated Administration and Proxy Functions
    5. Build a Tool that Uses Constrained PowerShell Endpoint



    PowerShell Artikel, Buchtipps und kostenlose PowerShell Tutorials + E-Books
    auf der deutschsprachigen PowerShell Community

    Mein 21 Teiliger PowerShell Video Grundlehrgang
    Deutsche PowerShell Videos auf Youtube
    Folge mir auf:
    Twitter | Facebook | Google+


    Freitag, 19. September 2014 12:55
  • Hallo Peter,

    gemeint mit Link ist der von Dennis besagte Desktop Link, also der Shortcut(Verknuepfung) auf dem Desktop des entfernenten Rechners. :-) ueber den das Backup gestartet wird. ...

    Beste Gruesse
    brima



    • Bearbeitet brima Dienstag, 23. September 2014 11:19
    Freitag, 19. September 2014 13:10
  • Moin!

    Vielen Dank für Eure Antworten. Ich habe es nun hinbekommen, indem ich eine Aufgabe eingerichtet habe, die ich dann aus der Ferne starte - wie oben im Posting von brima dargelegt.

    Grüße

    Dennis

    Dienstag, 23. September 2014 09:09