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

VisualSVN Server安装的计算机中,位于%VISUALSVN_SERVER%\WMI下的MOF文件描述了该接口。可以用C#代码控制管理VisualSVN Server。

我机器VisualSVN安装在D盘,MOF文件存在位置:D:\Program Files\VisualSVN Server\WMI\VisualSVNServer.mof

下面一些代码供参考:

using System.Management;
using System.Management.Instrumentation;

并添加 System.Management,System.Management.Instrumentation这两个组件的引用。

1)创建Subversion 用户 'user1',密码为'secret'

ManagementClass userClass = newManagementClass("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);

2)创建新的repository 'Repo1'

ManagementClass repoClass = newManagementClass("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);
  3)设置SID S-1-5-32-545 ('BUILTIN\Users') Windows用户组对'Test' repository的读/写权限. FYI: AccessLevel 值在MOF有描述: "0 - 无权限, 1 - 只读, 2 - 读/写".
ManagementClass userClass = newManagementClass("root\\VisualSVN","VisualSVN_WindowsAccount",null);
ManagementClass authzClass = newManagementClass("root\\VisualSVN","VisualSVN_SecurityDescriptor",null);
ManagementClass permClass = newManagementClass("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 = newManagementObject("VisualSVN_Repository.Name='Test'");
ManagementBaseObject inParams =
authzClass.GetMethodParameters("SetSecurity");
inParams["Object"] = repo;
inParams["Permissions"] = newobject[] { permObject };
ManagementBaseObject outParams =
authzClass.InvokeMethod("SetSecurity", inParams, null);
封装后的Helper类:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Management;//调用windows WMI需引入此类库 namespace Whir.Software.InteralServerManage.SVNManager
{
/// <summary>
/// Visual SVN 操作辅助类:使用WMI控制VisualSVN,MOF文件存在位置:C:\Program Files\VisualSVN Server\WMI\VisualSVNServer.mof
/// </summary>
public class SVNHelper
{
#region 设置 #region 设置仓库权限 public enum AccessLevel : uint
{
NoAccess = 0,
ReadOnly,
ReadWrite
} /// <summary>
/// 设置仓库权限(给用户授权)
/// </summary>
/// <param name="userName">用户名</param>
/// <param name="repository">SVN仓库</param>
public static bool SetRepositoryPermission(string userName, string repository)
{
return SetRepositoryPermission(userName, repository, 2);
} /// <summary>
/// 设置仓库权限(给用户授权)
/// </summary>
/// <param name="users">用户名</param>
/// <param name="repository">SVN仓库</param>
public static bool SetRepositoryPermission(List<string> users, string repository)
{
string userNames = "";
foreach (string user in users)
{
userNames += user + ",";
}
return SetRepositoryPermission(userNames, repository, 2);
} /// <summary>
/// 设置仓库权限(给用户授权)
/// </summary>
/// <param name="userName">用户名</param>
/// <param name="repository">SVN仓库</param>
/// <param name="permission"> 权限码:0拒绝,1只读,2读写</param>
public static bool SetRepositoryPermission(string userName, string repository, int permission)
{
try
{
string[] users = userName.Split(new[] {","}, StringSplitOptions.RemoveEmptyEntries);
IDictionary<string, AccessLevel> permissions = GetPermissions(repository, "/");
foreach (string s in users)
{
if (!permissions.ContainsKey(s))
{
permissions.Add(s, AccessLevel.ReadWrite);
}
}
SetPermissions(repository, "/", permissions);
return true;
}
catch (Exception)
{
return false;
}
} /// <summary>
/// 根据仓库名取得仓库实体
/// </summary>
/// <param name="name"></param>
/// <returns></returns>
private static ManagementObject GetRepositoryObject(string name)
{
return new ManagementObject("root\\VisualSVN", string.Format("VisualSVN_Repository.Name='{0}'", name), null);
} /// <summary>
/// 读取权限实体
/// </summary>
/// <param name="sid"></param>
/// <param name="accessLevel"></param>
/// <returns></returns>
private static ManagementObject GetPermissionObject(string sid, AccessLevel accessLevel)
{
var accountClass = new ManagementClass("root\\VisualSVN",
"VisualSVN_WindowsAccount", null);
var entryClass = new ManagementClass("root\\VisualSVN",
"VisualSVN_PermissionEntry", null);
ManagementObject account = accountClass.CreateInstance();
if (account != null) account["SID"] = sid;
ManagementObject entry = entryClass.CreateInstance();
if (entry != null)
{
entry["AccessLevel"] = accessLevel;
entry["Account"] = account;
return entry;
}
return null;
} /// <summary>
/// 设置仓库权限
/// </summary>
/// <param name="repositoryName"></param>
/// <param name="path"></param>
/// <param name="permissions"></param>
private static void SetPermissions(string repositoryName, string path,
IEnumerable<KeyValuePair<string, AccessLevel>> permissions)
{
ManagementObject repository = GetRepositoryObject(repositoryName);
ManagementBaseObject inParameters = repository.GetMethodParameters("SetSecurity");
inParameters["Path"] = path;
IEnumerable<ManagementObject> permissionObjects =
permissions.Select(p => GetPermissionObject(p.Key, p.Value));
inParameters["Permissions"] = permissionObjects.ToArray();
repository.InvokeMethod("SetSecurity", inParameters, null);
} /// <summary>
/// 读取仓库权限
/// </summary>
/// <param name="repositoryName"></param>
/// <param name="path"></param>
/// <returns></returns>
private static IDictionary<string, AccessLevel> GetPermissions(string repositoryName, string path)
{
ManagementObject repository = GetRepositoryObject(repositoryName);
ManagementBaseObject inParameters = repository.GetMethodParameters("GetSecurity");
inParameters["Path"] = path;
ManagementBaseObject outParameters = repository.InvokeMethod("GetSecurity", inParameters, null); var permissions = new Dictionary<string, AccessLevel>(); if (outParameters != null)
foreach (ManagementBaseObject p in (ManagementBaseObject[]) outParameters["Permissions"])
{
// NOTE: This will fail if VisualSVN Server is configured to use Subversion
// authentication. In that case you'd probably want to check if the account
// is a VisualSVN_WindowsAccount or a VisualSVN_SubversionAccount instance
// and tweak the property name accordingly.
var account = (ManagementBaseObject) p["Account"];
var sid = (string) account["SID"];
var accessLevel = (AccessLevel) p["AccessLevel"]; permissions[sid] = accessLevel;
} return permissions;
} #endregion #region 创建用户组 /// <summary>
/// 创建用户组
/// </summary>
public static bool CreatGroup(string groupName)
{
try
{
var svn = new ManagementClass("root\\VisualSVN", "VisualSVN_Group", null);
ManagementBaseObject @params = svn.GetMethodParameters("Create");
@params["Name"] = groupName.Trim();
@params["Members"] = new object[] {};
svn.InvokeMethod("Create", @params, null);
return true;
}
catch (Exception)
{
return false;
}
} #endregion #region 创建用户 /// <summary>
/// 创建用户
/// </summary>
/// <param name="userName"></param>
/// <param name="password"></param>
/// <returns></returns>
public static bool CreateUser(string userName, string password)
{
try
{
var svn = new ManagementClass("root\\VisualSVN", "VisualSVN_User", null);
ManagementBaseObject @params = svn.GetMethodParameters("Create");
@params["Name"] = userName.Trim();
@params["Password"] = password.Trim();
svn.InvokeMethod("Create", @params, null);
return true;
}
catch (Exception)
{
return false;
}
} #endregion #region 创建svn仓库 /// <summary>
/// 创建svn仓库
/// </summary>
/// <param name="name"></param>
/// <returns></returns>
public static bool CreateRepository(string name)
{
try
{
var svn = new ManagementClass("root\\VisualSVN", "VisualSVN_Repository", null);
ManagementBaseObject @params = svn.GetMethodParameters("Create"); //创建方法参数引用
@params["Name"] = name.Trim(); //传入参数
svn.InvokeMethod("Create", @params, null); //执行
return true;
}
catch (Exception)
{
return false;
}
} #endregion #region 创建svn仓库目录 /// <summary>
/// 创建svn仓库目录
/// </summary>
/// <param name="repositories"> </param>
/// <param name="name"></param>
/// <returns></returns>
public static bool CreateRepositoryFolders(string repositories, string[] name)
{
try
{
var repository = new ManagementClass("root\\VisualSVN", "VisualSVN_Repository", null);
ManagementObject repoObject = repository.CreateInstance();
if (repoObject != null)
{
repoObject.SetPropertyValue("Name", repositories);
ManagementBaseObject inParams = repository.GetMethodParameters("CreateFolders");
inParams["Folders"] = name;
inParams["Message"] = "";
repoObject.InvokeMethod("CreateFolders", inParams, null);
}
return true;
}
catch (Exception)
{
return false;
}
} #endregion //public static bool SetMemberGroup(string userName, string groupName)
//{
// try
// {
// var userObj = GetGroupUsersArr(groupName);
// foreach (ManagementBaseObject baseObject in userObj)
// {
// if (baseObject["Name"].ToString().ToLower() == userName)
// {
// return false;
// }
// }
// var addUser = new ManagementClass("root\\VisualSVN", "VisualSVN_SubversionAccount", null).CreateInstance();
// if (addUser != null)
// {
// addUser.SetPropertyValue("Name", userName);
// userObj.Add(addUser);
// } // var svnUser = new ManagementClass("root\\VisualSVN", "VisualSVN_Group", null);
// ManagementBaseObject inParams = svnUser.GetMethodParameters("SetMembers");
// inParams["Members"] = new object[] { userObj };
// svnUser.InvokeMethod("SetMembers", inParams, null);
// return true;
// }
// catch (Exception)
// {
// return false;
// }
//} #endregion #region 读取 /// <summary>
/// 读取指定组里的用户
/// </summary>
/// <param name="groupName"></param>
/// <returns></returns>
public static List<string> GetGroupUsers(string groupName)
{
var listUsers = new List<string>();
var group = new ManagementClass("root\\VisualSVN", "VisualSVN_Group", null);
ManagementObject instance = group.CreateInstance();
if (instance != null)
{
instance.SetPropertyValue("Name", groupName.Trim());
ManagementBaseObject outParams = instance.InvokeMethod("GetMembers", null, null); //通过实例来调用方法
if (outParams != null)
{
var members = outParams["Members"] as ManagementBaseObject[];
if (members != null)
{
foreach (ManagementBaseObject member in members)
{
object name = member["Name"];
listUsers.Add(name.ToString());
}
}
}
}
return listUsers;
} public static List<ManagementBaseObject> GetGroupUsersArr(string groupName)
{
var list = new List<ManagementBaseObject>();
var group = new ManagementClass("root\\VisualSVN", "VisualSVN_Group", null);
ManagementObject instance = group.CreateInstance();
if (instance != null)
{
instance.SetPropertyValue("Name", groupName.Trim());
ManagementBaseObject outParams = instance.InvokeMethod("GetMembers", null, null); //通过实例来调用方法
if (outParams != null)
{
var members = outParams["Members"] as ManagementBaseObject[];
if (members != null)
{
foreach (ManagementBaseObject member in members)
{
list.Add(member);
}
}
}
}
return list;
} #endregion
}
}


参考文章:

1.http://msdn.microsoft.com/en-us/library/bb404655

2.http://stackoverflow.com/questions/10017282/control-visualsvn-server-from-c-sharp

C#控制管理VisualSVN Server 分类: C# 2014-05-29 15:51 796人阅读 评论(0) 收藏的更多相关文章

  1. hadoop调优之一:概述 分类: A1_HADOOP B3_LINUX 2015-03-13 20:51 395人阅读 评论(0) 收藏

    hadoop集群性能低下的常见原因 (一)硬件环境 1.CPU/内存不足,或未充分利用 2.网络原因 3.磁盘原因 (二)map任务原因 1.输入文件中小文件过多,导致多次启动和停止JVM进程.可以设 ...

  2. Http,Https(SSL)的Url绝对路径,相对路径解决方案Security Switch 4.2的配置和使用 分类: ASP.NET 2014-11-05 12:51 97人阅读 评论(0) 收藏

    下载地址1:https://securityswitch.googlecode.com/files/SecuritySwitch%20v4.2.0.0%20-%20Binary.zip 下载地址2:h ...

  3. IOS之富文本编辑 分类: ios技术 2015-03-06 22:51 89人阅读 评论(0) 收藏

    之前做项目时遇到一个问题:          使用UITextView显示一段电影的简介,由于字数比较多,所以字体设置的很小,行间距和段间距也很小,一大段文字挤在一起看起来很别扭,想要把行间距调大,结 ...

  4. Find The Multiple 分类: 搜索 POJ 2015-08-09 15:19 3人阅读 评论(0) 收藏

    Find The Multiple Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 21851 Accepted: 8984 Sp ...

  5. DZY Loves Chemistry 分类: CF 比赛 图论 2015-08-08 15:51 3人阅读 评论(0) 收藏

    DZY Loves Chemistry time limit per test 1 second memory limit per test 256 megabytes input standard ...

  6. 周赛-DZY Loves Chessboard 分类: 比赛 搜索 2015-08-08 15:48 4人阅读 评论(0) 收藏

    DZY Loves Chessboard time limit per test 1 second memory limit per test 256 megabytes input standard ...

  7. Ultra-QuickSort 分类: POJ 排序 2015-08-03 15:39 2人阅读 评论(0) 收藏

    Ultra-QuickSort Time Limit: 7000MS   Memory Limit: 65536K Total Submissions: 48111   Accepted: 17549 ...

  8. Drainage Ditches 分类: POJ 图论 2015-07-29 15:01 7人阅读 评论(0) 收藏

    Drainage Ditches Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 62016 Accepted: 23808 De ...

  9. cf 61E. Enemy is weak 树状数组求逆序数(WA) 分类: Brush Mode 2014-10-19 15:16 104人阅读 评论(0) 收藏

    #include <iostream> #include <algorithm> #include <cstdio> #include <cstring> ...

随机推荐

  1. zencart资源

    http://www.zen-cart.cn/ http://www.ezencart.com/

  2. ASP.NET版Memcached监控工具(转载)

    在上一篇文章<使用Memcached提高.NET应用程序的性能>中周公讲述如何在.NET中使用Memcached来提高.NET应用程序的性 能.在实际的使用中有可能出现Memcached因 ...

  3. 【Derby 系列】Apache Derby 功能特点

    前言 进入Derby 的应用开发之前,浏览一下derby的功能集,这样在真正选择的时候,可以决定Derby是不是适合你的应用. 本篇的是[Derby 系列]初级的第3篇. 1. Derby 是关系型数 ...

  4. js中的getAttribute方法使用示例

    getAttribute()方法是一个函数.它只有一个参数——你打算查询的属性的名字,下面为大家介绍下其具体的使用   getAttribute()方法 至此,我们已经向大家介绍了两种检索特定元素节点 ...

  5. SpringMvc 相关,bean map转换,百度天气,base64.js,jsBase64.java;

    1. Map<String, Object>与JavaBean[POJO, Model]转换; //model public class model{ private int id; pr ...

  6. tyvj1213 嵌套矩形

    描述    有n个矩形,每个矩形可以用a,b来描述,表示长和宽.矩形X(a,b)可以嵌套在矩形Y(c,d)中当且仅当a<c,b<d或者b<c,a<d(相当于旋转X90度).例如 ...

  7. POJ 3537 Crosses and Crosses

    Crosses and Crosses Time Limit: 3000MS Memory Limit: 65536K Total Submissions: 2237 Accepted: 821 Ca ...

  8. 实战 -- Redis2.4.2集成spring3.2.2

    redis.host=... redis.port= redis.pass= redis.timeout= #最大能够保持idel状态的对象数 redis.maxIdle= #最大分配的对象数 red ...

  9. Windbg对过滤驱动DriverEntry函数下断点技巧

    方法1: 1> 先用DeviceTree.exe查看指定的过滤驱动的Load Address(加载地址) 2> 再用LordPE.EXE查看指定过滤驱动文件的入口点地址 3> 计算过 ...

  10. [Effective JavaScript 笔记] 第1章:让自己习惯javascript小结

    在这里整理一下,每条对应的提示 第1条:了解使用的js版本 确定应用程序支持的js的版本(浏览器也是应用程序噢) 确保使用的js特性是应用程序支持的(要不写了也运行不了) 总是在严格模式下编写和测试代 ...