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. JSP 使用

    JSP教程: http://www.w3cschool.cc/jsp/jsp-tutorial.html jsp语法: 任何语言都有自己的语法,JAVA中有,JSP虽然是在JAVA上的一种应用,但是依 ...

  2. DetachedCriteria详细使用

    一.基本使用 1. 说明 Restrictions 是产生查询条件的工具类. 2. 定义 可以直接用class 创建 DetachedCriteria searDc = DetachedCriteri ...

  3. Gradle用户指南(1)-Gradle安装

    前置条件 Gradle 需要 Java JDK 或者 JRE,版本是 6 及以上.Gradle 将会装载自己的 Groovy 库,因此,Groovy 不需要被安装.任何存在的 Groovy 安装都会被 ...

  4. 新浪微博客户端(22)-创建微博Cell

    DJStatusCell.h #import <UIKit/UIKit.h> @class DJStatusCellFrame; @interface DJStatusCell : UIT ...

  5. socket基本

    fd_set用法: http://blog.sina.com.cn/s/blog_5c8d13830100erzs.htm socket连接: lpszHost="127.0.0.1&quo ...

  6. 保护隐私:清除cookie、禁用cookie确保安全【分享给身边的朋友吧】

    常在网上漂,隐私保不了.ytkah深有体会,某天搜索一个词,然后你就能在一些网站上看到这个词的相关广告,神奇吧?这就是你的浏览器cookie泄露了,或者更严重地说是你的隐私泄露了,可怕吧!搜索引擎通过 ...

  7. 复制”链接文件“到虚拟机(VirtualBox)的”共享文件夹“时报错:创建符号链接时报错:只读文件系统

    问题描述: 1.Ubuntu 中的 /www/目录,是宿主主机 Windows 7 以“共享文件夹”的形式挂载的: 2./etc/php.ini 是 /opt/software/php/etc/php ...

  8. DLL注入之注册表

    0x00 唠叨 编写本系列文章纯属为了系统学习DLL注入的方法,所以很多方法可能已经过时,希望各位看官勿喷.当然若有更好的方法,希望不腻赐教.若本文有任何错的地方,也希望各位指正.谢谢! 0x01 适 ...

  9. Powershell学习之道-文件夹共享及磁盘映射

    导读 在Linux环境下,我们很轻易就能得心应手地通过命令操作一切事物,在Windows下,Powershell也算是后起之秀,提供大量的cmdlet以及c#的横向拓展.下面将由小编带领大家通过Pow ...

  10. [BZOJ1941][Sdoi2010]Hide and Seek

    [BZOJ1941][Sdoi2010]Hide and Seek 试题描述 小猪iPig在PKU刚上完了无聊的猪性代数课,天资聪慧的iPig被这门对他来说无比简单的课弄得非常寂寞,为了消除寂寞感,他 ...