Powershell: FullCLR 模块与 PSCore6 不兼容

创建于 2017-06-21  ·  61评论  ·  资料来源: PowerShell/PowerShell

随着对符合 .Net Std 2.0 的 CoreCLR 2.0 的更改以及启用在 GAC 中搜索程序集的更新,我们需要验证 PSCore6 是 Windows PowerShell 5.x 的可行替代品。 请列出您尝试过但在此处不起作用的模块。 为您最关心的模块投票 👍 以帮助我们优先考虑如何与合作伙伴合作以启用支持或让他们移植到目标 .Net Std 2.0。

https://github.com/PowerShell/PowerShell/issues/4056得到解决之前,您需要手动添加 Windows PowerShell PSModulePath 以发现这些模块:

PS > $env:psmodulepath += ";${env:userprofile}\Documents\WindowsPowerShell\Modules;${env:programfiles}\WindowsPowerShell\Modules;${env:windir}\system32\WindowsPowerShell\v1.0\Modules\"

PSSnapins:

  • 活动目录

由于添加类型而失败

  • 远程桌面

基本测试工作:

  • 超V
  • 安全启动

需要移植:

  • ODataUtils

没有把握:

  • WindowsUpdate(我在 Windows PowerShell 中也收到关于 symsrv.dll 的错误)
Area-Cmdlets Issue-Meta Resolution-External

最有用的评论

我们将不得不与该团队讨论重写他们的 cmdlet...

所有61条评论

工作流不是我们计划支持的东西。 相反,我们致力于改进 PowerShell 脚本中的并发/并行执行体验,我们认为这是人们使用工作流的主要原因。 如果还有其他原因,请告诉我。

ConvertFrom-String 依赖于 Microsoft Research 的技术,该技术目前不打算开源。

不过,我很欣赏这些反馈。

Workflow 和 ConvertFrom-String 是独立的,它们不计划出现在 PSCore6 中的原因各不相同。 我同意 ConvertFrom-String 可以很好地对抗 Linux 上现有的基于文本的本机实用程序。 也许我们可以创建一个新的 cmdlet,它具有与 ConvertFrom-String 类似但更简单的功能。

ConvertFrom-string 或类似的功能将非常有用

我在安装了 RSAT 的 Windows 10 ver 16215 上检查了 Windows PowerShell 模块负载。
附件中的脚本和结果(包括错误)。
4062a.txt
4062b.txt - 来自 PowerShell Core 的完整列表模块。

简而言之。
核心模块总数 = 12。
Windows 和核心模块总数 = 120。
Windows 模块总数 = 108。(在 Windows Powershell Get-Module -ListAvailable 中)。count = 109
PowerShell Core 启动后 - 加载了 3 个模块。
尝试加载所有模块后 - 加载了 71 个模块。

因此加载了108 个Windows 模块中的59
$error.count = 79

@iSazonov感谢您获得这些结果。

  • 一旦我们迁移到具有此修复的较新 dotnet 核心,基于 CDXML 的 cmdlet 故障将得到
  • 大多数错误是由于 DSC 的别名冲突造成的。
  • RemoteDesktop 模块正在调用失败的 Add-Type,我们应该调查一下
  • 工作流程一预计不起作用
  • ISE one 预计不起作用
  • ODataUtils 是我团队拥有的,需要移植 cc @anmenaga

抄送@PowerShell/powershell-committee

哦,ActiveDirectory 模块是 PSSnapIn 😕 PowerShell Core 的主要消费者(系统管理员)被抛到了脑后!

我们将不得不与该团队讨论重写他们的 cmdlet...

Exchange Server 2013 EMS 粉碎了 PowerShell Core。 它也找不到 Exchange 程序集。

未加载 SCCM 2012 R2 模块 - 损坏的 .Net 依赖项且未在本地(SCCM 主目录)文件夹中找到程序集。

Sharepoint 2013 模块是 PSSnapIn。

在 MacOS 和 Linux 上:

Install-Module Docker -Scope CurrentUser -Repository DockerPS-Dev

Get-Container

