How do I get PowerShell 4 cmdlets such as Test-NetConnection to work on Windows 7?

后端 未结 7 797
刺人心
刺人心 2021-02-07 05:27

The situation. On a Windows 7 SP1 machine, I have updated with Windows6.1-KB2819745-x64-MultiPkg.msu. Furthermore, in PowerShell $PSVersionTable now reports ‘PSVersion 4.0’.

相关标签:
7条回答
  • 2021-02-07 05:41

    I can only assume you installed the wrong package. Make sure you download the proper package from here.

    Below you will see in running Windows 7 Service Pack 1 with PowerShell 4 using Test-Connection and Get-FileHash:

    Enter image description here

    0 讨论(0)
  • 2021-02-07 05:45

    At least Test-NetConnection can be ported back to Windows 7. Just copy folders NetTCPIP, DnsClient, and NetSecurity from the supported Windows machine with the same PowerShell version (Windows 8.1, Windows 10, etc). Folder - C:\Windows\System32\WindowsPowerShell\v1.0\Modules. Then Import-Module -Name C:\Windows\System32\WindowsPowerShell\v1.0\Modules\NetTCPIP -Verbose

    Alternatively, you can import a module from a remote machine (say win2012):

    $rsession = New-PSSession -ComputerName win2012
    Import-Module NetTCPIP -PSSession $rsession
    

    I have had the same problem on my Windows 7 x64 and both solutions worked for me as of PowerShell 5.1.

    0 讨论(0)
  • 2021-02-07 05:45

    While PowerShell 4.0 is available on Windows 7, as Knuckle-Dragger states certain features rely on newer operating system functionality. Unfortunately Test-NetConnection is not available in Windows 7 as stated in the documentation.

    Test-Connection, which is present, is basically ping. Test-NetConnection offers much more functionality, allowing a choice of things such as TCP ports, protocols, route tracing, and information levels.

    There is a Send-Ping script available from the ScriptCenter in the TechNet gallery, but I think this is only really useful if you are stuck on PowerShell 3.0 for some reason.

    0 讨论(0)
  • 2021-02-07 05:48

    As far as I know, Windows Server 2008 R2/Windows 7 simply doesn't have the counters that the .NET methods use to implement get-netstuff.

    A new PowerShell version can implement hash compare, etc. since this is not related to anything, just a piece of code. But if you want to use, for example, Get-NetTCPConnection there is nothing to show.

    0 讨论(0)
  • 2021-02-07 05:52

    Adding to Anton Krouglov's answer. PowerShell modules are cross-platform compatible. So a module copied from Windows Server 2012 R2 x64 can be imported to Windows 7 x86, and even if you are running as standard user without rights to copy them to C:\Windows\System32\WindowsPowerShell\v1.0\Modules you can copy it to any local folder, and run.

    Assuming you copied the NetTCPIP, DnsClient, and NetSecurity modules from a Windows Server 2012 or higher machine, and save them to a folder you can import them using

    Get-ChildItem -Directory .\psmodules | foreach { Import-Module -Name $_.FullName -Verbose}
    Test-NetConnection -InformationLevel "Detailed"
    
    0 讨论(0)
  • 2021-02-07 06:03

    I see several responses which assert portability, and my testing confirms their assertions:

    Import all of the required modules, either from file, or via a PSSession to a host which has the required modules. The architecture of PowerShell Console (x86 or x64) you run will determine which module architecture you import.

    For those who are:

    • still unable to make this work AND
    • do need a reliable TCP test, but may not need everything else provided by Test-NetConnection AND
    • Need it all to work even on PowerShell v2.0

    You may wish to try this.

    # Create a TCP Client using .Net & attempt connection to target
    $TCPClient = New-Object .net.sockets.tcpclient("[IP address or hostname]",[port])
    # At the above point you may see familiar-looking Windows error messages in
    # red text. (You may want to use "try/catch" if you intend to loop).
    # Otherwise, check your new object's status to see if it worked
    $TCPClient.Connected
    # The response is either "True" or False"
    # Now to avoid leaving idle connections, run:
    $TCPClient.Close()
    

    Naturally, it should be possible to create a loop which tests multiple connections, and outputs the results by selecting the properties of the $TCPClient. My initial testing shows you would want to Select these properties

    The address you tested

    $TCPClient.Client.RemoteEndPoint.Address.IPAddressToString
    

    The port you tested

    $TCPClient.Client.RemoteEndPoint.Port
    

    The result

    $TCPClient.Connected
    

    HIH

    0 讨论(0)
提交回复
热议问题