Powershell,svn和身份验证

Yam*_*nue 11 svn powershell powershell-remoting

我可以远程桌面到一个给定的机器并运行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;
Run Code Online (Sandbox Code Playgroud)

在switchAllRepositories中,我有一个参数:

Param(
  [string]$branchURL
)
Run Code Online (Sandbox Code Playgroud)

一系列的调用如:

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

哪个电话:

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!"
    }
}
Run Code Online (Sandbox Code Playgroud)

确切的错误是:

svn:E175013:无法连接到URL'[snipped]'+ CategoryInfo:NotSpecified :( svn:E175013:U ... eases/20150620':String)[],RemoteException + FullyQualifiedErrorId:NativeCommandError svn:E175013:禁止访问'[snipped]'

bri*_*ist 4

这将有助于查看您正在使用的代码,但如果这是我怀疑的,那么您正在将 PowerShell 远程处理与 或 一起Enter-PSSession使用Invoke-Command

由于这些将默认使用 kerberos 身份验证,并且 SVN 服务器可能位于第三台计算机上,因此您可能会遇到 kerberos 双跳身份验证问题。

简而言之,您无法从计算机 A 远程访问计算机 B,然后在该会话中尝试使用相同的身份验证上下文访问计算机 C。

您可以通过几种方式解决这个问题:CredSSP 经常在这些中提到,但我发现它很复杂,通常重新思考工作流程会更好。

例如,您也许能够显式指定 SVN 命令的凭据。

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