无法加载文件或程序集“Docker.DotNet,版本=2.124.0.0,文化=中性,PublicKeyToken=null”。 该系统找不到指定的文件。
在行:1字符:1

  • 获取容器
  • ~~ ~~~

    • CategoryInfo : OperationStopped: (:) [], FileNotFoundException

    • FullQualifiedErrorId : System.IO.FileNotFoundException

那么我是否从上面的评论中正确地推断出 ActiveDirectory 不起作用,因为它是一个 PSSnapIn,而不是一个模块,并且这个版本不支持管理单元?

此外,虽然我可以 Import-Module -Name MSOnline,但当我尝试 Connect-MsolService 时,我收到“无法从程序集“System.Drawing”加载类型“System.Drawing.Drawing2D.InterpolationMode”的消息,然后 powershell.exe 崩溃了。

@JakeMoe是的,PowerShell Core 中不推荐使用 PSSnapIn。

System.Drawing不在 CoreFS 和 .Net Standard 2.0 中。

@iSazonov

并感谢其他所有人,让他们继续!

PS C:\Program Files\PowerShell\6.0.0-beta.4> Import-Module MSOnline
导入模块:无法从程序集“系统,版本 = 4.0.0.0”加载类型“System.Diagnostics.EventLogEntryType”,
文化=中性,PublicKeyToken=b77a5c561934e089'。

PS > Start-Process powershell -Credential (Get-Credential)

Windows PowerShell credential request
Enter your credentials.
User: domain\username
Password for user domain\username: **************

Start-Process : Unable to load DLL 'api-ms-win-security-cpwl-l1-1-0.dll': The specified module could not be found.
(Exception from HRESULT: 0x8007007E)
At line:1 char:1
+ Start-Process powershell -Credential (Get-Credential)
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (:) [Start-Process], DllNotFoundException
    + FullyQualifiedErrorId : System.DllNotFoundException,Microsoft.PowerShell.Commands.StartProcessCommand

@joeyaiello

  • Exchange - 加载,简单的 cmdlet 工作
  • Sharepoint - 加载,简单的 cmdlet 工作
  • SCCM - NullReferenceException 和崩溃:
at System.Management.MTAHelper.IsNoContextMTA()
at System.Management.MTAHelper.CreateInMTA(Type type)
...
  • Skype Server 2015 - 无法加载类型“System.Management.Automation.PSSnapIn”。

我再次检查了安装 RSAT 的 Windows 10 ver 162241上的 Windows PowerShell 模块负载。
附件中的脚本和结果(包括错误)。

4062Beta4fulllist.txt
4062Beta4ipmoall.txt - 来自 PowerShell Core 的完整列表模块。

简而言之。
核心模块总数 = 12。
Windows 和核心模块总数 = 125。
Windows 模块总数 = 113。
PowerShell Core 启动后 - 加载了 2 个模块。
尝试加载所有模块后 - 加载了 108 个模块。

因此加载了113 个Windows 模块中的96 个
$error.count = 47

使用 Beta 4 检查了我的自定义脚本之一,但它因错误中止:
catch:函数:过程:错误:使用“0”参数调用“.ctor”的无法从程序集“系统”中

打开 #4295


由@daxian-dbw 编辑:
根本原因是System.Diagnostics.PerformanceCounter目前在.NET Core不可用。 DOTNET / corefx#3906跟踪PerformanceCounter支持.NET Core ,但它打上了'将来'的里程碑,这意味着它不会在使用.NET Core 2.0
有关更多信息,请参阅 #4295。

@mi-hol 请打开新的问题。

无法让 Get-WUList 在 PSWindowsUpdate version 1.6.0.3 的6.0 core beta-4 中工作。 它在 Windows 10 桌面 PowerShell 上运行良好。

输出:

