Для установки Powershel 4 требуется установленный .NET Framework
Программная платформа, выпущенная компанией Microsoft в 2002 году. Основой платформы является общеязыковая среда исполнения Common Language Runtime (CLR), которая подходит для разных языков программирования. Функциональные возможности CLR доступны в любых языках программирования, использующих эту среду.
4.5. Необходимо убедится, что он установлен и если нет, то установить его. Один из способов проверить установку, это через реестр.

Скрипт installNetFramework.bat:

@ECHO OFF
REM Check to see if .Net Framework 4.5 is installed
REG QUERY "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework\v4.0.30319\SKUs\.NETFramework,Version=v4.5"
IF %errorlevel%==1 GOTO INSTALLNET
IF %errorlevel%==0 GOTO EXIT
:INSTALLNET
Start /wait \\192.168.223.201\install$\Updates\WindowsManagmentFramework\wmf4\NDP452-KB2901907-x86-x64-AllOS-ENU.exe /norestart /q
:EXIT
exit

Скрипт installWMF4.bat:

@ECHO OFF
REG QUERY "HKLM\SOFTWARE\Microsoft\PowerShell\3\PowerShellEngine" /f 4.0
IF %errorlevel%==1 GOTO INSTALLWMF
IF %errorlevel%==0 GOTO EXIT

:INSTALLWMF
Set RegQry=HKLM\Hardware\Description\System\CentralProcessor\0
REG.exe Query %RegQry% > checkOS.txt
Find /i "x86" < CheckOS.txt > StringCheck.txt
If %ERRORLEVEL% == 0 (
    expand -f:* "\\192.168.223.201\install$\Updates\WindowsManagmentFramework\wmf4\Windows6.1-KB2819745-x86-MultiPkg.msu" %temp%
    pkgmgr.exe /n:%temp%\Windows6.1-2819745-x86.xml /quiet /norestart
) ELSE (
    expand -f:* "\\192.168.223.201\install$\Updates\WindowsManagmentFramework\wmf4\Windows6.1-KB2819745-x64-MultiPkg.msu" %temp%
    pkgmgr.exe /n:%temp%\Windows6.1-2819745-x64.xml /quiet /norestart
)

:EXIT
Exit

Сценарии укзываются в групповой политике в разделе "Конфигурация компьютера" -> "Конфигурация Windows" -> "Сценарии (запуск/завершение)" -> "Завершение работы". В соответствующем порядке.

После установки WMF 4 слетает конфигурация PSSessionConfiguration, нужно заново включить удаленный доступ:

Enable-PSRemoting -SkipNetworkProfileCheck -Force

#Если не помогло тогда перерегестрируем конфигурацию:

Get-PSSessionConfiguration -Name Microsoft.PowerShell | Unregister-PSSessionConfiguration -Force
Register-PSSessionConfiguration -Name Microsoft.PowerShell -Force
Enable-PSRemoting -SkipNetworkProfileCheck -Force

Пришлось добавить стартовый powershell скрипт для включения PSRemoting, состоящий из выше приведенной строки.

Пример ошибки:

PS C:\> Enter-PSSession C029
Enter-PSSession : Сбой подключения к удаленному серверу C029. Сообщение об ошибке: Службе WS-Management не удается обра
ботать запрос. Не удается найти конфигурацию сеанса Microsoft.PowerShell в WSMan: диск в компьютере C029. Дополнительны
е сведения см. в разделе справки, "about_Remote_Troubleshooting".
строка:1 знак:1
+ Enter-PSSession C029
+ ~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidArgument: (C029:String) [Enter-PSSession], PSRemotingTransportException
    + FullyQualifiedErrorId : CreateRemoteRunspaceFailed

Политики для настройка удаленного доступа (PSRemoting) в GPO:

