Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Powershell - Some commands won't run with Invoke-Command

Tags:

powershell

I am trying to send some commands from a server to about 50 clients running Powershell. Most commands work using Invoke-Command. I used the exact same format as my other commands, yet this one won't work. Basically I want to have each client fetch an .xml file from my server to import it later on. I am missing $credentials and other variables from my code sample here but they are setup correctly somewhere else in my script.

Permission wise, TrustedHosts in winrm is set to * and script execution is set to Unrestricted.

        clear
    $temp = RetrieveStatus

    $results = $temp.up  #Contains pinged hosts that successfully replied.

    $profileName = Read-Host "Enter the profile name(XML file must be present in c:\share\profiles\)"
    $File = "c:\profiles\profile.xml"
    $webclient = New-Object System.Net.WebClient
    $webclient.Proxy = $NULL
    $ftp = "ftp://anonymous:[email protected]/profiles/$profileName"
    $uri = New-Object System.Uri($ftp)
    $command = {write-host (hostname) $webclient.DownloadFile($uri, $File)}

    foreach($result in $results)
        {           
    # download profile from C:\share\profiles
    Invoke-Command $result.address -ScriptBlock $command -Credential $credentials
    # add profile to wireless networks
    # Invoke-Command $result.address -ScriptBlock {write-host (hostname) (netsh wlan add profile filename="c:\profiles\$args[0].xml")} -argumentlist $profileName -Credential $credentials
        }

I get the following error:

You cannot call a method on a null-valued expression.
+ CategoryInfo          : InvalidOperation: (DownloadFile:String) [], RuntimeException
+ FullyQualifiedErrorId : InvokeMethodOnNull

Any idea? The same command works flawlessly on the clients when run locally.

like image 713
Frederic Portaria-Janicki Avatar asked Dec 05 '25 19:12

Frederic Portaria-Janicki


1 Answers

You use $webclient within a scriptblock where $webclient will not be defined on the other end. Why don't you create the web client in the scriptblock e.g.:

$command = {
    param($profileName)
    $File = "c:\profiles\profile.xml"
    $webclient = New-Object System.Net.WebClient
    $webclient.Proxy = $NULL
    $ftp = "ftp://anonymous:[email protected]/profiles/$profileName"
    $uri = New-Object System.Uri($ftp)
    Write-Host (hostname)
    $webclient.DownloadFile($uri, $File)}
}

$profileName = Read-Host "Enter the profile name(XML file must be present in c:\share\profiles\)"

Invoke-Command $result.address -ScriptBlock $command -Credential $credentials -Arg $profileName

This will require you to provide some of the variables from the client to the remote machine via the -ArgumentList parameter on Invoke-Command. Those supplied arguments then map to the param() statement in the scriptblock.

like image 152
Keith Hill Avatar answered Dec 07 '25 17:12

Keith Hill



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!