Get-WUList -MicrosoftUpdate
Test-Connection : The client cannot connect to the destination specified in the request. Verify
that the service on the destination is running and is accepting requests. Consult the logs and
documentation for the WS-Management service running on the destination, most commonly IIS or
WinRM. If the destination is the WinRM service, run the following command on the destination to
analyze and configure the WinRM service: "winrm quickconfig".
At C:\Program Files\WindowsPowerShell\Modules\PSWindowsUpdate\1.6.0.3\Get-WUList.ps1:274 char:7
+             If(Test-Connection -ComputerName $Computer -Quiet)
+                ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (:) [Test-Connection], CimException
    + FullyQualifiedErrorId : TestConnectionException,Microsoft.PowerShell.Commands.TestConnection
   Command
$PSVersionTable

Name                           Value
----                           -----
PSVersion                      6.0.0-beta
PSEdition                      Core
GitCommitId                    v6.0.0-beta.4
OS                             Microsoft Windows 10.0.15063
Platform                       Win32NT
PSCompatibleVersions           {1.0, 2.0, 3.0, 4.0...}
PSRemotingProtocolVersion      2.3
SerializationVersion           1.1.0.1
WSManStackVersion              3.0

@fdncred感谢您的报告!
我测试了 PSWindowsUpdate。

  • 您遇到了 Test-Connection 和 WS-Management 问题。 请不要在主题中讨论这个问题 - 如果您需要帮助,请打开新的问题。
  • 我们仍然不能使用 PSWindowsUpdate 因为 #3775 。

WebAdministration 和 IISAdministration 都不会在 PS Core 中运行,因为它们希望 GAC 的程序集可用。 使用 DSC 可能是更好的选择,但由于缺少Invoke-DSCResourceStart-DSCConfiguration在核心中应用配置很尴尬。 见#4457。

有关问题的任何更新,无法在基于 Linux 的操作系统上导入 MsOnline 模块。 第4269章

来自 PowerShell 库的 Invoke-MySqlQuery 不起作用。 当我尝试在 Windows 10 上的 Beta 5 上使用它时出现错误。我对 .Net Standard 的理解是它有可能在 Windows 上运行(当然不是在 Linux/Mac 上)。 该程序集确实已加载,只是其中最常见的方法之一出错。
https://www.powershellgallery.com/packages/Invoke-MySqlQuery/1.0.0/DisplayScript

Install-Script -Name Invoke-MySqlQuery

. Invoke-MySqlQuery.ps1
$MyCred = Get-Credential
Invoke-MySQLQuery -ComputerName MyServer -Database mysql -Query "select @@hostname" -Credential $MyCred


Exception calling "Open" with "0" argument(s): "The type initializer for 'MySql.Data.MySqlClient.Replication.ReplicationManager' threw an exception."

我还有一个内部模块,它在 Conn.Open() 上也有同样的问题。 我们使用内部模块连接到数百个 MySql 服务器和 AWS Aurora。

Connector/Net 6.9.9 和 Connector/Net 8.0.8(安装在不同的计算机上)都会发生这种情况。 它可以在以前版本的 PowerShell 中正常工作,没有任何问题。

@FireInWinter感谢您的报告! 请用重现问题的步骤打开新问题。

我们需要能够呈现表格。 理想情况下,通过 System.Drawing,但如果需要,我可以将一些转换为 XAML。 但是,两者都不起作用,那么 Powershell 死掉的任何图形? 如果我们不能使用某种形式,我们永远不会切换到 PowershellCore。 不,我们不会使用 C# :P

另外,可以肯定地说 Get-WmiObject 已死吗? 我希望 Get-WmiObject 和 Get-CimInstance 之间的语法是相同的,但它们不是,所以如果您仍然有任何 PS 2.0,您将被迫编码两次。

@agressiv我们正在对https://github.com/PowerShell/PowerShell/issues/3957进行一些调查以启用 GUI

Get-WmiObject被视为已弃用。 @joeyaiello刚刚发布了一篇关于我们正式弃用 PSv2的博客。 一段时间以来,我们一直建议切换到 CIM cmdlet,而不是使用 WMI cmdlet,WMI cmdlet 可以通过 WSMan(OpenPegasus、OMI、Dell iDrac、HP iLO 等)与 CIM 的非 Windows 实现互操作。

