Как найти или установить недостающие команды в PowerShell Core (pwsh)?

Я использую несколько версий PowerShell, но только 2 могут найти все стандартные команды (или это командлеты?).

Первоначальная установка - Windows PowerShell v5.1, но у меня также есть PowerShell Core (pwsh.exe) v6.1.1 установлен.

Проблема в том, что я пытаюсь запустить некоторые вещи, связанные с брандмауэром, в PowerShell Core, но Get-NetFirewallProfile команда не может быть найдена.

Get-NetFirewallProfile -Profile Domain, Public, Private | Select-Object Name, Enabled

Тем не менее, он прекрасно работает в Windows PowerShell, так как необходимый модуль NetSecurity доступно там.

Как заставить PowerShell Core либо найти уже существующие модули, либо установить их заново?
(Они даже совместимы? - Если нет, то как их можно обновить?)


Дополнительная информация

В PowerShell Core v6.1 у меня есть только:

$ Get-Module -ListAvailable

    Directory: C:\Program Files\PowerShell\Modules

ModuleType Version    Name                                PSEdition ExportedCommands
---------- -------    ----                                --------- ----------------
Script     1.8.1      PSVersion                           Desk      {Get-PSVersion, Update-P
Binary     2.1.0.1    PSWindowsUpdate                     Desk      {Add-WUServiceManager, E

    Directory: C:\program files\powershell\6\Modules

ModuleType Version    Name                                PSEdition ExportedCommands
---------- -------    ----                                --------- ----------------
Manifest   6.1.0.0    CimCmdlets                          Core      {Get-CimAssociatedInstan
Manifest   1.2.2.0    Microsoft.PowerShell.Archive        Desk      {Compress-Archive, Expan
Manifest   6.1.0.0    Microsoft.PowerShell.Diagnostics    Core      {Get-WinEvent, New-WinEv
Manifest   6.1.0.0    Microsoft.PowerShell.Host           Core      {Start-Transcript, Stop-
Manifest   6.1.0.0    Microsoft.PowerShell.Management     Core      {Add-Content, Clear-Cont
Manifest   6.1.0.0    Microsoft.PowerShell.Security       Core      {Get-Acl, Set-Acl, Get-P
Manifest   6.1.0.0    Microsoft.PowerShell.Utility        Core      {Format-List, Format-Cus
Manifest   6.1.0.0    Microsoft.WSMan.Management          Core      {Disable-WSManCredSSP, E
Script     1.1.7.2    PackageManagement                   Desk      {Find-Package, Get-Packa
Script     1.6.7      PowerShellGet                       Desk      {Find-Command, Find-DSCR
Script     0.0        PSDesiredStateConfiguration         Desk      {GetSyntax, Write-MetaCo
Script     6.1.0.0    PSDiagnostics                       Core      {Disable-PSTrace, Disabl
Script     2.0.0      PSReadLine                          Desk      {Get-PSReadLineKeyHandle
Binary     1.1.2      ThreadJob                           Desk      Start-ThreadJob

тогда как в Windows PowerShell v5.1 у меня есть:

$ Get-Module -ListAvailable *

    Directory: C:\Program Files\WindowsPowerShell\Modules

ModuleType Version    Name                                ExportedCommands
---------- -------    ----                                ----------------
Binary     1.0.0.1    PackageManagement                   {Find-Package, Get
Script     1.0.0.1    PowerShellGet                       {Install-Module, F
Script     1.8.1      PSVersion                           {Get-PSVersion, Up

    Directory: C:\Windows\system32\WindowsPowerShell\v1.0\Modules

ModuleType Version    Name                                ExportedCommands
---------- -------    ----                                ----------------
Manifest   1.0.0.0    AppBackgroundTask                   {Disable-AppBackgr
Manifest   2.0.0.0    Appx                                {Add-AppxPackage,
Manifest   1.0.0.0    BitLocker                           {Unlock-BitLocker,
Manifest   1.0.0.0    BitsTransfer                        {Add-BitsFile, Com
Manifest   1.0.0.0    CimCmdlets                          {Get-CimAssociated
Manifest   1.0        Defender                            {Get-MpPreference,
Manifest   1.0.0.0    DirectAccessClientComponents        {Disable-DAManualE
Script     3.0        Dism                                {Add-AppxProvision
Manifest   1.0.0.0    DnsClient                           {Resolve-DnsName,
Manifest   2.0.0.0    International                       {Get-WinDefaultInp
Manifest   1.0.0.0    iSCSI                               {Get-IscsiTargetPo
Script     1.0.0.0    ISE                                 {New-IseSnippet, I
Manifest   1.0.0.0    Kds                                 {Add-KdsRootKey, G
Manifest   1.0.1.0    Microsoft.PowerShell.Archive        {Compress-Archive,
Manifest   3.0.0.0    Microsoft.PowerShell.Diagnostics    {Get-WinEvent, Get
Manifest   3.0.0.0    Microsoft.PowerShell.Host           {Start-Transcript,
Manifest   1.0.0.0    Microsoft.PowerShell.LocalAccounts  {Add-LocalGroupMem
Manifest   3.1.0.0    Microsoft.PowerShell.Management     {Add-Content, Clea
Script     1.0        Microsoft.PowerShell.ODataUtils     Export-ODataEndpoi
Manifest   3.0.0.0    Microsoft.PowerShell.Security       {Get-Acl, Set-Acl,
Manifest   3.1.0.0    Microsoft.PowerShell.Utility        {Format-List, Form
Manifest   3.0.0.0    Microsoft.WSMan.Management          {Disable-WSManCred
Manifest   1.0        MMAgent                             {Disable-MMAgent,
Manifest   1.0.0.0    MsDtc                               {New-DtcDiagnostic
Manifest   2.0.0.0    NetAdapter                          {Disable-NetAdapte
Manifest   1.0.0.0    NetConnection                       {Get-NetConnection
Manifest   1.0.0.0    NetEventPacketCapture               {New-NetEventSessi
Manifest   2.0.0.0    NetLbfo                             {Add-NetLbfoTeamMe
Manifest   1.0.0.0    NetNat                              {Get-NetNat, Get-N
Manifest   2.0.0.0    NetQos                              {Get-NetQosPolicy,
Manifest   2.0.0.0    NetSecurity                         {Get-DAPolicyChang
Manifest   1.0.0.0    NetSwitchTeam                       {New-NetSwitchTeam
Manifest   1.0.0.0    NetTCPIP                            {Get-NetIPAddress,
Manifest   1.0.0.0    NetworkConnectivityStatus           {Get-DAConnectionS
Manifest   1.0.0.0    NetworkSwitchManager                {Disable-NetworkSw
Manifest   1.0.0.0    NetworkTransition                   {Add-NetIPHttpsCer
Manifest   1.0.0.0    PcsvDevice                          {Get-PcsvDevice, S
Manifest   1.0.0.0    PKI                                 {Add-CertificateEn
Manifest   1.1        PrintManagement                     {Add-Printer, Add-
Manifest   1.1        PSDesiredStateConfiguration         {Set-DscLocalConfi
Script     1.0.0.0    PSDiagnostics                       {Disable-PSTrace,
Binary     1.1.0.0    PSScheduledJob                      {New-JobTrigger, A
Manifest   1.5.2.6    PSWindowsUpdate                     {Add-WUOfflineSync
Manifest   2.0.0.0    PSWorkflow                          {New-PSWorkflowExe
Manifest   1.0.0.0    PSWorkflowUtility                   Invoke-AsWorkflow
Manifest   1.0.0.0    ScheduledTasks                      {Get-ScheduledTask
Manifest   2.0.0.0    SecureBoot                          {Confirm-SecureBoo
Manifest   2.0.0.0    SmbShare                            {Get-SmbShare, Rem
Manifest   2.0.0.0    SmbWitness                          {Get-SmbWitnessCli
Manifest   1.0.0.0    StartScreen                         {Export-StartLayou
Manifest   2.0.0.0    Storage                             {Add-InitiatorIdTo
Manifest   2.0.0.0    TLS                                 {New-TlsSessionTic
Manifest   1.0.0.0    TroubleshootingPack                 {Get-Troubleshooti
Manifest   2.0.0.0    TrustedPlatformModule               {Get-Tpm, Initiali
Manifest   2.0.0.0    VpnClient                           {Add-VpnConnection
Manifest   1.0.0.0    Wdac                                {Get-OdbcDriver, S
Manifest   1.0.0.0    WindowsDeveloperLicense             {Get-WindowsDevelo
Script     1.0        WindowsErrorReporting               {Enable-WindowsErr
Manifest   1.0.0.0    WindowsSearch                       {Get-WindowsSearch

И на всякий случай, если кому-то интересно, все доступные команды в модуле могут быть перечислены с помощью:
(Get-Module -ListAvailable NetSecurity).ExportedCommands

ОБНОВЛЕНИЕ:

Мне удалось найти правильные модули, используя команду / комдлет, используя это:

(Get-Module -ListAvailable -SkipEditionCheck *).ExportedCommands.Values |select CommandType,Source,Version,Name | sort Name

(В качестве альтернативы заменить ExportedCommands с ExportedCmdlets.)

2 ответа

Решение

NetSecurity не поддерживается в Core. Если вы работаете в ОС Windows, вы можете использовать Param -SkipEditionCheck

Import-Module NetSecurity -SkipEditionCheck

Вы можете использовать тот же параметр на Get-Module

Get-Module NetSecurity -ListAvailable -SkipEditionCheck

Полезный ответ ArcSet работает в этом случае, но важно отметить, что -SkipEditionCheck явно обходит собственное [отсутствие] декларации данного модуля о том, с какой версией PowerShell он работает: (Desktop (Windows PowerShell) и / или Core (PowerShell Core)).

Вы не можете ожидать, что это сработает.

На момент написания этой статьи старые модули, созданные в то время, когда существовал только Windows PowerShell, находятся в процессе оценки на совместимость с PowerShell Core и, если они есть, будут помечены как таковые с помощью нового CompatiblePSEditions запись модуля-манифеста.

Старые модули, которые - неизменно - были созданы только для Windows PowerShell и не имеют CompatiblePSEditions объявление (которое заставляет PowerShell Core игнорировать их по умолчанию) ** также может работать в PowerShell Core, но только если они реализованы:

  • используя только код PowerShell (*.psm1 файлы, содержащие расширенные функции, действующие как командлеты)
  • и / или через CDXML, как в случае NetSecurity модуль.

Примечательно, что это исключает модули, которые содержат командлеты, которые неизменно входят в состав (неизменно скомпилированных) сборок.NET и / или содержат вспомогательные библиотеки DLL (сборки).

Если вы не уверены в совместимости данного более старого модуля (который не указывает (пока), с какими версиями он совместим), вы можете использовать метод проб и ошибок с -SkipEditionCheck (хотя проверка реализации модуля - использует ли он.NET-сборки? - заранее даст вам хороший смысл).
Однако, учитывая, что модули, включающие сборки.NET, в целом более типичны, я не ожидаю, что многие старые модули будут совместимы.

И наоборот, если модуль имеет CompatiblePSEditions запись и указывает, что работающая редакция не поддерживается, можно с уверенностью предположить, что она не будет работать.

PowerShellModuleCoverage GitHub репозиторий предназначен для отслеживания проблем с модулями, входящими в комплект поставки, после того, как они были помечены как перекрестные и, возможно, изменены с этой целью, что на данный момент является непрерывным процессом.
(Для сторонних модулей их сопровождающие могут обновить их таким образом.)

Однако плоды этих усилий вы увидите только в том случае, если используете самую последнюю версию Windows 10 (канал обновления) и обновления.

В более старых версиях, в том числе вплоть до Windows 7, вы все еще можете использовать -SkipEditionCheck загрузить старые модули, которые вы протестировали и обнаружили, что они неявно совместимы с PowerShell Core.


Если / когда вы знаете, что данный модуль не работает в PowerShell Core:

У вас есть два варианта:

  • Использовать WindowsCompatibilityмодуль, который использует неявное удаленное взаимодействие для обеспечения доступности командлетов Windows PowerShell только в PowerShell Core, в простейшем случае - для связи с Windows PowerShell на том же компьютере, но вы даже можете настроить таргетинг на компьютер удаленно (в этом случае команды будут выполняться там),
    Обратите внимание, что хотя неявное удаленное взаимодействие обычно работает как положено, оно имеет свои ограничения и медленнее, чем внутрипроцессное выполнение.

  • Ad-hoc: вызов Windows PowerShell через CLI, powershell.exe, передавая произвольную команду через блок скрипта ({ ... }) - см. пример ниже.
    Как и неявное удаленное взаимодействие через модуль совместимости, оно использует инфраструктуру удаленного взаимодействия и имеет те же ограничения и предостережения.
    Кроме того, поскольку для каждого вызова создается новый процесс Windows PowerShell, вам приходится нести затраты на его запуск и импорт интересующего модуля каждый раз; если вам нужно запустить несколько команд, лучше их объединить.

# Call the Windows PowerShell CLI from PowerShell Core, using a script block.
# (Add -noprofile to suppress $PROFILE loading.)
powershell { Get-NetFirewallProfile -Profile Domain, Public, Private | Select-Object Name, Enabled }

Похоже, что начиная с Windows 10 версии 1809, некоторые из этих недостающих команд вернулись в PS 6, например "get-netadapter" и "get-netfirewallrule". Фактически доступно еще 47 модулей, в основном типа "манифест".

Другие вопросы по тегам