You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

求适配Active Directory组的VisualSVN Server预修订属性变更钩子脚本

适配Active Directory组的VisualSVN pre-revprop-change钩子脚本

我来帮你把适配本地组的钩子脚本改成支持Active Directory(AD)组的版本,这样就能精准控制只有指定AD组的用户才能修改SVN提交日志了。下面分PowerShell和批处理两种版本给出修改方案,同时解释关键改动点。


一、PowerShell版本脚本

这个版本利用AD PowerShell模块实现用户组校验,支持嵌套组检查,逻辑更清晰:

# pre-revprop-change.ps1
param(
    [string]$repoPath,
    [string]$revision,
    [string]$userName,
    [string]$propName
)

# 只允许修改svn:log属性(其他属性禁止修改)
if ($propName -ne "svn:log") {
    Write-Host "Only changes to the svn:log property are allowed."
    exit 1
}

# 替换成你的目标AD组名称(比如SVN-Log-Editors)
$allowedADGroup = "SVN-Log-Editors"

try {
    # 先确认用户存在于AD中
    $adUser = Get-ADUser -Identity $userName -ErrorAction Stop
    
    # 递归检查用户是否属于目标AD组(包含嵌套组)
    $isAuthorized = Get-ADGroupMember -Identity $allowedADGroup -Recursive | 
        Where-Object { $_.SamAccountName -eq $userName }

    if ($isAuthorized) {
        exit 0 # 权限通过,允许修改日志
    } else {
        Write-Host "Access denied: You are not a member of the $allowedADGroup Active Directory group."
        exit 1
    }
} catch [Microsoft.ActiveDirectory.Management.ADIdentityNotFoundException] {
    Write-Host "Error: User '$userName' was not found in Active Directory."
    exit 1
} catch {
    Write-Host "Unexpected error occurred: $_"
    exit 1
}

关键改动说明

  • 替换了原本地组的Get-LocalGroupMember,改用AD模块的Get-ADUserGet-ADGroupMember命令
  • 添加了-Recursive参数支持嵌套组检查(如果不需要嵌套权限,去掉这个参数即可)
  • 增加了异常处理,覆盖用户不存在于AD、查询失败等场景

二、批处理版本脚本

如果你更倾向于批处理,这个版本使用AD命令行工具实现校验:

@echo off
setlocal

:: SVN钩子传入的参数
set REPOS=%1
set REV=%2
set USER=%3
set PROPNAME=%4

:: 只允许修改svn:log属性
if not "%PROPNAME%" == "svn:log" (
    echo Only changes to the svn:log property are allowed. >&2
    exit /b 1
)

:: 替换成你的目标AD组名称
set ALLOWED_GROUP=SVN-Log-Editors

:: 查询AD组的所有成员(包含嵌套组)并检查当前用户是否在列表中
dsquery group -name "%ALLOWED_GROUP%" | dsget group -members -expand | find /i "%USER%" >nul

if %errorlevel% equ 0 (
    exit /b 0 :: 权限通过
) else (
    echo Access denied: You are not a member of the %ALLOWED_GROUP% Active Directory group. >&2
    exit /b 1
)

关键改动说明

  • 使用dsquery+dsget组合查询AD组的嵌套成员
  • 通过find命令匹配当前用户,返回值判断权限是否合法

三、部署注意事项

  1. 安装必要工具
    • PowerShell版本:需要在VisualSVN服务器上安装Active Directory模块 for Windows PowerShell,可通过「添加角色和功能」→「远程服务器管理工具(RSAT)」→「AD DS和AD LDS工具」安装。
    • 批处理版本:需要AD命令行工具(域控制器默认自带,成员服务器需安装RSAT的AD工具组件)。
  2. 服务账户权限
    • VisualSVN Server的运行账户(默认是NT AUTHORITY\Network Service)需要有读取AD用户和组信息的权限,否则脚本无法查询AD数据。
  3. 测试脚本
    • 手动运行脚本测试逻辑:比如PowerShell版本执行.\pre-revprop-change.ps1 "C:\Repos\MyRepo" "123" "domain\testuser" "svn:log",验证返回结果是否符合预期。
  4. 配置钩子
    • 在VisualSVN Server管理器中,找到目标仓库→「钩子」→「pre-revprop-change」,设置脚本路径:
      • PowerShell:powershell.exe -ExecutionPolicy Bypass -File "C:\Repos\MyRepo\hooks\pre-revprop-change.ps1"
      • 批处理:直接选择批处理文件路径即可

内容的提问来源于stack exchange,提问作者PGP

火山引擎 最新活动