我们仍然有 2.0 的机器,因为微软在许多核心产品上支持 WMF 4.0 的速度很慢,我们的迁移已经结束。 由于我们现在被要求部署 5.1(当然,这与包括 Skype 和 Exchange 服务器在内的几乎所有内容都不兼容),我们将不得不再次通过以查看剩下的人

是否有像 Get-WmiObject 这样的 Cmdlet 列表将被删除,我们可以参考?

WinPE 的目标平台是什么? 它也会转移到核心吗? 我们也在那里使用 Windows 窗体。

我转储了 6.0 测试版中的所有 cmdlet,并简单地做了一个比较对象。 这是给我们的:

  • 所有 EventLog cmdlet。 我们广泛使用这些。
  • 测试计算机安全通道。
  • 添加-PSSnapin。 我不想使用它,但显然很多模块都有懒惰的作者。 (例如 Vmware、WSUS、MDT、Citrix、SCOM、Dell)。 也许还有其他方法可以加载这些模块中的一些,但这些 OEM 实际是在他们的代码中使用 Add-PSSnapin 的——所以要么我们正在修改他们的代码,希望它能正常工作,要么他们最终改变它。 当然,他们不应该使用 Add-PSSnapin 8 年了,但有些事情永远不会改变。

@agressiv VMware PowerCLI 现在是一个可以从 PowerShell Gallery 安装的模块,我几乎可以肯定他们已经支持 PowerShell Core(不过我需要仔细检查一下)。 不过,正如您所指出的,还有其他 PSSnapin 落后者。

@agressiv对于 PSCore6,我们特意取消了对 PSSnapins 的支持。 但是,VMWare 有一个用于 PSCore6

@aggresiv :在 UI 方面,我们绝对不会完全放弃 GUI 工作,我们只是不确定我们的前进方向。 如果您访问https://github.com/PowerShell/Phosphor ,您可以查看我们正在运行的实验,以尝试生成基于 Web 的 UI(这避免了围绕不同“原生”UI 的许多问题框架,不过如果有人想为 PowerShell 制作一些 Qt 绑定,那也会让我很高兴)。

至于Get-WmiObject :你说得对,我们没有任何计划将其带回来。 在我看来, Get-CimInstance极大地改进了作为Get-WmiObject的语法(最初制作它的部分原因),虽然我理解双重编码的痛苦,但我们也只是已弃用 Windows PowerShell 2.0 ,因此我们将不会针对向后兼容 2.0 进行优化。 :\

我的用例:

  • 导入 Active Directory PowerShell 模块。
  • 导入 Azure Active Directory PowerShell 模块。
  • 建立到 Exchange 2010 - 2016 服务器的远程 PowerShell 会话并导入会话。
  • 建立到 Exchange Online 的远程 PowerShell 会话并导入会话。
  • 与 Lync/Skype 服务器建立远程 PowerShell 会话并导入会话,

如果您能让所有这些及其 cmdlet 在 Windows、Linux 和 MacOS 下运行,您将被誉为英雄。

我认为 AD 模块是最难的,因为它目前是 RSAT 和管理单元的一部分,如之前的评论中所述。 但是,嘿,AD 团队必须与时俱进!

如果所有其他方法都失败,则远程 PowerShell 会话到域控制器或具有这些模块的另一台 Windows 计算机,然后导入会话。

@KeeperB5通过导入 PSSession 隐式远程处理应该只适用于 PSCore6(无论如何,Windows,还没有尝试使用 Linux/MacOS,但应该可以工作)

导入模块 AzureAD
连接-AzureAD

未处理的异常:System.TypeLoadException:无法从程序集“System.Drawing,Version=4.0.0.0,Culture=neutral,PublicKeyToken=b03f5f7f11d50a3a”加载类型“System.Drawing.Icon”。
在 System.Windows.Forms.Form.Dispose(Boolean disposing)
在 System.ComponentModel.Component.Finalize()
connect-azuread :发生一个或多个错误。 (无法从程序集“System.Drawing,Version=4.0.0.0,Culture=neutral,PublicKeyToken=b03f5f7f11d50a3a”加载类型“System.Drawing.Drawing2D.InterpolationMode”。):无法加载类型“S”
ystem.Drawing.Drawing2D.InterpolationMode' 来自程序集“System.Drawing,版本=4.0.0.0,Culture=neutral,PublicKeyToken=b03f5f7f11d50a3a”。
在行:1字符:1
连接-azuread
CategoryInfo : AuthenticationError: (:) [Connect-AzureAD], AadAuthenticationFailedException
FullQualifiedErrorId : Connect-AzureAD,Microsoft.Open.Azure.AD.CommonLibrary.ConnectAzureAD

