【问题标题】:Azure Devops: value cannot be null, parameter tokenAzure Devops:值不能为空,参数令牌
【发布时间】:2019-09-10 13:48:59
【问题描述】:

我正在 Azure DevOps 中运行 Azure Powershell 任务。 在脚本中我使用以下命令

Get-AzureRmADUser -UserPrincipalName $adusernameNewPermission

但我的发布管道失败并出现以下错误代码

 ##[error]Value cannot be null.
Parameter name: token

首先我认为该命令没有正确的上下文或足够的权限,所以我添加了默认配置文件。

Get-AzureRmADUser -DefaultProfile (Get-AzureRmContext) -UserPrincipalName $adusernameNewPermission

如果我打印该命令的输出,GetAzureRmContext 确实进入了正确的上下文。

命令本身在本地运行时没有任何问题(使用我自己的用户帐户)所以我认为它的标题的唯一原因是服务连接无权执行该操作。但是我的用户帐户对租户的权限最少,而 azure devops 中的服务连接具有更多权限。

问题出在这个问题上,这让我发疯了。它是什么意思?没有合理的错误信息:( 有人遇到同样的问题或知道我错过了什么吗?

PS:$adusernameNewPermission 变量的工作方式就像我说的完全相同的代码在我的本地机器上完美运行,唯一的区别是登录的用户。

【问题讨论】:

  • $adusernameNewPermission 包含什么?
  • @Bevan 来自我的 aad 的用户名
  • 需要更多信息。 write-host $adusernameNewPermission 的输出是什么?价值是如何分配的?通过另一个命令或静态条目?它是作为对象还是字符串?如果通过另一个命令使用 ` |选择 -expandproperty Name` 以确保 var 是一个字符串。
  • 这是我想从中检索对象 ID 的 achahbar@domainStackoverflow.com 用户。通过使用命令 Get-AzureAD 执行此操作
  • 您是否启用了“允许脚本访问 Oauth”?

标签: azure powershell azure-active-directory azure-powershell


【解决方案1】:

您是否尝试改用 Get-azureaduser?这是一个需要针对 Azure AD 对函数进行身份验证的命令。

$azurePassword = ConvertTo-SecureString $env:client_secret -AsPlainText -Force
$psCred = New-Object System.Management.Automation.PSCredential($env:clientid , $azurePassword)
Connect-AzAccount -Credential $psCred -TenantId $env:tenantid -ServicePrincipal

【讨论】:

  • 我尝试使用您的解决方案,但 azure devops 用户没有足够的权限下载此命令的模块 AzureAD。但是我无法弄清楚为什么我的命令 Get-AzureRmADUSer 失败,因为 azure DevOps 中的 powershell 任务使用 Azure Powershell 并使用有权连接到广告的服务主体?
  • 这可能是的。您可以尝试转到您的应用程序注册 --> API 权限 --> 分配 Azure AD 应用程序权限以便能够读取用户。看看能不能解决。
  • 抱歉回复晚了。已经是这样了,应用注册确实有这个权限
【解决方案2】:

如果您使用“脚本文件路径”的脚本类型,请检查您是否尝试传入任何参数(例如 -token)。

【讨论】:

  • 嗨@Wahid 不,我尝试了两种方法,脚本文件路径为脚本提供了正确的参数(没有令牌)。出于测试目的,我还测试了内联脚本。但两者都给了我同样的错误。
【解决方案3】:

我会尝试 2 件事来回归基础。这将让您知道它是否实际上是 AzDO 服务主体以及要在管道中使用的对象类型。

  1. 以最简单的形式测试命令的功能并将帐户作为字符串运行:
Get-AzureRmADUser -UserPrincipalName "achahbar@stankoverflow.com"

#OR

$UPN = "achahbar@stankoverflow.com"
Get-AzureRmADUser -UserPrincipalName $UPN

假设这可行,并且根据您的变量包含的内容,您只需将 UPN/Email 对象传递到命令中:

Get-AzureRmADUser -UserPrincipalName $adusernameNewPermission.UPN
  1. 如果这不起作用,请将您的任务更新到版本 4(预览版)并将您的命令更新为 Get-AzADUser 并再次测试步骤 1.

【讨论】:

    【解决方案4】:

    我通过更改 Azure DevOps 中使用托管标识创建的服务连接来解决此问题。我用服务主体创建了一个新的服务连接,这并没有给我关于值令牌的任何错误。希望以后寻找这个问题的任何人都能得到这个答案。

    【讨论】:

      猜你喜欢
      • 2020-06-30
      • 2021-08-29
      • 2022-01-08
      • 2019-06-12
      • 1970-01-01
      • 1970-01-01
      • 2021-11-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多