获取 401 Unauthorized 尝试使用 Powershell 脚本创建或更新 Wiki 页面

Getting 401 Unauthorized trying to Create or Update Wiki page using Powershell script

我正在尝试使用生成的发行说明从构建管道在我的 Wiki 中创建一个新页面。 我收到此错误响应:Invoke-WebRequest : The remote server returned an error: (401) Unauthorized.

我查看了我在该主题上找到的所有资源,一切对我来说都很好。

这是我的 powershell 脚本:

# Get content of the generated release notes file
$content = [IO.File]::ReadAllText("$(build.artifactstagingdirectory)/release-notes-$(Build.BuildNumber).md")
$data = @{content=$content;} | ConvertTo-Json;

$params = @{uri = '$(WikiPath)';
  Method = 'PUT';
  Headers = @{Authorization = "Bearer $(System.AccessToken)" };
  ContentType = "application/json";
  Body = $data;
}

Write-Host "PUT $(WikiPath)"

$response = Invoke-WebRequest @params

Write-Host $response

WikiPath 变量的值设置为:
https://<server-ip>/PersonalProjects/Personal-KM/_apis/wiki/wikis/Personal-KM.wiki/pages?path=%2FRelease%20notes%2F$(Build.BuildNumber)&api-version=5.0

uri来自官方API documentation。我想创建确实存在的页面 Release notes 的子页面。我尝试创建根页面但没有成功 (?path=$(Build.BuildNumber)&api-version=5.0)。

请注意,我也尝试过在 wiki 标识符末尾不带 .wiki

这是构建步骤的输出:

##[command]"C:\WINDOWS\System32\WindowsPowerShell\v1.0\powershell.exe" -NoLogo -NoProfile -NonInteractive -ExecutionPolicy Unrestricted -Command ". 'C:\DevOpsAgent\_work\_temp\ebf68890-3544-4a8d-a415-4309983b1381.ps1'"
PUT https://<server-ip>/PersonalProjects/Personal-KM/_apis/wiki/wikis/Personal-KM.wiki/pages?path=%2FRelease%20notes%2F1.0.0.7&api-version=5.0
Invoke-WebRequest : The remote server returned an error: (401) Unauthorized.
At C:\DevOpsAgent\_work\_temp\ebf68890-3544-4a8d-a415-4309983b1381.ps1:26 char:13
+ $response = Invoke-WebRequest @params
+             ~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (System.Net.HttpWebRequest:HttpWebRequest) [Invoke-WebRequest], WebExc 
   eption
    + FullyQualifiedErrorId : WebCmdletWebResponseException,Microsoft.PowerShell.Commands.InvokeWebRequestCommand

##[error]PowerShell exited with code '1'.

要点 1:我在代理作业中检查了 Allow scripts to access the OAuth Token

要点 2:我已将权限 'Contribute' 授予构建服务帐户:

你能看出我的脚本或配置有什么问题吗?

根据@MarioDietner 的评论编辑 1
我尝试使用 PAT 而不是 $(System.AccessToken),我得到了同样的错误(我是项目集合管理员的成员,我的 PAT 具有完全访问范围)。
我还尝试从我的本地计算机执行脚本(替换变量):

编辑 2 我尝试 运行 我们的生产服务器上的 Azure Pipelines 脚本,并且在第一次尝试时就成功了。我不知道我们本地的 Azure DevOps 出了什么问题,但我会把调查重点放在身份上,而不是 Powershell 脚本上。

请更新您的脚本并使用格式为以下的编码令牌:

$PAT = "username@domain.com:PAT"
$encodedPat = [System.Convert]::ToBase64String([System.Text.Encoding]::UTF8.GetBytes($PAT))

$params = @{uri = '$(WikiPath)';
  Method = 'PUT';
  Headers = @{Authorization = "Basic $encodedPat" };
  ContentType = "application/json";
  Body = $data;
}

我在 powershell 和编码部分遵循 this 指南,但将用户名添加到 PAT 以使其在 SOAP UI 中工作。首先与您的用户一起尝试,然后采用 System.AccessToken。希望对您有所帮助!