此外,整个应用程序崩溃并显示消息“powershell.exe 已停止工作”

将此从 6.0.0 里程碑移出,因为 6.0.0 没有计划的额外工作

@SteveL-MSFT 如果可能的话,您能否澄清一下 - MSFT 计划/时间表如何为 PowerShell Core 6.0 采用其产品模块?

许多产品团队在我们获得 6.0.0 最终版本之前不会开始任何验证工作,因此重点是完成这项工作并与产品团队接触以开始验证。 不幸的是,这不会很快发生,因此我目前无法提供时间表。

基于此问题,是否有计划将 Active Directory/Exchange 模块移植到 PowerShell v6? 这些工具是否仅适用于 Windows(因为 System.DirectoryServices.Protocols 目前仅在 Windows 上运行)?

@j3vans CoreFX 的 API 仍然非常有限,我不希望 MSFT 团队可以移植这些模块。 我们可以通过远程处理来使用 Windows 模块。

安装模块 SqlServer 不会安装在 Mac 上。

```复现步骤:
安装模块 SqlServer

Errors out with: 
PackageManagement\Install-Package : Unable to load DLL 'api-ms-win-core-sysinfo-l1-1-0.dll': The specified module or one of its dependencies could not be found.                (Exception from HRESULT: 0x8007007E)                                                                                                                                          At /usr/local/microsoft/powershell/6.0.0-rc.2/Modules/PowerShellGet/1.6.0/PSModule.psm1:2057 char:21                                                                           + ...          $null = PackageManagement\Install-Package <strong i="8">@PSBoundParameters</strong>                                                                                                    +                      ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo          : NotSpecified: (Microsoft.Power....InstallPackage:InstallPackage) [Install-Package], Exception
+ FullyQualifiedErrorId : System.DllNotFoundException,Microsoft.PowerShell.Commands.TestModuleManifestCommand,Microsoft.PowerShell.PackageManagement.Cmdlets.InstallPackage

```powershell
> $PSVersionTable
Name                           Value
----                           -----
PSVersion                      6.0.0-rc.2
PSEdition                      Core
GitCommitId                    v6.0.0-rc.2
OS                             Darwin 16.7.0 Darwin Kernel Version 16.7.0: Wed Oct  4 00:17:00 PDT 2017; root:xnu-3789.71.6~1/RELEASE_X86_64
Platform                       Unix
PSCompatibleVersions           {1.0, 2.0, 3.0, 4.0...}
PSRemotingProtocolVersion      2.3
SerializationVersion           1.1.0.1
WSManStackVersion              3.0

关于“Install-Module SQLServer” - 此模块仅适用于 Windows 系统。 目前还没有 Linux/Mac SQLPS 或 SQLServer 模块。

现在,如果您想尝试在非 Windows 系统上构建自己的 SQL Server PowerShell 命令,您可以安装将在 Linux 中运行的“Microsoft.SqlServer.SqlManagementObjects”。

有关更多信息,请参阅我的博客文章: http :

此问题将由https://github.com/PowerShell/WindowsPowerShellCompatibilityPack解决,请在此处打开特定模块的问题

是否有任何正在进行的工作来为 PS 6 提供一个功能性的 Active Directory 模块?

@apetitjean

您可能想在上面的@SteveL-MSFT 链接上发布问题。 这样就可以正确跟踪它。
:)

MVP 峰会见!

谢谢@MaximoTrinidad。 在这里发帖正是我的意图。 我希望@SteveL-MSFT 会在这里看到我的问题。

确实很快见! :)

