Author Posts

October 12, 2017 at 9:14 pm

I am having problems getting accurate information from a invoke command and I isolated the issue to how I am using the scriptblock with a local variable. I have to use invoke since to retrieve a list of ip addresses, I need to remote to a server that is on the same domain as my terminal servers.

I have a Session created on my domain controller.

$TSsession = New-PSSession -ComputerName 10.221.21.2 -Credential $credential

This is the correct answer for this particular server's IP address.

(Invoke-Command -Session $TSsession -ScriptBlock {[System.Net.Dns]::GetHostAddresses("w12-r12-01s")}).ipaddresstostring
10.221.20.227

However, i want to loop through an array of servers, but when I have the value of that server saved as a string to a variable, I receive erroneous results where it spits out the name of the domain controller and not the server 'w12-r12-01s.

Value of $TerminalServer, which is a string

PS C:\Users\bclanton\Google Drive\Code\PS_Code> $TerminalServer
W12-R12-01S
PS C:\Users\bclanton\Google Drive\Code\PS_Code> $TerminalServer | Get-Member


   TypeName: System.String

Name             MemberType            Definition                                                                                                                                                       
----             ----------            ----------                                                                                                                                                       
Clone            Method                System.Object Clone(), System.Object ICloneable.Clone()                                                                                                          
CompareTo        Method                int CompareTo(System.Object

Now when I pass this variable to the same invoke command, I get the wrong IP address as well as the IPV6 address.

PS C:\Users\bclanton\Google Drive\Code\PS_Code> (Invoke-Command -Session $TSsession -ScriptBlock {[System.Net.Dns]::GetHostAddresses($TerminalServer)}).ipaddresstostring
fe80::a853:de5a:51:cbc1%12
10.221.21.2

Anyone see my error?

October 12, 2017 at 9:37 pm

Hey there Brian,

Try $using inside a Invoke-Command:

PS C:\Users\bclanton\Google Drive\Code\PS_Code> (Invoke-Command -Session $Using:TSsession -ScriptBlock {[System.Net.Dns]::GetHostAddresses($TerminalServer)}).ipaddresstostring

October 12, 2017 at 9:38 pm

variables you create on your local machine don't get passed over to the remote session. You're effectively passing $Null to the GetHostAddresses method which causes it to return the local IP (local in the remote session if that makes sense).

Couple of different ways to pass that variable, this one should work

(Invoke-Command -Session $TSsession -ArgumentList $Terminalserver -ScriptBlock {[System.Net.Dns]::GetHostAddresses($args[0])}).ipaddresstostring

You can also do a param() block in your scriptblock code and receive the -argumentlist variables that way, but $args works also

October 12, 2017 at 9:53 pm

Not true. You can pass variables into an Invoke-Command session. The Using modifier was introduced in PowerShell 3. Refer to example 9 in the following article.

https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.core/invoke-command?view=powershell-5.1