使用C#控制VisualSVN服务器

8

我安装了VisualSVN Server 2.5.4。我可以创建用户和仓库。我的问题是如何在C#中创建/删除用户/仓库。是否有任何库可用?

1个回答

12

更新于2015年3月9日

现在不需要编写自定义的WMI脚本了;开始使用VisualSVN Server 3.4提供的PowerShell cmdlets即可涵盖大多数Subversion服务器管理和仓库管理用例。阅读有关新功能的信息,转到https://www.visualsvn.com/server/features/powershell/

VisualSVN Server 3.4引入了一个PowerShell模块,为您提供了许多有用的cmdlet。这些cmdlet可用于本地或远程管理VisualSVN Server及其仓库。以下是VisualSVN Server PowerShell cmdlet的完整参考

例如:

  • 通过运行此PowerShell命令,您可以创建一个名为MySuperRepo的新仓库:

    New-SvnReposiory MySuperRepo

  • 您可以在仓库中创建项目结构

    New-SvnRepositoryItem MySuperRepo -Path /branches, /tags, /trunk -Type Folder

  • 您可以向DOMAIN\Developers Active Directory组帐户授予新存储库的读/写访问权限

    Add-SvnAccessRule MyRepo -Path / -AccountName DOMAIN\Developers -Access ReadWrite

  • 您可以计算存储库占用的磁盘空间大小:

    Measure-SvnRepository MySuperRepo

  • 您可以验证存储库是否存在损坏:

    Test-SvnRepository MySuperRepo

    还有更多功能!

有关更多信息和完整的cmdlet列表,请阅读文章VisualSVN Server PowerShell Cmdlet参考


可以通过WMI(Windows Management Instrumentation)接口管理VisualSVN Server。

描述VisualSVN Server接口的MOF文件位于安装VisualSVN Server的计算机上的%VISUALSVN_SERVER%\WMI。使用此文件作为参考,您可以编写C#脚本来管理VisualSVN Server。

请查看MSDN文章:http://msdn.microsoft.com/en-us/library/bb404655

我在此提供以下示例供您参考:

  • 此C#代码将创建一个名为'user1',密码为'secret'的Subversion用户。

        ManagementClass userClass = new ManagementClass("root\\VisualSVN", "VisualSVN_User", null);
    
        // Obtain in-parameters for the method
        ManagementBaseObject inParams =
            userClass.GetMethodParameters("Create");
    
        // Add the input parameters.
        inParams["Name"] = "user1";
        inParams["Password"] = "secret";
    
        // Execute the method and obtain the return values.
        ManagementBaseObject outParams =
            userClass.InvokeMethod("Create", inParams, null);
    
  • 这段C#代码将创建一个名为“Repo1”的新存储库。

  •     ManagementClass repoClass = new ManagementClass("root\\VisualSVN", "VisualSVN_Repository", null);
    
        // Obtain in-parameters for the method
        ManagementBaseObject inParams =
            repoClass.GetMethodParameters("Create");
    
        // Add the input parameters.
        inParams["Name"] = "Repo1";
    
        // Execute the method and obtain the return values.
        ManagementBaseObject outParams =
            repoClass.InvokeMethod("Create", inParams, null);
    
  • 这段 C# 代码将会授予 SID S-1-5-32-545 ('BUILTIN\Users') 在存储库 'Test' 上的读/写访问权限。请注意:AccessLevel 值如 MOF 中所述:"0 - 没有访问权限,1 - 只读,2 - 读/写"

  • ManagementClass userClass = new ManagementClass("root\\VisualSVN", "VisualSVN_WindowsAccount", null);                            
    ManagementClass authzClass = new ManagementClass("root\\VisualSVN", "VisualSVN_SecurityDescriptor", null);
    ManagementClass permClass = new ManagementClass("root\\VisualSVN", "VisualSVN_PermissionEntry", null);
    
    ManagementObject userObject = userClass.CreateInstance();
    userObject.SetPropertyValue("SID", "S-1-5-32-545");
    
    ManagementObject permObject = permClass.CreateInstance();
    permObject.SetPropertyValue("Account", userObject);
    permObject.SetPropertyValue("AccessLevel", 2);
    
    ManagementObject repo = new ManagementObject("VisualSVN_Repository.Name='Test'");
    
    ManagementBaseObject inParams =
        authzClass.GetMethodParameters("SetSecurity");
    
    inParams["Object"] = repo;
    inParams["Permissions"] = new object[] { permObject };
    
    ManagementBaseObject outParams =
        authzClass.InvokeMethod("SetSecurity", inParams, null);
    

更新于2013年2月10日:

VisualSVN Server 2.6中已更改(并改进)WMI模式。简而言之,要在存储库路径上设置访问权限,您需要执行以下操作:

  • 创建指定存储库名称的VisualSVN_Repository类对象,
  • 创建指定帐户用户名和访问权限的VisualSVN_PermissionEntry条目对象,
  • VisualSVN_Repository上调用SetSecurity方法,传递有效的存储库路径和PermissionEntry对象。

    ManagementClass userClass = new ManagementClass("root\\VisualSVN", "VisualSVN_WindowsAccount", null);
    ManagementClass permClass = new ManagementClass("root\\VisualSVN", "VisualSVN_PermissionEntry", null);
    ManagementClass repoClass = new ManagementClass("root\\VisualSVN", "VisualSVN_Repository", null);

    ManagementObject userObject = userClass.CreateInstance();
    userObject.SetPropertyValue("SID", "S-1-5-32-545");

    ManagementObject permObject = permClass.CreateInstance();
    permObject.SetPropertyValue("Account", userObject);
    permObject.SetPropertyValue("AccessLevel", 2);

    ManagementObject repoObject = repoClass.CreateInstance();
    repoObject.SetPropertyValue("Name", "MyProject");

    ManagementBaseObject inParams =
        repoClass.GetMethodParameters("SetSecurity");

    inParams["Path"] = "/trunk";
    inParams["Permissions"] = new object[] { permObject };

    ManagementBaseObject outParams =
        repoObject.InvokeMethod("SetSecurity", inParams, null);

1
非常感谢。这正是我正在寻找的。有一件事情还缺失,如何映射用户和存储库? - Rased Dot Net
1
@RasedDotNet:'映射用户和存储库'是什么意思? - Ivan Zhakov
1
@IvanZhakov:为用户设置权限,以便他/她只能访问具有只读/读写权限的(一个或多个)特定仓库。 - Rased Dot Net
如果加载System.Management.dll,该代码可以很好地映射到PowerShell。谢谢,你节省了我很多时间。 - sean_m
@bahrep 子问题,您如何在PowerShell中附加安全条目?当我尝试使用+=运算符将多个值设置为“Permissions”参数时,它会抛出隐式转换异常。如果需要,我可以在新问题中发布代码。 - sean_m
显示剩余5条评论

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