Powershell、svn和身份验证

11

我可以远程桌面连接到指定的机器并运行svn,而不用提供认证信息,它能够正常工作;我的AD认证允许我访问我想要的仓库。

我也可以使用PowerShell连接到这台机器并执行svn命令。但是当我这样做时,会收到“禁止访问”的错误提示。当从被远程执行的脚本中运行时,[Environment]::UserName 显示了我期望的用户名(我的AD用户名)。

我需要做些什么才能使其正常工作?

一些代码:

$Session = New-PSSession -ComputerName $computerName;

if (-Not ($Session)) {
    Write-Host "Did not create session!";
    Return;
}

Invoke-Command -Session $Session -FilePath 'switchAllRepositories.ps1' -ArgumentList $branchName;

Remove-PSSession $Session;

并且在switchAllRepositories中,我有一个参数:

Param(
  [string]$branchURL
)

一系列类似的电话通话,例如:

If(Test-Path "C:\webfiles\repositoryname") {
    Write-Host "Switching repositoryname"
    SwitchRepo "repositoryname" ($branchURL) "C:\webfiles\repositoryname";
}

调用哪个函数:

Function SwitchRepo ($repoName, $branchPath, $workingCopy)
{
    $to = ("https://[url]/svn/" + $repoName + $branchPath);
    Write-Host "to $to";

    #debug
    $user = [Environment]::UserName
    Write-Host "as $user";

    $exe = "C:\Program Files\TortoiseSVN\bin\svn.exe";
    &$exe switch "$to" "$WorkingCopy" --username [redacted] --password [redacted] --no-auth-cache --non-interactive --trust-server-cert

    if ($process.ExitCode -ne 0) {
        #$wshell = New-Object -ComObject Wscript.Shell
        #$wshell.Popup("Error switching " + $repoName,0,"Done",0x1)
        Write-Host "Error detected!"
    }
}

具体错误信息如下:

svn: E175013: 无法连接到 URL 上的仓库 '[snipped]' + CategoryInfo : NotSpecified: (svn: E175013: U...eases/20150620':String) [], RemoteException + FullyQualifiedErrorId : NativeCommandError svn: E175013: 对 '[snipped]' 的访问被拒绝


1
取决于你如何连接。 - Mathias R. Jessen
@briantist 那为什么会出错呢?我可以确定报错中提到的分支与我传入脚本的分支完全匹配。你是在暗示些什么吗?我觉得太多无关的代码会让问题更难理解。 - Yamikuronue
现在我无法从使用Invoke-Command的代码到抛出错误的代码看到完整路径。例如,我不知道$branchURL变量是否对应于通过$branchName传递的内容。它们的命名方式使它们看起来不相关,但如果是这种情况,那么我就不知道$branchURL的值来自哪里。通常在SO上,问题是代码太少,而不是太多。 - briantist
@briantist 好的,我添加了三行代码来传递参数。在 Stack Overflow 上,经常有人要求更多的代码,但当发现我没有忽略一些简单的东西时,他们就会悄然离开,所以我在这里有点犹豫。你看到我可以测试的东西吗? - Yamikuronue
@briantist 是的,它运行得很好。但是我正在使用我的用户名,就像在本地计算机上使用一样进行身份验证。显然是你提到的双跳导致了问题,但我不明白为什么我传递的凭据没有覆盖Kerberos身份验证并防止双跳成为问题。 - Yamikuronue
显示剩余4条评论
1个回答

4

如果您能提供您正在使用的代码,那会很有帮助,但如果我猜得没错的话,您正在使用PowerShell远程控制,使用的是Enter-PSSessionInvoke-Command

由于它们默认使用Kerberos身份验证,而SVN服务器可能在第三台机器上,因此您可能会遇到Kerberos双跳身份验证问题。

简单来说,您无法从A机器远程连接到B机器,然后在该会话中尝试使用相同的身份验证上下文访问C机器。

您可以通过几种方法解决这个问题:通常在这些情况下会提到CredSSP,但我发现这很复杂,通常重新考虑工作流程效果更好。

例如,您可以为SVN命令明确指定凭据。

或者,您可以在服务器上创建自己的端点,使用RunAs用户。然后所有命令都将来自B机器作为特定用户:


那看起来就是我缺少的东西 :) 但是,当我尝试将用户名和密码硬编码到我的脚本中时,为什么那也不起作用呢?可能是 SVN 尝试优先使用 Kerberos 而不是提供的凭据之类的原因。 - Yamikuronue
不确定你需要哪些行,但我编辑了一些代码。 - Yamikuronue
你能同时发布 switchAllRepositories.ps1 吗?如果你通过 RDP 登录到机器上,然后交互式地运行该 ps1 文件,它是否有效?另外,你确定访问被拒绝的错误来自 SVN 吗?如果可能的话,请尽量发布完整的错误信息。 - briantist

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接