Как настроить командлеты PowerShell 4, такие как Test-NetConnection, для работы в Windows 7?
Ситуация. На компьютере с Windows 7 с пакетом обновления 1 (SP1) я обновил Windows6.1-KB2819745-x64-MultiPkg.msu. Кроме того, в PowerShell $PSVersionTable теперь выдается "PSVersion 4.0".
В настоящее время мой вывод заключается в том, что многие командлеты PowerShell 4, такие как Test-NetConnection, будут работать только на Windows 8.1. Однако мне было интересно, есть ли способ обойти импорт модулей PowerShell 4 на моем компьютере с Windows 7.
6 ответов
Вы не можете, они полагаются на базовые функции новой ОС (8.0 или 8.1) и не могут быть перенесены обратно в W7. Альтернативой является написание собственных функций / модулей для репликации новых командлетов с использованием методов.NET Framework.
Например, командлет Get-FileHash является однострочным в Powershell 4.0, но для репликации в 2.0 нам нужно использовать.NET.
Powershell v4
Get-FileHash -Algorithm SHA1 "C:\Windows\explorer.exe"
Powershell v2
$SHA1 = new-object -TypeName System.Security.Cryptography.SHA1CryptoServiceProvider
$file = [System.IO.File]::Open("C:\Windows\explorer.exe",[System.IO.Filemode]::Open, [System.IO.FileAccess]::Read)
[System.BitConverter]::ToString($SHA1.ComputeHash($file)) -replace "-",""
$file.Close()
По крайней мере, Test-NetConnection можно перенести обратно в Windows 7. Просто скопируйте папки NetTCPIP, DnsClient, NetSecurity с поддерживаемой машины Windows с той же версией PS (win8.1, Win10 и т. Д.). Папка - C:\Windows\System32\WindowsPowerShell\v1.0\Modules. затем Import-Module -Name C:\Windows\System32\WindowsPowerShell\v1.0\Modules\NetTCPIP -Verbose
В качестве альтернативы вы можете импортировать модуль с удаленного компьютера (скажем, win2012
):
$rsession = New-PSSession -ComputerName win2012
Import-Module NetTCPIP -PSSession $rsession
У меня была та же проблема на моем Windows 7 x64, и оба решения работали для меня с PowerShell 5.1.
Добавление к ответу @Anton Krouglov. Модули PowerShell являются кроссплатформенными. Таким образом, модуль скопирован из Windows Server 2012 R2 x64
можно импортировать в Windows 7 x86
и даже если вы работаете как обычный пользователь без прав на копирование их в C:\Windows\System32\WindowsPowerShell\v1.0\Modules
Вы можете скопировать его в любую локальную папку и запустить
Предполагая, что вы скопировали NetTCPIP
, DnsClient
, NetSecurity
модули с компьютера Server 2012 или новее, и сохраните их в папке, которую вы можете импортировать, используя
Get-ChildItem -Directory .\psmodules | foreach { Import-Module -Name $_.FullName -Verbose}
Test-NetConnection -InformationLevel "Detailed"
Я вижу несколько ответов, подтверждающих переносимость, и мое тестирование подтверждает их утверждения:
Импортируйте все необходимые модули либо из файла, либо через сеанс PSSession на хост, на котором есть необходимые модули. Архитектура консоли PowerShell (x86 или x64), которую вы запускаете, будет определять, какую архитектуру модуля вы импортируете.
Для тех, кто:
- все еще не могу сделать эту работу И
- нужен надежный тест TCP, но может не понадобиться все остальное, предоставляемое Test-NetConnection И
- Нужно, чтобы все это работало даже на PowerShell v2.0
Вы можете попробовать это.
# 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()
Естественно, должна быть возможность создать цикл, который проверяет несколько соединений и выводит результаты, выбирая свойства $TCPClient. Мое первоначальное тестирование показывает, что вам нужно выбрать эти свойства
Адрес, который вы проверили
$TCPClient.Client.RemoteEndPoint.Address.IPAddressToString
Порт, который вы тестировали
$TCPClient.Client.RemoteEndPoint.Port
Результат
$TCPClient.Connected
HIH
Насколько я знаю, Win 2008 R2/win 7 просто не имеет счетчиков, которые методы.NET используют для реализации get-netstuff.
Новая версия PowerShell может реализовывать сравнение хэшей и т. Д., Поскольку это не связано ни с чем, а является лишь частью кода. Но если вы хотите использовать для примера Get-NetTCPConnection, вам нечего показать. Надеюсь, это помогло.
Хотя Powershell 4.0 доступен в Windows 7, поскольку Knuckle-Dragger заявляет, что некоторые функции зависят от новых функциональных возможностей операционной системы. К сожалению, Test-NetConnection недоступна в Windows 7, как указано в документации.
Test-Connection, который присутствует, это в основном ping. Test-NetConnection предлагает гораздо больше функциональных возможностей, позволяющих выбирать такие вещи, как порты TCP, протоколы, трассировку маршрутов и уровни информации.
Существует скрипт Send-Ping, доступный из ScriptCenter в галерее Technet, но я думаю, что он действительно полезен, если вы по какой-то причине застряли на Powershell 3.0?
Я могу только предположить, что вы установили неправильный пакет. Убедитесь, что вы скачали соответствующий пакет отсюда.
Ниже вы увидите, как работает Windows 7 с пакетом обновления 1 (SP1) и Powershell 4 с использованием Test-Connection и Get-FileHash: