1

使用Subversion 的锁定功能和带有 Active Directory 身份验证(集成 Windows 身份验证基本身份验证)的 VisualSVN 服务器的开发团队可能需要限制除管理员之外的任何人来窃取锁

这样的任务可以通过pre-lock hook来完成。但是,由于身份验证依赖于 Active Directory 用户和组,因此编写这样的脚本可能有点棘手。

此外,在某些情况下,某些 AD 用户的操作必须由挂钩脚本根据其 AD 域组成员身份进行不同的处理。

是否有任何示例显示如何使用 Subversion 挂钩检查 AD 域组成员资格?

4

1 回答 1

1

您可以使用下面提供的示例 PowerShell 预锁定挂钩脚本检查 AD 组成员身份。

pre-lock.ps1 PowerShell脚本检查用户是否是管理员Active Directory 组的成员,如果用户不是该组的成员,则拒绝窃取锁定。

pre-lock.batpre-lock.ps1放入您的存储库“钩子”文件夹中,例如C:\Repositories\repository\hooks\.

预锁.ps1

# Function check if $user is a member of $group
function Check-GroupMembership
{
  param([string]$group, [string]$user)

  $server = get-content env:COMPUTERNAME
  $query = [ADSI]("WinNT://$server/$group,group")

  $ulist = $query.psbase.invoke("Members") |`
           %{$_.GetType().InvokeMember("Name", 'GetProperty', $null, $_, $null)}

  $ulist -contains $user
}

# Store hook arguments into variables with mnemonic names
$repos     = $args[0]
$path      = $args[1]
$user      = $args[2]
$comment   = $args[3]
$steallock = $args[4]

# Build path to svnlook.exe
$svnlook = "$env:VISUALSVN_SERVER\bin\svnlook.exe"

# Get the lock description
$lockdescr = (&"$svnlook" lock $repos $path)

# Find owner name
foreach ($str in $lockdescr)
{
  if ($str.StartsWith("Owner: "))
  {
    $owner = $str.Substring(7)

    # We find lock owner's name and it is not the user name
    if ($owner -ne "" -and $owner -ne $user)
    {
      # If the $user is a member of 'Administrators'
      # group allow to steal the lock
      if (-not (Check-GroupMembership "Administrators" $user))
      {
        [Console]::Error.WriteLine("Error: $path already locked by $owner.")
        exit 1
      }
    }

    exit 0
  }
}

exit 0

预锁.bat

@echo off
set PWSH=%SystemRoot%\System32\WindowsPowerShell\v1.0\powershell.exe
%PWSH% %1\hooks\pre-lock.ps1 %1 %2 %3 %4 %5
if errorlevel 1 exit %errorlevel%
于 2012-07-18T12:21:46.057 回答