Powershell Invoke-WebRequest returns (401) 未经授权

Powershell Invoke-WebRequest returns (401) Unauthorized

我有一个 PowerShell 脚本,它在 CodeDeployValidateService 中运行。下面是几行代码,在那里我得到错误:

$instancePrivateIp = Invoke-RestMethod http://169.254.169.254/latest/meta-data/local-ipv4

# $instancePrivateIp --> 20.12.xx.yyy
# $instancePrivateIp.GetType() -->
# IsPublic IsSerial Name                                     BaseType
# -------- -------- ----                                     --------
# True     True     String                                   System.Object

$uri = "http://{0}:8080/api/2.0/GetVersion" -f $instancePrivateIp
$response = Invoke-WebRequest -URI $uri
$statusCode = $response | Select-Object -Expand StatusCode
...
...

当 CodeDeploy 执行此脚本时,我收到 (401) Unauthorized。以下是完整的消息:

[stdout]Invoke-WebRequest : The remote server returned an error: (401) Unauthorized.
[stdout]At C:\ProgramData\Amazon\CodeDeployf9ade01-914b-44d7-9f7a-030e7aefe75e\d-T4EL
[stdout]8RNVB\deployment-archive\scripts\verify_deployment.ps1:12 char:25
[stdout]+ $response = Invoke-WebRequest -URI $uri
[stdout]+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~
[stdout] + CategoryInfo : InvalidOperation: (System.Net.HttpWebRequest:Htt
[stdout] pWebRequest) [Invoke-WebRequest], WebException
[stdout] + FullyQualifiedErrorId : WebCmdletWebResponseException,Microsoft.PowerShe
[stdout] ll.Commands.InvokeWebRequestCommand

而如果我在同一台 EC2 机器上手动执行此脚本,它会给我 200 个响应。我尝试添加一些睡眠并按 API 15 分钟,但我一直得到 401。谁能帮帮我。

谢谢。

You are double hopping,这在您的组织中可能默认是不允许的。双跳正在连接到远程系统并尝试隐式使用用于对第一个系统进行身份验证的凭据来对第二个系统进行身份验证。允许不检查此行为通常被认为是不安全的。


如果 CodeDeploy 是 运行 一个你精心制作的连接到实例的命令和 运行 你的脚本,你可以尝试使用 CredSSP 身份验证机制,如果您的组织尚未禁用它。否则,您将需要委派服务帐户才能进行第二跳(Stack Overflow 的题外话),或者您可以从 CodeDeploy 显式传递用户名和密码作为脚本参数(不要 将构建的 PSCredential 作为参数传递给远程系统,除非您在那里有可用的解密密钥,否则您将无法解密它),然后构建 PSCredential 在你的脚本中运行对象。

WARNING: While tempting because it's easy, don't hard-code your credentials