syntax1001
Goto Top

PowerShell - Variablen richtig in Remote-Session (Invoke-Command) übergeben

Hallo Zusammen,

ich bin gerade dabei ein Script zu schreiben, dass bestimmte Werte aus einer PS-GUI ausliest und über einen Invoke-Command an mehrere Server übergeben soll.

Zum Verständnis hier der ganze Ablauf des Scripts:
1. Domänen-Namen angeben (.test.de)
2. .msi Datei des Agenten auswählen
3. GUI startet --> .csv mit allen Hosts auswählen
4. GUI ausfüllen (Werte für die Registrierung festlegen)
5. Start drücken --> .msi wird installiert (SOLL danach auch registrieren...)

Die Herausforderung dabei: Der Invoke-Command startet den CheckMK Update Agent, um diesen am Monitoring-Server zu registrieren. Dafür verwende ich dann folgenden Befehl:
Start-Process -FilePath "C:\ProgramData\checkmk\agent\plugins\cmk-update-agent.exe" -ArgumentList "register -s $($IP) -i $($SITE) -H $($env:COMPUTERNAME) -p $($PROTOCOL) -U $($CMKUSER) -P $($CMKPWD) -v" -Wait -PassThru  

Die Variablen des Befehls werden in der GUI, die vorher startet, eingegeben.
$IP = $IPBox.Text (Textbox)
$SITE = $SITEBox.Text (Textbox)
$CMKUSER = $USERBox.Text (Textbox)
$CMKPWD = $PWDBox.Text (Textbox)
$PROTOCOL = $PROTOCOLBox.SelectedItem (Combobox)

Mein Problem:
Wenn ich den oben stehenden Befehl manuell ausführe, egal ob lokal auf dem Client, oder via Invoke-Command von einem beliebigen Server, dann funktioniert alles einwandfrei. Bei diesem Testvorgang habe ich natürlich keine GUI aus der ich die Werte auslesen kann, daher habe ich diese manuell in die Variablen übergeben. Der Befehl an sich funktioniert also. Das Problem ist das korrekte auslesen/übergeben der Variablen für die Registrierung.
Für das Registrieren habe ich eine Funktion erstellt:
function Register-CMKAgent()
{
    $IP = $IPBox.Text
    $SITE = $SITEBox.Text 
    $CMKUSER = $USERBox.Text
    $CMKPWD = $PWDBox.Text
    $PROTOCOL = $PROTOCOLBox.SelectedItem

    Start-Process -FilePath "C:\ProgramData\checkmk\agent\plugins\cmk-update-agent.exe" -ArgumentList "register -s $($IP) -i $($SITE) -H $($env:COMPUTERNAME) -p $($PROTOCOL) -U $($CMKUSER) -P $($CMKPWD) -v" -Wait -PassThru  
}

Aufrufen tue ich diese Funktion dann so:
Invoke-Command -ComputerName $($mHost+$domain) -ScriptBlock ${Function:Register-CMKAgent}

Was das Nutzen der Variablen angeht habe ich schon viele Wege versucht. In der Funktion die Variablen als $global:IP festgelegt z.B, oder in dem Start-Process Befehl die Variablen mit $using:IP genutzt.
Aber all das hat leider nicht zum gewünschten Erfolg geführt...Irgendwo muss ich einen Denkfehler, bzw. fehlende Kenntnisse besitzen...
Ich hoffe mir kann da jemand von euch weiterhelfen. Solltet ihr noch mehr Infos vom Script brauchen, dann lasst es mich wissen.

Content-ID: 595122

Url: https://administrator.de/contentid/595122

Ausgedruckt am: 26.11.2024 um 03:11 Uhr

145033
Lösung 145033 10.08.2020 aktualisiert um 10:06:03 Uhr
Goto Top
Zwei Beispiele von diversen Varianten
function test($a,$b){
    write-host "Var1 : $a, Var2 : $b"  
}
Invoke-Command -ComputerName XYZ -ScriptBlock ${function:test} -ArgumentList "Inhalt1","Inhalt2"  
Oder auch
Invoke-Command -ComputerName XYZ -ArgumentList "Inhalt1","Inhalt2" -ScriptBlock {  
    param($a,$b)
    write-host "Var1 : $a, Var2 : $b"  
} 
usw.
SYNTAX1001
SYNTAX1001 10.08.2020 um 11:24:18 Uhr
Goto Top
Hallo Kleiber,

vielen Dank für deine Hilfe.
Dein Beispiel hat zu der Lösung meines Problems beigetragen.
Das Problem war nicht, dass ich die Variablen nicht übergeben konnte...Das Problem war, dass der Inhalt der ComboBox "Protocol" in Großbuchstaben geschrieben war. Der Befehl zum Registrieren wollte aber ausschließlich mit Kleinbuchstaben arbeiten....
Dementsprechend hätten meine vorherigen Lösungswege vielleicht auch schon geklappt....
Trotzdem vielen Dank!

LG SYNTAX101