Как найти или установить недостающие команды в 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 модулей, в основном типа "манифест".