gpt4 book ai didi

Powershell UseDefaultCredentials 在远程 session 中不起作用

转载 作者:行者123 更新时间:2023-12-02 03:28:21 25 4
gpt4 key购买 nike

我正在尝试在远程机器上运行 Invoke-WebRequest 命令。我使用的帐户是两台机器上的本地管理员。如果我登录到远程机器并运行Invoke-WebRequest $url -UseDefaultCredentials,效果很好。

然而,当我运行时Invoke-Command -ComputerName machineName -ScriptBlock { Invoke-WebRequest "the path"-UseDefaultCredentials } 在我的本地机器上,它给了我 401 - 未授权:由于凭据无效,访问被拒绝。我也尝试过启动远程 session ;Enter-PSSession -ComputerName machineName 然后运行 ​​Invoke-WebRequest "the path"-UseDefaultCredentials,但结果相同。

为什么会这样?远程运行时权限发生了什么变化?如何在不提示输入密码且不将密码存储在脚本中的情况下解决这个问题?

最佳答案

在远程服务器上运行以下命令:Enable-WSManCredSSP -Role Server –Force

(看来您必须手动执行此操作;以下内容不起作用:

$remoteHosts | %{
invoke-command -ComputerName $_ -Credential $cred -ScriptBlock {
Enable-WSManCredSSP -Role Server –Force | out-null
}
}

然后使用下面的代码让本地机器信任远程机器,然后调用它来利用这种信任。注意:如果您想调用不同域中的远程机器,请注释掉代码。

[string[]]$remoteHosts = @('server1','server2')

$remoteHosts | %{Enable-WSManCredSSP -Role Client -DelegateComputer $_ -Force} | out-null

#if dealing with remote domains
#$trustedBefore = (Get-Item WSMan:\localhost\Client\TrustedHosts).value
#winrm set winrm/config/client ("@{{TrustedHosts='{0}'}}" -f (($remoteHosts + $remoteHosts) -join ',')) | out-null
$cred = get-credential
$remoteHosts | %{
InvokeCommand -ScriptBlock {
invoke-webrequest 'https://myUrl/' -UseDefaultCredentials | select StatusCode
} -Computer $_ -Credential $cred -Authentication Credssp
}
#winrm set winrm/config/client ("@{{TrustedHosts='{0}'}}" -f $trustedBefore) | out-null

引用:第二跳安全问题 http://blogs.technet.com/b/heyscriptingguy/archive/2012/11/14/enable-powershell-quot-second-hop-quot-functionality-with-credssp.aspx

引用:不同域中的远程计算机 https://technet.microsoft.com/en-us/magazine/ff700227.aspx

注意:您可能还会发现远程服务器在不同的 PS 版本上(即默认情况下较旧的操作系统具有 PS2)。如果你明白了,下面是 PS2 的 Invoke-WebRequest 的粗略近似(需要包含在脚本 block 中)

function Invoke-PS2WebRequest {
param(
$Uri
)
try {
$request = [System.Net.HttpWebRequest]::Create($Uri)
$request.UseDefaultCredentials = $true
$request.PreAuthenticate = $true
$resp = $request.GetResponse()
$reqstream = $resp.GetResponseStream()
$sr = new-object System.IO.StreamReader $reqstream
$result = $sr.ReadToEnd()
write-output (new-object -TypeName PSObject -Property @{
StatusDescription = $resp.StatusDescription
StatusCode = [int]$resp.StatusCode
Content = $result
})
} catch {
write-output (new-object -TypeName PSObject -Property @{
StatusDescription = 'ERROR'
StatusCode = [int]([regex]::matches($_.exception.message, "(?<=\()[\d]{3}").Value)
Content = $_.exception.message
})
}
}

关于Powershell UseDefaultCredentials 在远程 session 中不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28956619/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com