@apetitjean计划是能够通过 Windows PowerShell 兼容包支持 Active Directory 模块。 我们很可能会使用隐式远程处理,也许还会使用 JEA。

@SteveL-MSFT Windows PowerShell 兼容包仅适用于 Windows,对吗? 我认为 Active Directory 模块仅在 Windows 上工作是不可接受的。 如果计划暂时仅在 Windows 上支持 AD,直到所需的 .NET Core API 成为 x-plat,那么我可以接受。 但是,AD 不仅仅用于 Windows 环境,而且使用 PowerShell 在 Linux(和 macOS)中构建自动化的能力不应该需要直接的 .NET 操作或调用可以在 Linux 上支持 AD 的其他 shell/脚本语言。

根据我的理解,Active Directory 模块不在 PowerShell 中
团队的板块,应该完全重写以使用 PowerShell
核。
我认为史蒂夫所说的是一种解决方法,它应该有效,直到
下一个 AD 模块版本。

当前的 AD 模块具有 PSSnapin 要求,无论如何都不会在 PS Core 中工作,除非我们在 Windows PowerShell 兼容包中添加一些 PSSnapin 垫片我不知道...... AD 模块的唯一方法是重写。 这就是为什么我对@SteveL-MSFT 说 AD 模块(即使它是操作系统团队的责任,而不是 PowerShell 团队的责任)将受 Windows PowerShell 兼容性包的支持感到不安。 已经迫切需要重构核心模块,如果它的未来在 Windows PowerShell 兼容包中,那么这是错误的方向。

同意@markekraus 的意见。 我真的不赞成使用 Windows PowerShell 兼容包,我认为“......它应该让它们分开!!”。

但这是我的看法!
:)

我对 Windows PowerShell Compatibility Pack 的理解是它包含了永远不会被移植的所有内容。

Windows PowerShell 兼容包的目的是暂时帮助现有的 Windows PowerShell 用户迁移到 PSCore6。 长期计划是让模块在 PSCore6 上本地运行以及跨平台。 一些团队可能决定他们永远不会移植到 PSCore6,或者他们会,但不会投资使其跨平台兼容。 帮助他们做出正确决策的最大影响因素是客户反馈(而不是我们代表客户的 PowerShell 团队)。

如果我的脚本依赖于 .Net 框架 dll,我应该通过 nuget 查找这些依赖项的 .Net 核心版本,然后尝试将脚本移植到 PS6? 这些依赖项没有“包装器”,对吗?

@dudeNumber4这取决于。 如果它是 PSCore6 已经包含的程序集(并且我们包含了很多),那么除非您通过路径引用特定的 dll,否则您不需要进行任何更改。 例如,如果您之前依赖 System.DirectoryServices.AccountManagement.dll 使用 Add-Type 加载,如果您没有指定路径,它应该可以正常工作。

@dudeNumber4这取决于。 如果它是 PSCore6 已经包含的程序集(并且我们包含了很多),那么除非您通过路径引用特定的 dll,否则您不需要进行任何更改。 例如,如果您之前依赖 System.DirectoryServices.AccountManagement.dll 使用 Add-Type 加载,如果您没有指定路径,它应该可以正常工作。

好的,刚刚尝试了New-Object System.Data.OleDb.OleDbConnection 。 _找不到类型_。 在 nuget 上,我看到某种声称支持 .Net Standard 2.0 的端口。 要移植脚本,我必须添加该库的 nuget 还原,对吗?

@dudeNumber4我们不将该程序集作为 PSCore6 本身的一部分包含在内,因此要使用它,您应该能够在运行时使用Install-Package下载该 nupkg,或者手动下载该程序集,并将该程序集与您的脚本。

WebAdministration - 是 xWebAdministration 的替代品,还是 WebAdministration 会被移植?

@IanKemp该模块归 IIS 团队所有,所以我不知道他们的计划。 但是,上次我的团队查看该模块时,一些必要的 .Net Framework 命名空间在 .Net Core 中不可用,因此在此之前,除非他们重写它,否则它将无法工作

此页面是否有帮助?
0 / 5 - 0 等级