3

尝试使用 PowerShell 连接到 Microsoft Power Apps 时间歇性地收到错误消息。有没有人对需要更新哪些内容以使[Add-PowerAppsAccount][1]工作可靠有什么建议?您可以在下面看到导致此错误的所有版本号和命令过程。

间歇性我的意思是在特定的 PowerShell 会话中它会工作或不工作,我还没有发现在活动会话中它会工作和不工作的情况,它在会话中保持一致(或者至少这就是到目前为止我已经经历过。)我发现它在新会话中何时起作用或不起作用时没有一致性。它将在非管理员会话和管理员会话中工作,但随后将无法在新的非管理员或管理员会话中工作。我试过先运行 Install-Module,它有时会工作,有时不会。

Name                           Value
----                           -----
PSVersion                      5.1.18362.1171
PSEdition                      Desktop
PSCompatibleVersions           {1.0, 2.0, 3.0, 4.0...}
BuildVersion                   10.0.18362.1171
CLRVersion                     4.0.30319.42000
WSManStackVersion              3.0
PSRemotingProtocolVersion      2.3
SerializationVersion           1.1.0.1


PS C:\> Get-Module -Name Microsoft.PowerApps.Administration.PowerShell

ModuleType Version    Name                                ExportedCommands
---------- -------    ----                                ----------------
Script     2.0.108    Microsoft.PowerApps.Administrati... {Add-AdminPowerAppsSyncUser, Add-AllowedConsentPlans, Add-...


PS C:\> Get-Module -Name Microsoft.PowerApps.PowerShell                                                                                                
ModuleType Version    Name                                ExportedCommands
---------- -------    ----                                ----------------
Script     1.0.20     Microsoft.PowerApps.PowerShell      {Approve-FlowApprovalRequest, Deny-FlowApprovalRequest, Di...


PS C:\> $user ="someone@something.com"
PS C:\> $pass = ConvertTo-SecureString -String "mypassword" -AsPlainText -Force
PS C:\> Add-PowerAppsAccount -Username $user -Password $pass
New-Object : Cannot find an overload for "UserCredential" and the argument count: "2".
At C:\WindowsPowerShell\Modules\Microsoft.PowerApps.Administration.PowerShell\2.0.108\Mi
crosoft.PowerApps.AuthModule.psm1:143 char:23
+ ... redential = New-Object Microsoft.IdentityModel.Clients.ActiveDirector ...
+                 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (:) [New-Object], MethodException
    + FullyQualifiedErrorId : ConstructorInvokedThrowException,Microsoft.PowerShell.Commands.NewObjectCommand

PS C:\>
4

1 回答 1

3

tldr ; 我认为您遇到了程序集冲突,请对程序集版本进行硬编码。

根本原因

At C:\WindowsPowerShell\Modules\Microsoft.PowerApps.Administration.PowerShell\2.0.108\Mi
crosoft.PowerApps.AuthModule.psm1:143 char:23

上面的错误引用了这一行:

$credential = New-Object Microsoft.IdentityModel.Clients.ActiveDirectory.UserCredential($Username, $Password)

Microsoft.IdentityModel.Clients.ActiveDirectory UserCredential的文档说构造函数需要 0 或 1 个参数......那么这如何使用 2参数?


该模块正在使用捆绑的Microsoft.IdentityModel.Clients.ActiveDirectory.dll. 我们可以加载它并试一试:

$path = ('C:\WindowsPowerShell\Modules\Microsoft.PowerApps.Administration.PowerShell\' +
    '2.0.108\Microsoft.IdentityModel.Clients.ActiveDirectory.dll')
[System.Reflection.Assembly]::LoadFrom($path)

$s = ConvertTo-SecureString "test" -AsPlainText -Force
New-Object Microsoft.IdentityModel.Clients.ActiveDirectory.UserCredential('test', $s)

工作没问题。我们可以通过运行找到汇编版本:

[AppDomain]::CurrentDomain.GetAssemblies() |
    where {$_.FullName -match 'Microsoft.IdentityModel.Clients.ActiveDirectory'} |
    select FullName, Location, Format-List

这为我们提供了嵌入式程序集版本 ( 2.29.0.1078)。最新
库版本是.Microsoft.IdentityModel.Clients.ActiveDirectory5.2.8.0

我能够通过下载和提取最新的包来重现您的错误:

# module not installed - downloaded and extracted using 7zip
$path = $env:USERPROFILE + '\Downloads\microsoft.identitymodel.clients.activedirectory.5.2.8' +
    '\lib\net45\Microsoft.IdentityModel.Clients.ActiveDirectory.dll'
[System.Reflection.Assembly]::LoadFrom($path)

$s = ConvertTo-SecureString "test" -AsPlainText -Force
New-Object Microsoft.IdentityModel.Clients.ActiveDirectory.UserCredential('test', $s)

# result
New-Object : Cannot find an overload for "UserCredential" and the argument count: "2".
At line:5 char:1
+ New-Object Microsoft.IdentityModel.Clients.ActiveDirectory.UserCreden ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (:) [New-Object], MethodException
    + FullyQualifiedErrorId : ConstructorInvokedThrowException,Microsoft.PowerShell.Commands.NewObjectCommand

我不知道您的冲突版本来自哪里。它可能是 .NET 安装或其他包的一部分。您可以[AppDomain]::CurrentDomain.GetAssemblies()...从上面运行以查看在收到错误消息的会话中加载了哪些程序集。


解决方案

修改Add-PowerAppsAccount并使用完整Microsoft.PowerApps.PowerShell 程序集限定类型名称Microsoft.PowerApps.Administration.PowerShell

# Line 143 in  
# C:\WindowsPowerShell\Modules\Microsoft.PowerApps.Administration.PowerShell\2.0.108\Microsoft.PowerApps.AuthModule.psm1
# and
# C:\WindowsPowerShell\Modules\Microsoft.PowerApps.PowerShell\1.0.2.0\Microsoft.PowerApps.AuthModule.psm1
# from
$credential = New-Object Microsoft.IdentityModel.Clients.ActiveDirectory.UserCredential($Username, $Password)
# to
$credential = New-Object -TypeName 'Microsoft.IdentityModel.Clients.ActiveDirectory.UserCredential,Microsoft.IdentityModel.Clients.ActiveDirectory,Version=2.29.0.1078, Culture=neutral, PublicKeyToken=31bf3856ad364e35' -ArgumentList ($Username, $Password)

笔记

  • 正如您可能知道的那样,更改上面的代码而不是其他任何东西都是不好的做法 - 可能想要提升模块版本。或者更好的是,提出一个错误 - 看起来你已经在正确的地方有一个帐户:)
  • 上面的更改解决了这个特定调用的问题......它确实应该对所有UserCredential调用进行,即使这样也可能有其他调用因更改而中断Microsoft.IdentityModel.Clients.ActiveDirectory
  • 如果可以安全地删除更高Microsoft.IdentityModel.Clients.ActiveDirectory版本(找到 dll 位置应该有助于进行该调用)
  • 在我的(简短)测试中,我发现加载的第一个程序集往往是使用的程序集;loading 2.29.0.1079= 即使在加载5.2.8.0之后也能正常工作,反之亦然。
    您也许可以更改代码逻辑以始终2.29.0.1079首先加载。
  • 也许您可以编辑C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe.config重定向程序集版本,以便2.29.0.1079始终使用它。(也是 32 位版本)
  • 或者您可以在运行时指定应用配置(未测试)
  • 尝试添加一个 full-qualified #requires,但没有用,我认为因为它只是检查程序集是否存在。
  • 尝试通过绑定重定向ResolveEventHandler,但无法使其正常工作。
于 2021-02-06T22:33:31.293 回答