【问题标题】:Invoke-RestMethod from PowerShellScript doesn't work but work from commandline来自 PowerShell 脚本的 Invoke-RestMethod 不起作用,但可以从命令行工作
【发布时间】:2021-08-21 23:05:42
【问题描述】:

我正在尝试从 powershell 脚本调用 rest 方法以从 azure repo 获取 git 更改。当我一个接一个地运行整个过程时,它可以工作,但是当我尝试通过编写 powershell 脚本来运行整个脚本时,它不能按预期工作,给出空输出。谁能告诉这里可能是什么问题

$url = "https://dev.azure.com/<Org_Name>/<Project_Name>/_apis/git/repositories/<RepoID>/commits/$(Build.SourceVersion)/changes?api-version=5.1"
$userName = "Username"
$password = "<PAT>"
$base64AuthInfo = [Convert]::ToBase64String([Text.Encoding]::ASCII.GetBytes(("{0}:{1}" -f $userName,$password)))
$result = Invoke-RestMethod -Uri $url -Headers @{Authorization = "Basic $base64AuthInfo"} -Method GET
Write-Host $result
$changesFolders = $result.changes | Where-Object {$_.item.gitObjectType -eq "tree"} | Select-Object -Property{$_.item.Path}
foreach($path in $changesFolders)
{
   Write-Host $path
}
Write-Host $changesFolder

【问题讨论】:

  • edit 提出问题,并在(已清理的)minimal reproducible example 中详细说明模糊的“它不起作用”(错误消息?或意外输出?) .
  • 不起作用,因为它给出了这样的空输出:@{changeCounts=; changes=System.Object[]} 但是当我在 powershell 上一一运行所有命令时,它给出了输出:@{Edit=1;添加=1} {@{item=;更改类型=编辑},@{项目=; changeType=add}} 这种行为是不是出乎意料?
  • 您已经描述了您的问题,并且如上所述,它是环境问题。您的组织/企业可能正在使用安全/风险过滤工具,即网络过滤、流量分析、数据包检查、受保护的控制等。我支持的组织/企业可能会阻止/破坏任何使用编码的东西,因为这是黑客做了什么来尝试绕过网络保护。
  • 为什么当我从 powershell 命令行运行时它能够得到很好的响应?并且授权的 PAT 要求也不是为了安全。

标签: powershell azure-devops azure-devops-rest-api


【解决方案1】:

我不确定如何,但我尝试了 Invoke-webRequest 而不是 Invoke-RestMethod 并且它有效 但是我也必须对标头进行一些更改,否则它会到达端点但仍然给出 203 状态

$headers = @{
    Authorization=("Basic" + [System.Convert]::ToBase64String([System.Text.Encoding]::UTF8.GetBytes(":$PAT")));
ContentType="application/json"
}
$result = Invoke-webRequest -Uri $url -Headers $header -Method GET
Write-Host $result.StatusCode 

按预期给出结果和状态代码 200 注意:转换为base64string时在密码/PAT前不加冒号会抛出203状态

【讨论】:

    【解决方案2】:

    以下示例正在运行。此外,您可以将我们生成的 URL 粘贴到浏览器中,然后从您的组织中查看答案。

    $user = ""
    $token = "PAT"
    
    $base64AuthInfo = [Convert]::ToBase64String([Text.Encoding]::ASCII.GetBytes(("{0}:{1}" -f $user,$token)))
    $orgUrl = "ORG"
    $teamProject = "PROJECT"
    $repoName = "REPONAME"
    $commitId = "COMMITID"
    
    $restApiGetCommit = "$orgUrl/$teamProject/_apis/git/repositories/$repoName/commits/$commitId/changes?api-version=5.1"
    
    function InvokeGetRequest ($GetUrl)
    {    
        return Invoke-RestMethod -Uri $GetUrl -Method Get -ContentType "application/json" -Headers @{Authorization=("Basic {0}" -f $base64AuthInfo)}    
    }
    
    Write-Host "Url" $restApiGetCommit
    
    $commitInfo = InvokeGetRequest $restApiGetCommit
    
    Write-Host "Commit: " $commitInfo.changes
    
    foreach($path in $commitInfo.changes)
    {
       Write-Host "Path" $path.item.path
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-05-11
      • 2015-04-12
      • 2018-04-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-06
      • 1970-01-01
      相关资源
      最近更新 更多