powershell 获取消息令牌:在此对象上找不到属性“Authority”

rpppsulh  于 2023-03-30  发布在  Shell
关注(0)|答案(2)|浏览(164)

我正在使用Powershell Universal(https://docs.powershelluniversal.com/userinterfaces/dashboards)创建 Jmeter 板,并试图获取访问令牌以连接到MS Graph。我正在使用命令Get-MsalToken(MSAL.PS模块的一部分)来获取访问令牌。我正在运行的代码如下:

$Params = @{
    ClientId = $Credential.UserName
    ClientSecret = $Credential.Password
    TenantId = 'xxxxxxxxxxxxxxxxxxxx'
    ForceRefresh = $true
    ErrorAction = 'Stop'
}
$AccessToken = (Get-MsalToken @Params).AccessToken

当使用Powershell 7在命令行上运行上述代码时,它工作正常。但是,当 Jmeter 板在Powershell 7上运行相同的命令时,它返回以下错误消息:
Get-MsalToken: The property 'Authority' cannot be found on this object. Verify that the property exists.
模块MSAL.PS在我的本地示例和运行 Jmeter 板的服务器上都是版本4.37.00。在大多数情况下,我无法在我的机器或服务器上复制命令行上的错误,并且该命令运行得很好。在连接到其他服务并运行Get-MsalToken之后,我能够在机器的命令行上本地重现错误,但第二次尝试时,访问令牌获取正确,因此我无法在命令行上准确再现错误。然而, Jmeter 板与此错误一致。从服务器运行自动脚本也不会产生错误。
我确实在github上看到了一个关于这个问题的论坛,但是没有明确的解决方案。我确实看到有人建议注解掉源代码中的一些行,但是考虑到他们建议注解掉TenantID的一行,我正在使用TenantID进行连接,我不赞成这样做。论坛可以在这里找到:https://github.com/AzureAD/MSAL.PS/issues/45
我只是想知道是否有其他人遇到过这个问题,或者知道一个解决方案或替代方案。谢谢!

pepwfjgg

pepwfjgg1#

添加AzureCloudInstance参数对我来说很有效。这是一个比首先导入模块或更改源代码更可靠的修复方法。

$Params = @{
    ClientId = $Credential.UserName
    ClientSecret = $Credential.Password
    TenantId = 'xxxxxxxxxxxxxxxxxxxx'
    ForceRefresh = $true
    ErrorAction = 'Stop'
    AzureCloudInstance = 1
}

Here is a link to how the AzureCloudInstance parameter works.它是用C#编写的,但也可以翻译成PowerShell。我用1是因为它是最通用的,但值可能取决于您的组织所在的位置。

e3bfsja2

e3bfsja22#

正如NiMux上面所说的,解决方案是在导入其他任何东西之前简单地导入MSAL.PS模块。在我的代码的主页顶部,我简单地添加了Import-Module -Name MSAL.PS -Force,我让它正常工作。即使模块已经安装并导入,它也需要在导入其他东西之前导入。
希望这能帮助其他人在未来解决这个问题。

相关问题