Power Apps PowerShell:找不到“UserCredential”和参数计数的重载:“2”

问题描述

尝试使用 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:\>

解决方法

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 class 的文档说构造函数需要 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)。
latest Microsoft.IdentityModel.Clients.ActiveDirectory library version5.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-PowerAppsAccountMicrosoft.PowerApps.PowerShell 中的 Microsoft.PowerApps.Administration.PowerShell 修改为 use the full assembly-qualified type name

# 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)

注意事项

  • 像上面一样更改代码,没有其他任何事情是不好的做法,因为您可能知道 - 可能想要提高模块版本。或者更好的是,提出一个错误 - 它看起来像 you already have an account on the right place :)
  • 上述更改修复了此特定调用的问题...确实应该对所有 UserCredential 调用进行更改,即使如此,可能还会有其他调用因 Microsoft.IdentityModel.Clients.ActiveDirectory 的更改而中断立>
  • 删除更高的 Microsoft.IdentityModel.Clients.ActiveDirectory 版本如果您可以安全地这样做(找到 dll 位置应该有助于进行调用)
  • 在我的(简短)测试中,我发现加载的第一个程序集往往是使用的程序集;加载 2.29.0.1079 = 即使在加载 5.2.8.0 之后也能正常工作,反之亦然。
    您或许可以更改代码逻辑以始终如一地首先加载 2.29.0.1079
  • 也许您可以将 C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe.config 编辑为 redirect assembly version,以便始终使用 2.29.0.1079。 (也是 32 位版本)
  • maybe you can specify the app config during runtime(未测试)
  • 尝试添加完全限定的 #requires,但没用,我猜是因为它只是检查程序集是否存在。
  • 通过 binding redirect 尝试了 ResolveEventHandler,但无法使其正常工作。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...