- Политики

    - Конфигурация Windows
        - Параметры безопасности
            - Брандмауэр Windows в режиме повышенной безопасности
                - Правила для входящих подключений

                    Удаленное управление Windows (HTTP - входящий трафик) Правило входящего трафика для удаленного управления Windows через WS-Management. [TCP 5985]

            - Системные службы

                Служба удаленного управления Windows (WS-Management) (Режим запуска: Автоматически)

    - Административные шаблоны
        - Компоненты Windows
            - Удаленное управление Windows
                - Служба удаленного управления Windows

                    Разрешить удаленное администрирование сервера средствами WinRM (Включено)

                        Фильтр IPv4: *
                        Фильтр IPv6: *
Скрипт показывающий установленные версии .NET Framework:
```powershell


<#

Script Name : Get-NetFrameworkVersion.ps1
Description : This script reports the various .NET Framework versions installed on the local or a remote computer.
Author      : Martin Schvartzman
Last Update : Aug-2016
Keywords    : NETFX, Registry
Reference   : https://msdn.microsoft.com/en-us/library/hh925568

#>

param($ComputerName = $env:COMPUTERNAME)

$dotNetRegistry  = 'SOFTWARE\Microsoft\NET Framework Setup\NDP'
$dotNet4Registry = 'SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Full'
$dotNet4Builds = @{
    30319  =  '.NET Framework 4.0'
    378389 = '.NET Framework 4.5'
    378675 = '.NET Framework 4.5.1 (8.1/2012R2)'
    378758 = '.NET Framework 4.5.1 (8/7 SP1/Vista SP2)'
    379893 = '.NET Framework 4.5.2'
    380042 = '.NET Framework 4.5 and later with KB3168275 rollup'
    393295 = '.NET Framework 4.6 (Windows 10)'
    393297 = '.NET Framework 4.6 (NON Windows 10)'
    394254 = '.NET Framework 4.6.1 (Windows 10)'
    394271 = '.NET Framework 4.6.1 (NON Windows 10)'
    394802 = '.NET Framework 4.6.2 (Windows 10 Anniversary Update)'
    394806 = '.NET Framework 4.6.2 (NON Windows 10)'
    460798 = '.NET Framework 4.6.2 (Windows 10 Creators Update)'
    460805 = '.NET Framework 4.7 (NON Windows 10)'
    461308 = '.NET Framework 4.7 (Windows 10 Fall Creators Update)'
    461310 = '.NET Framework 4.7.1 (NON Windows 10)'
}

foreach($Computer in $ComputerName) {

    if($regKey = [Microsoft.Win32.RegistryKey]::OpenRemoteBaseKey('LocalMachine', $Computer)) {

        if ($netRegKey = $regKey.OpenSubKey("$dotNetRegistry")) {
            foreach ($versionKeyName in $netRegKey.GetSubKeyNames()) {
                if ($versionKeyName -match '^v[123]') {
                    $versionKey = $netRegKey.OpenSubKey($versionKeyName)
                    $version = [version]($versionKey.GetValue('Version', ''))
                    New-Object -TypeName PSObject -Property @{
                        ComputerName = $Computer
                        NetFXBuild = $version.Build
                        NetFXVersion = '.NET Framework ' + $version.Major + '.' + $version.Minor
                    } | Select-Object ComputerName, NetFXVersion, NetFXBuild
                }
            }
        }

        if ($net4RegKey = $regKey.OpenSubKey("$dotNet4Registry")) {
            if(-not ($net4Release = $net4RegKey.GetValue('Release'))) {
                $net4Release = 30319
            }
            New-Object -TypeName PSObject -Property @{
                ComputerName = $Computer
                NetFXBuild = $net4Release
                NetFXVersion = $dotNet4Builds[$net4Release]
            } | Select-Object ComputerName, NetFXVersion, NetFXBuild
        }
    }
}


```

Проверка установленной версии WMF на удаленном компьютере:

PS C:\> $ComputerName = "c016.mkucou.local"
PS C:\> Invoke-Command -Computername $ComputerName -Scriptblock {$PSVersionTable.psversion}

Major  Minor  Build  Revision PSComputerName
-----  -----  -----  -------- --------------
4      0      -1     -1       c016.mkucou.local

Ссылки