Как найти или установить недостающие команды в PowerShell Core (pwsh)? - PullRequest
0 голосов
/ 04 февраля 2019

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

Исходная установка 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 либо найти уже существующие модули, либо установить их заново?
(совместимы ли они? - Если нет, как их можно обновить?)


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

In 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.)

Ответы [ 3 ]

0 голосов
/ 04 февраля 2019

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

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

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

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

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

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

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

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

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

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

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


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

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

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

    • Обратите внимание, что хотя неявное удаленное взаимодействие может работать должным образом, оно имеет свои ограничения и на медленнее , чем внутрипроцессное выполнение.
    • Заметным ограничением является участие сериализации и десериализации, что означает, что десериализовано только ограниченное количество типов с верностью типов, тогда как все остальные десериализованы как аппроксимации исходного типа со статическимproperties.
  • 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 }
0 голосов
/ 15 августа 2019

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

0 голосов
/ 04 февраля 2019

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

Import-Module NetSecurity -SkipEditionCheck

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

Get-Module NetSecurity -ListAvailable -SkipEditionCheck
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...