问题描述
尝试使用 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 version 是 5.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
修改为 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
,但无法使其正常工作。