Mit Powershell möchte ich viele Funktionen auf einem Remote-Host ausführen, um Informationen zu sammeln.
Hier ist ein Beispiel zum Remote-Abrufen des Dateiinhalts, indem Sie einfach eine Funktion namens getcontentfile mit dem Parameter als Namen des Remote-Hosts ausführen:
function getcontentfile
{
[CmdletBinding()]
param($hostname)
$info = Get-Content "C:\fileinfo.xml"
write-host $info
}
Diese Funktion sollte Informationen zum Remote-Host an die lokale Instanz von PowerShell zurückgeben. Wie kann ich dieses Skript dazu ändern?
powershell
remote-access
Aimar
quelle
quelle
Antworten:
Erstens, um Informationen zurückzugeben, nicht verwenden
Write-Host
(dies gilt immer, es sei denn, Sie möchten wirklich nur beide Farben haben und nur lokal interaktiv arbeiten).Machen Sie die Ausgabe zum Rückgabewert der Funktion:
Zweitens: enable PSH Remoting auf den Zielsystemen: siehe Hilfe für
Enable-PSRemoting
.Drittens: Führen Sie den Befehl remote aus:
Dadurch wird der Inhalt der Datei auf den beiden Computern zurückgegeben. Um die Ergebnisse zu trennen, werden beim Hinzufügen von Jobobjekten Jobobjekte zurückgegeben,
-AsJob
die dann separat mit denJob
Cmdlets abgefragt werden können (siehegcm -noun job
Liste, HinweisReceive-Job
zum Abrufen der Ergebnisse eines Jobs).quelle
Invoke-Comment
. Man nimmt einen Skriptblock: Fügen Sie das gesamte Skript dort ein. Dies kann Funktionen, Lademodule usw. umfassen. Oder Sie können-FilePath
eine (Skript-) Datei benennen. Wenn Sie Skripte / Module laden, müssen Sie die Ausführungsrichtlinie berücksichtigen.Import-Module
? (Scheint ein seltsamer Pfad zu sein, aber das HV-Modul ist Teil von Windows und würde erwarten, dass es in der Standardeinstellung istenv:PSModulePath
.)Sie können eine lokal geladene Funktion auf einem Remotecomputer ausführen:
quelle
Ihre erste Option ist das Aktivieren von Powershell 2.0 Remoting .
Persönlich war ich nicht wirklich an Remoting interessiert, obwohl es leistungsstark ist. Deshalb habe ich ein Skript zur Verwendung von WMI geschrieben, einen Prozess mit cmd.exe erstellt und dann stdout und stderr an eine Protokolldatei weitergeleitet, die Sie dann lesen können.
Das Skript belässt seine Protokolldatei auf dem Remotecomputer, sodass Sie sie einfach
get-content \\remotecomputer\c$\remoteExec.log
lesen können.BEARBEITEN: In diesem Beispiel heißt das Skript remoteExec.ps1 und ich verwende es, um einen Remote-Powershell-Prozess zu erstellen und einen Befehl auszuführen (was der Fragesteller versucht):
.\remoteExec.ps1 -program "C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe" -verifyPath -computerName "computer1" -args "-command Get-ChildItem C:\"
Ich könnte dann das Protokoll lesen mit:
Get-Content \\computer1\C$\remoteExec.log
quelle
.\remoteExec.ps1 -program "C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe" -verifyPath -computerName "computer1"-args "-command Get-ChildItem C:\"
Da das Skript CMD.EXE aufruft, muss es die Powershell öffnen und den Befehl angeben, den Sie ausführen möchten.psexec
? (Besser wäre es, die Politik zu verbessern). PS. PSH v2 kann bei Bedarf und Erlaubnis unter WinXP und 2003 installiert werden.Die kurze Antwort lautet: Sie können nicht.
Normalerweise führen Sie
Invoke-Command
einen Befehl auf einem Remotecomputer aus. Dieser Befehl kann ein Skriptblock oder ein PowerShell-Skript sein. Keiner dieser Ansätze kann Variablen oder Funktionen, die auf Ihrem lokalen Computer vorhanden sind, erreichen und verwenden, dh Sie können Ihre Funktionen nicht im Voraus laden, um sie auf dem Remotecomputer zugänglich zu machen.Sie müssen sie nur auf den Remotecomputer laden und von dort laden. Wir erstellen eine gemeinsame Freigabe und stellen unsere PowerShell-Skripts für diese Freigabe bereit.
quelle