1

Subversion のロック機能と Active Directory 認証 (統合 Windows 認証または基本認証) を備えた VisualSVN サーバーを使用する開発チームは、管理者以外のユーザーがロックを盗むことを制限する必要がある場合があります。

このようなタスクは、プレロック フックで実現できます。ただし、認証は Active Directory のユーザーとグループに依存するため、このようなスクリプトを作成するのは少し難しい場合があります。

また、AD ドメイン グループのメンバーシップに基づいて、特定の AD ユーザーのアクションをフック スクリプトで異なる方法で処理する必要がある場合もあります。

Subversion フックを使用して AD ドメイン グループのメンバーシップを確認する方法を示すサンプルはありますか?

4

1 に答える 1

1

以下に示すサンプルの PowerShell 事前ロック フック スクリプトを使用して、AD グループのメンバーシップを確認できます。

pre-lock.ps1 PowerShell スクリプトは、ユーザーが Administrators Active Directory グループのメンバーであるかどうかを確認し、ユーザーがグループメンバーでない場合はロックのスチールを拒否します。

pre-lock.batpre-lock.ps1 の両方をリポジトリの「hooks」フォルダーに入れます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

pre-lock.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 に答える