Was macht psexec -d?

2388
sirdank

SS64 sagt, dass es bedeutet

Warten Sie nicht auf die Beendigung der Anwendung. Nur für nicht interaktive Anwendungen verwenden.

Aber ich verstehe das nicht. Ich versuche, einige nicht interaktive Systemaufrufe auszuführen, aber wenn ich nicht bestanden habe -d, kehrt mein Powershell-Job nie zurück, und wenn ich bestanden habe, -dbekomme ich nichts zurück, wenn er zurückkommt. Kann mir jemand sagen was genau -d macht?

Oder für Bonuspunkte können Sie mir sagen, wie Sie diese Rendite nützlich machen können:

C:\PSExec.exe \\$hostname /accepteula -u user -p pass -d cmd /C "type $file" 2> $null 
4
cmd / C "type $ file" 2> $ null Dies bewirkt nichts, entfernen Sie den cmd-Teil und geben Sie ihn in Ihre eigene Eingabeaufforderung ein. Dies ist kein tatsächlicher Befehl. Deshalb gibt es nichts zurück. Cole vor 8 Jahren 0
@Cole Sorry, ich bin mir nicht sicher, welcher Teil davon ungültig ist. Es funktioniert gut für mich, wenn ich es in mein Powershell-Fenster eingebe (ohne -d). Wenn ich jedoch -d nicht verwende und auf "Start-Job" schiebe, kehrt mein gestarteter Job nie zurück. sirdank vor 8 Jahren 0
`C: \ PSExec.exe \\ $ hostname / accepteula -u benutzer -p pass -d cmd` bedeutet, dass Sie` cmd` auf einem Remote-System ausführen. Versuchen Sie `C: \ PSExec.exe \\ $ hostname -u benutzer -p pass powershell` NetwOrchestration vor 8 Jahren 0
@AmirHossein Danke für den Vorschlag und du hast recht. `type C: \ Shared \ file.txt` funktioniert jedoch über die Eingabeaufforderung. Powershell löst `$ file` auf, bevor der Befehl an PSExec gesendet wird. Diese Zeile funktioniert gut, solange ich sie ohne '-d' und nicht innerhalb einer 'Start-Job'-Aufgabe mache. sirdank vor 8 Jahren 0

2 Antworten auf die Frage

3
Ben N

Der -dSchalter, auf den in der Beschreibung in Ihrer Frage hingewiesen wird, lässt PsExec nicht auf das Beenden des neuen Prozesses warten. Sie können keinen Exit-Code oder keine Ausgabe erhalten, da der Remote-PsExec-Dienst den Prozess gerade startet, dem neuen PsExec-Programm die neue Prozess-ID mitteilt und sich nicht mehr um den neuen Prozess kümmert. Ohne -dwird die gesamte Prozessausgabe an das PsExec-Programm zurückgesendet, mit dem das Ganze gestartet wurde, und PsExec muss warten, bis der neue Prozess beendet ist, damit er wissen kann, wann er beendet werden soll.

PsExec nicht spielen gut mit Umleitung oder Powershell . Ich habe es geschafft, eine teilweise Ausgabe zu erhalten, indem ich die PowerShell- -inputformat noneStartinstanz mit dem Parameter startete, aber PsExec schneidet etwas von der Ausgabe des Befehls ab und ich komme nicht herum.

Sie können stattdessen PowerShell-Remoting ausprobieren :

Invoke-Command -ComputerName $hostname -Credential (New-Object PSCredential -ArgumentList 'username', (ConvertTo-SecureString 'password' -AsPlainText -Force)) 
Davor hatte ich Angst. Abhängig von den verwendeten Parametern kann ich auch drei Zeilen Ausgabe erhalten, aber das ist nicht sehr hilfreich. Ich habe versucht, das Powershell-Remoting zu vermeiden, da dies eine spezielle Einrichtung erfordert, um funktionieren zu können. Möglicherweise muss ich jedoch in Zukunft darauf zurückgreifen. Ich denke, jetzt werde ich versuchen, die entfernten Laufwerke abzubilden und die Datei aus dem Dateisystem zu laden. Vielen Dank! sirdank vor 8 Jahren 0
2
NetwOrchestration

Bei nicht interaktivem -d Befehl wird der Befehl nur ausgeführt, ohne dass die Ausgabe zurückgegeben wird. Anschließend wird die Remote-Eingabeaufforderung beendet. Tatsächlich tut es dies, indem nur der Fehlercode des entfernten Prozesses zurückgegeben wird. In Ihrem Fall zeigt es die Ausgabe $fileeines nicht vorhandenen, verborgenen cmdFensters auf einem Remote-Computer an und wird beendet. Deshalb sieht man nichts. Versuchen Sie, mithilfe von -dswitch eine Datei auf einem Remote-Computer zu erstellen, und Sie sehen, dass es funktioniert.

Aktualisieren:

Wenn $filees sich um eine Variable in einem Remote-Computer handelt, besteht das Problem darin, dass Sie eine Variable verwenden, die in Ihrer lokalen Powershell-Umgebung (wie Sie bereits erwähnt haben) erweitert wird. Verwenden Sie daher cmdstattdessen eine Variable (wenn Sie den Befehl senden cmd) und nicht erweitern Power Shell.PSExec.exe \\$hostname -u user -p pass -d cmd /c "type %file%" 2> $null

Das ist jedoch nicht die ECHTE Lösung! was ist, wenn Sie einen Befehl an die Powershell senden möchten? Sie brauchen etwas, das die Erweiterung verhindert, wie %%varibale%%in cmd. Ich habe festgestellt, dass mit "wird erweitert, aber" die Erweiterung in Powershell verhindert:

PS> "This is $file" gegen PS> 'This is $file'

Dies ist jedoch in Ihrem Fall nicht hilfreich. Eine andere Möglichkeit besteht darin, ein Skript auf dem lokalen Computer zu erstellen und mit PSEXEC an das Ziel zu senden:

PSExec.exe \\$hostname -u user -p pass -c powershell script.ps1 2> $null 

Oder ... verwenden Sie Invoke-Command wie hier erwähnt :

PS C:\> invoke-command -filepath c:\scripts\test.ps1 -computerName $hostname 
Hallo Amir, ich denke du bist vielleicht etwas verwirrt. Dieser Befehl funktioniert hervorragend, wenn die Skriptdatei synchron und im Konsolenfenster ausgeführt wird, bricht sie jedoch nur ab, wenn ich versuche, sie als Powershell-Hintergrundjob auszuführen. Ich habe versucht / K und es hat mir nicht geholfen. sirdank vor 8 Jahren 0
Meine Antwort wurde aktualisiert. Wenn ich immer noch verwirrt bin, sag es mir bitte :) NetwOrchestration vor 8 Jahren 0
Amir, danke, dass du so geduldig mit meinem dummen Problem bist. $ file ist keine entfernte Variable, sondern eine lokale, die ich erweitern möchte. Alles, was ich auf dem Zielcomputer ausführen möchte, ist `type C: \ Shared \ file.config`, aber es funktioniert nicht. Leider denke ich, dass ich Bens Antwort akzeptieren muss, da "PsExec nicht gut spielt", was jetzt auch meine Erfahrung ist. Danke noch einmal! sirdank vor 8 Jahren 0
Bitte! Ich sagte, ich bin noch kein Powershell-Experte. Ich habe seine Antwort angehört, bevor Sie sie ebenfalls billigen. Viel Glück! NetwOrchestration vor 8 Jahren 1