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);
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的更多相关文章

  1. [译]C#控制管理VisualSVN Server

    VisualSVN Server可以用WMI接口管理(Windows Management Instrumentation). VisualSVN Server安装的计算机中,位于%VISUALSVN ...

  2. C#控制管理VisualSVN Server 分类: C# 2014-05-29 15:51 796人阅读 评论(0) 收藏

    VisualSVN Server可以用WMI接口管理(Windows Management Instrumentation). VisualSVN Server安装的计算机中,位于%VISUALSVN ...

  3. 项目管理实践教程二、源代码控制【Source Control Using VisualSVN Server and TortoiseSVN】

    在第一篇文章 项目管理实践教程一.工欲善其事,必先利其器[Basic Tools]发布后,根据大家的回复,我需要向大家说明几个问题: 1.为什么要用VisualSVN Server,而不用Subver ...

  4. 源代码管理(Windows + VisualSVN Server + TortoiseSVN + VS2010)

    之前项目中使用过SVN管理源代码,但是都是链接别人搭建的服务器,现在感觉每周保留一个版本蛮麻烦的,就搭建一个,方便以后管理代码. 1.安装VisualSVN Server( VisualSVN Ser ...

  5. 如何创建 SVN 服务器,并搭建自己的 SVN 仓库 如何将代码工程添加到VisualSVN Server里面管理

    如何创建 SVN 服务器,并搭建自己的 SVN 仓库,附链接: https://jingyan.baidu.com/article/6b97984dca0d9c1ca3b0bf40.html 如何将代 ...

  6. VisualSVN Server的配置和使用方法(转)

    1.为什么要用VisualSVN Server,而不用Subversion? 回答: 因为如果直接使用Subversion,那么在Windows 系统上,要想让它随系统启动,就要封装SVN Serve ...

  7. (转)TortoiseSVN与VisualSVN Server搭建SVN版本控制系统

    本片主要介绍如何搭建SVN版本控制系统,主要使用工具: 1 客户端:TortoiseSVN (小乌龟) 2 服务端:VisualSVN Server 搭建出图形化管理,以及右键菜单版本控制管理的SVN ...

  8. TortoiseSVN与VisualSVN Server搭建SVN版本控制系统

    本片主要介绍如何搭建SVN版本控制系统,主要使用工具: 1 客户端:TortoiseSVN (小乌龟) 2 服务端:VisualSVN Server 搭建出图形化管理,以及右键菜单版本控制管理的SVN ...

  9. VisualSVN Server的配置和使用方法 图文

    转载 http://www.jb51.net/article/17365.htm VisualSVN Server是免费的,而VisualSVN是收费的.VisualSVN是SVN的客户端,和Visu ...

随机推荐

  1. 第一部分 mongodb 基础篇

    什么是NoSQL认识MongoDBMongDB的下载与安装MongoDB的体系结构常用命令(基本的增删改查)客户端GUI工具集合 一: 什么是NoSql1 NoSQL简介NoSQL是Not Only ...

  2. 如果你也和我一样,OSX反应慢,不妨试试这个

  3. Unity3d三大光照渲染介绍

      重要:在目前市面上常见的游戏引擎中,主要采用以下三种灯光实现方式: 顶点照明渲染路径细节 Vertex Lit Rendering Path Details 正向渲染路径细节 Forward Re ...

  4. 行为Behavior的使用

    原文地址:http://www.it610.com/article/4918541.htm 行为就是继承yii\base\behavior,可以绑定到任意yii\base\compent实例上,然后这 ...

  5. 可选择Email和用户名登录的代码

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  6. linux 访问tomcat 管理页面时 You are not authorized to view this page 403(真实可用)

    ava代码 收藏代码 You are not authorized to view this page. If you have not changed any configuration files ...

  7. java 打包过程及如何使用第三方jar包

    地址:http://wenku.baidu.com/view/44a1bbed81c758f5f61f6779.html或者 http://wenku.it168.com/d_000575231.sh ...

  8. linux在所有文件中查找某一个字符

    # find <directory> -type f -name "*.c" | xargs grep "<strings>" < ...

  9. Goldbach's Conjecture

     Goldbach's Conjecture Time Limit:1000MS     Memory Limit:65536KB     64bit IO Format:%I64d & %I ...

  10. NGUI例子Scroll View场景中item添加点击后自动滑到终点

    http://blog.csdn.net/luyuncsd123/article/details/22914497 最近在做一个项目的UI,需求是1.拖动items后当永远有一个item保存在中间位置 ...