C#控制管理VisualSVN Server
原文:C#控制管理VisualSVN Server

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

下面一些代码供参考:

[csharp] view plaincopyprint?
  1. using System.Management;
  2. using System.Management.Instrumentation;

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

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

[csharp] view plaincopyprint?
  1. ManagementClass userClass = newManagementClass("root\\VisualSVN","VisualSVN_User",null);
  2. // Obtain in-parameters for the method
  3. ManagementBaseObject inParams =
  4. userClass.GetMethodParameters("Create");
  5. // Add the input parameters.
  6. inParams["Name"] = "user1";
  7. inParams["Password"] = "secret";
  8. // Execute the method and obtain the return values.
  9. ManagementBaseObject outParams =
  10. userClass.InvokeMethod("Create", inParams, null);

2)创建新的repository 'Repo1'

[csharp] view plaincopyprint?
  1. ManagementClass repoClass = newManagementClass("root\\VisualSVN","VisualSVN_Repository",null);
  2. // Obtain in-parameters for the method
  3. ManagementBaseObject inParams =
  4. repoClass.GetMethodParameters("Create");
  5. // Add the input parameters.
  6. inParams["Name"] = "Repo1";
  7. // Execute the method and obtain the return values.
  8. ManagementBaseObject outParams =
  9. repoClass.InvokeMethod("Create", inParams, null);
  3)设置SID S-1-5-32-545 ('BUILTIN\Users') Windows用户组对'Test' repository的读/写权限. FYI: AccessLevel 值在MOF有描述: "0 - 无权限, 1 - 只读, 2 - 读/写".
[csharp] view plaincopyprint?
  1. ManagementClass userClass = newManagementClass("root\\VisualSVN","VisualSVN_WindowsAccount",null);
  2. ManagementClass authzClass = newManagementClass("root\\VisualSVN","VisualSVN_SecurityDescriptor",null);
  3. ManagementClass permClass = newManagementClass("root\\VisualSVN","VisualSVN_PermissionEntry",null);
  4. ManagementObject userObject = userClass.CreateInstance();
  5. userObject.SetPropertyValue("SID","S-1-5-32-545");
  6. ManagementObject permObject = permClass.CreateInstance();
  7. permObject.SetPropertyValue("Account", userObject);
  8. permObject.SetPropertyValue("AccessLevel", 2);
  9. ManagementObject repo = newManagementObject("VisualSVN_Repository.Name='Test'");
  10. ManagementBaseObject inParams =
  11. authzClass.GetMethodParameters("SetSecurity");
  12. inParams["Object"] = repo;
  13. inParams["Permissions"] = newobject[] { permObject };
  14. ManagementBaseObject outParams =
  15. authzClass.InvokeMethod("SetSecurity", inParams, null);
封装后的Helper类:
[csharp] view plaincopyprint?
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Management;//调用windows WMI需引入此类库
  5. namespace Whir.Software.InteralServerManage.SVNManager
  6. {
  7. /// <summary>
  8. ///     Visual SVN 操作辅助类:使用WMI控制VisualSVN,MOF文件存在位置:C:\Program Files\VisualSVN Server\WMI\VisualSVNServer.mof
  9. /// </summary>
  10. public class SVNHelper
  11. {
  12. #region 设置
  13. #region 设置仓库权限
  14. public enum AccessLevel : uint
  15. {
  16. NoAccess = 0,
  17. ReadOnly,
  18. ReadWrite
  19. }
  20. /// <summary>
  21. ///     设置仓库权限(给用户授权)
  22. /// </summary>
  23. /// <param name="userName">用户名</param>
  24. /// <param name="repository">SVN仓库</param>
  25. public static bool SetRepositoryPermission(string userName, string repository)
  26. {
  27. return SetRepositoryPermission(userName, repository, 2);
  28. }
  29. /// <summary>
  30. ///     设置仓库权限(给用户授权)
  31. /// </summary>
  32. /// <param name="users">用户名</param>
  33. /// <param name="repository">SVN仓库</param>
  34. public static bool SetRepositoryPermission(List<string> users, string repository)
  35. {
  36. string userNames = "";
  37. foreach (string user in users)
  38. {
  39. userNames += user + ",";
  40. }
  41. return SetRepositoryPermission(userNames, repository, 2);
  42. }
  43. /// <summary>
  44. ///     设置仓库权限(给用户授权)
  45. /// </summary>
  46. /// <param name="userName">用户名</param>
  47. /// <param name="repository">SVN仓库</param>
  48. /// <param name="permission"> 权限码:0拒绝,1只读,2读写</param>
  49. public static bool SetRepositoryPermission(string userName, string repository, int permission)
  50. {
  51. try
  52. {
  53. string[] users = userName.Split(new[] {","}, StringSplitOptions.RemoveEmptyEntries);
  54. IDictionary<string, AccessLevel> permissions = GetPermissions(repository, "/");
  55. foreach (string s in users)
  56. {
  57. if (!permissions.ContainsKey(s))
  58. {
  59. permissions.Add(s, AccessLevel.ReadWrite);
  60. }
  61. }
  62. SetPermissions(repository, "/", permissions);
  63. return true;
  64. }
  65. catch (Exception)
  66. {
  67. return false;
  68. }
  69. }
  70. /// <summary>
  71. ///     根据仓库名取得仓库实体
  72. /// </summary>
  73. /// <param name="name"></param>
  74. /// <returns></returns>
  75. private static ManagementObject GetRepositoryObject(string name)
  76. {
  77. return new ManagementObject("root\\VisualSVN", string.Format("VisualSVN_Repository.Name='{0}'", name), null);
  78. }
  79. /// <summary>
  80. ///     读取权限实体
  81. /// </summary>
  82. /// <param name="sid"></param>
  83. /// <param name="accessLevel"></param>
  84. /// <returns></returns>
  85. private static ManagementObject GetPermissionObject(string sid, AccessLevel accessLevel)
  86. {
  87. var accountClass = new ManagementClass("root\\VisualSVN",
  88. "VisualSVN_WindowsAccount", null);
  89. var entryClass = new ManagementClass("root\\VisualSVN",
  90. "VisualSVN_PermissionEntry", null);
  91. ManagementObject account = accountClass.CreateInstance();
  92. if (account != null) account["SID"] = sid;
  93. ManagementObject entry = entryClass.CreateInstance();
  94. if (entry != null)
  95. {
  96. entry["AccessLevel"] = accessLevel;
  97. entry["Account"] = account;
  98. return entry;
  99. }
  100. return null;
  101. }
  102. /// <summary>
  103. ///     设置仓库权限
  104. /// </summary>
  105. /// <param name="repositoryName"></param>
  106. /// <param name="path"></param>
  107. /// <param name="permissions"></param>
  108. private static void SetPermissions(string repositoryName, string path,
  109. IEnumerable<KeyValuePair<string, AccessLevel>> permissions)
  110. {
  111. ManagementObject repository = GetRepositoryObject(repositoryName);
  112. ManagementBaseObject inParameters = repository.GetMethodParameters("SetSecurity");
  113. inParameters["Path"] = path;
  114. IEnumerable<ManagementObject> permissionObjects =
  115. permissions.Select(p => GetPermissionObject(p.Key, p.Value));
  116. inParameters["Permissions"] = permissionObjects.ToArray();
  117. repository.InvokeMethod("SetSecurity", inParameters, null);
  118. }
  119. /// <summary>
  120. ///     读取仓库权限
  121. /// </summary>
  122. /// <param name="repositoryName"></param>
  123. /// <param name="path"></param>
  124. /// <returns></returns>
  125. private static IDictionary<string, AccessLevel> GetPermissions(string repositoryName, string path)
  126. {
  127. ManagementObject repository = GetRepositoryObject(repositoryName);
  128. ManagementBaseObject inParameters = repository.GetMethodParameters("GetSecurity");
  129. inParameters["Path"] = path;
  130. ManagementBaseObject outParameters = repository.InvokeMethod("GetSecurity", inParameters, null);
  131. var permissions = new Dictionary<string, AccessLevel>();
  132. if (outParameters != null)
  133. foreach (ManagementBaseObject p in (ManagementBaseObject[]) outParameters["Permissions"])
  134. {
  135. // NOTE: This will fail if VisualSVN Server is configured to use Subversion
  136. // authentication.  In that case you'd probably want to check if the account
  137. // is a VisualSVN_WindowsAccount or a VisualSVN_SubversionAccount instance
  138. // and tweak the property name accordingly.
  139. var account = (ManagementBaseObject) p["Account"];
  140. var sid = (string) account["SID"];
  141. var accessLevel = (AccessLevel) p["AccessLevel"];
  142. permissions[sid] = accessLevel;
  143. }
  144. return permissions;
  145. }
  146. #endregion
  147. #region 创建用户组
  148. /// <summary>
  149. ///     创建用户组
  150. /// </summary>
  151. public static bool CreatGroup(string groupName)
  152. {
  153. try
  154. {
  155. var svn = new ManagementClass("root\\VisualSVN", "VisualSVN_Group", null);
  156. ManagementBaseObject @params = svn.GetMethodParameters("Create");
  157. @params["Name"] = groupName.Trim();
  158. @params["Members"] = new object[] {};
  159. svn.InvokeMethod("Create", @params, null);
  160. return true;
  161. }
  162. catch (Exception)
  163. {
  164. return false;
  165. }
  166. }
  167. #endregion
  168. #region 创建用户
  169. /// <summary>
  170. ///     创建用户
  171. /// </summary>
  172. /// <param name="userName"></param>
  173. /// <param name="password"></param>
  174. /// <returns></returns>
  175. public static bool CreateUser(string userName, string password)
  176. {
  177. try
  178. {
  179. var svn = new ManagementClass("root\\VisualSVN", "VisualSVN_User", null);
  180. ManagementBaseObject @params = svn.GetMethodParameters("Create");
  181. @params["Name"] = userName.Trim();
  182. @params["Password"] = password.Trim();
  183. svn.InvokeMethod("Create", @params, null);
  184. return true;
  185. }
  186. catch (Exception)
  187. {
  188. return false;
  189. }
  190. }
  191. #endregion
  192. #region  创建svn仓库
  193. /// <summary>
  194. ///     创建svn仓库
  195. /// </summary>
  196. /// <param name="name"></param>
  197. /// <returns></returns>
  198. public static bool CreateRepository(string name)
  199. {
  200. try
  201. {
  202. var svn = new ManagementClass("root\\VisualSVN", "VisualSVN_Repository", null);
  203. ManagementBaseObject @params = svn.GetMethodParameters("Create"); //创建方法参数引用
  204. @params["Name"] = name.Trim(); //传入参数
  205. svn.InvokeMethod("Create", @params, null); //执行
  206. return true;
  207. }
  208. catch (Exception)
  209. {
  210. return false;
  211. }
  212. }
  213. #endregion
  214. #region  创建svn仓库目录
  215. /// <summary>
  216. ///     创建svn仓库目录
  217. /// </summary>
  218. /// <param name="repositories"> </param>
  219. /// <param name="name"></param>
  220. /// <returns></returns>
  221. public static bool CreateRepositoryFolders(string repositories, string[] name)
  222. {
  223. try
  224. {
  225. var repository = new ManagementClass("root\\VisualSVN", "VisualSVN_Repository", null);
  226. ManagementObject repoObject = repository.CreateInstance();
  227. if (repoObject != null)
  228. {
  229. repoObject.SetPropertyValue("Name", repositories);
  230. ManagementBaseObject inParams = repository.GetMethodParameters("CreateFolders");
  231. inParams["Folders"] = name;
  232. inParams["Message"] = "";
  233. repoObject.InvokeMethod("CreateFolders", inParams, null);
  234. }
  235. return true;
  236. }
  237. catch (Exception)
  238. {
  239. return false;
  240. }
  241. }
  242. #endregion
  243. //public static bool SetMemberGroup(string userName, string groupName)
  244. //{
  245. //    try
  246. //    {
  247. //        var userObj = GetGroupUsersArr(groupName);
  248. //        foreach (ManagementBaseObject baseObject in userObj)
  249. //        {
  250. //            if (baseObject["Name"].ToString().ToLower() == userName)
  251. //            {
  252. //                return false;
  253. //            }
  254. //        }
  255. //        var addUser = new ManagementClass("root\\VisualSVN", "VisualSVN_SubversionAccount", null).CreateInstance();
  256. //        if (addUser != null)
  257. //        {
  258. //            addUser.SetPropertyValue("Name", userName);
  259. //            userObj.Add(addUser);
  260. //        }
  261. //        var svnUser = new ManagementClass("root\\VisualSVN", "VisualSVN_Group", null);
  262. //        ManagementBaseObject inParams = svnUser.GetMethodParameters("SetMembers");
  263. //        inParams["Members"] = new object[] { userObj };
  264. //        svnUser.InvokeMethod("SetMembers", inParams, null);
  265. //        return true;
  266. //    }
  267. //    catch (Exception)
  268. //    {
  269. //        return false;
  270. //    }
  271. //}
  272. #endregion
  273. #region 读取
  274. /// <summary>
  275. ///     读取指定组里的用户
  276. /// </summary>
  277. /// <param name="groupName"></param>
  278. /// <returns></returns>
  279. public static List<string> GetGroupUsers(string groupName)
  280. {
  281. var listUsers = new List<string>();
  282. var group = new ManagementClass("root\\VisualSVN", "VisualSVN_Group", null);
  283. ManagementObject instance = group.CreateInstance();
  284. if (instance != null)
  285. {
  286. instance.SetPropertyValue("Name", groupName.Trim());
  287. ManagementBaseObject outParams = instance.InvokeMethod("GetMembers", null, null); //通过实例来调用方法
  288. if (outParams != null)
  289. {
  290. var members = outParams["Members"] as ManagementBaseObject[];
  291. if (members != null)
  292. {
  293. foreach (ManagementBaseObject member in members)
  294. {
  295. object name = member["Name"];
  296. listUsers.Add(name.ToString());
  297. }
  298. }
  299. }
  300. }
  301. return listUsers;
  302. }
  303. public static List<ManagementBaseObject> GetGroupUsersArr(string groupName)
  304. {
  305. var list = new List<ManagementBaseObject>();
  306. var group = new ManagementClass("root\\VisualSVN", "VisualSVN_Group", null);
  307. ManagementObject instance = group.CreateInstance();
  308. if (instance != null)
  309. {
  310. instance.SetPropertyValue("Name", groupName.Trim());
  311. ManagementBaseObject outParams = instance.InvokeMethod("GetMembers", null, null); //通过实例来调用方法
  312. if (outParams != null)
  313. {
  314. var members = outParams["Members"] as ManagementBaseObject[];
  315. if (members != null)
  316. {
  317. foreach (ManagementBaseObject member in members)
  318. {
  319. list.Add(member);
  320. }
  321. }
  322. }
  323. }
  324. return list;
  325. }
  326. #endregion
  327. }
  328. }
参考文章:

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

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

posted on 2014-10-02 13:00 NET未来之路 阅读(...) 评论(...) 编辑 收藏

转载于:https://www.cnblogs.com/lonelyxmas/p/4004015.html

C#控制管理VisualSVN Server相关推荐

  1. VisualSVN Server Enterprise 5.1.1 Crack

    VisualSVN Server 提供以下主要功能. Active Directory 单点登录 允许用户使用他们当前的 Active Directory 域凭据访问 VisualSVN Server ...

  2. VisualSVN Server版本库搭建

    VisualSVN Server版本库搭建 VisualsvnServer用途: 软件开发公司的代码是公司的核心,是公司最需要保护的文件资源,为了防止公司代码的泄露,放到公网的免费版本控制服务器商虽然 ...

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

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

  4. ad域管理与维护_在NAS SMB卷上使用VisualSVN Server维护代码库

    VisualSVN Server[1] 是 Windows 平台上流行的 SVN 形式的代码管理工具.以下我们将介绍把 NAS SMB 卷作为 VisualSVN 代码库存储中心时会遇到的几个问题以及 ...

  5. VS2008源代码管理软件组合-visualSVN Server+TortoiseSVN+AnkhSvn

    基于VS2008 Team开发环境的源代码版本控制需要以下软件,安装顺序没有限制,一切默认安装即可: (1)       VisualSvn Server(版本控制服务器)免费开源软件. 版本号:Vi ...

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

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

  7. Windows下VisualSVN Server的安装与配置方法(图文)

    这篇文章主要介绍了Windows下VisualSVN Server的安装与配置方法,比较详细,需要的朋友可以参考下 VisualSVN Server是免费的,而VisualSVN是收费的.Visual ...

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

    VisualSVN Server是免费的,而VisualSVN是收费的.VisualSVN是SVN的客户端,和Visual Studio集成在一起, VisualSvn Server是SVN的服务器端 ...

  9. VisualSVN server 无法启动

    以前装了VisualSVN server 在Windows xp下部署特别快捷.管理起来也特别方便,一般要求不高,需要快速建立svn的话这是一个不错的选择. 最近发现svn启动不起来了,重新安装.重启 ...

最新文章

  1. AMD 和 Intel 之战:CPU 哪家强?
  2. iOS学习资源(三)
  3. oracle如何启动和停止服务,CentOS启动和停止服务详解
  4. python windows安装readline
  5. JavaWeb——IOC
  6. 学习——java内存模型
  7. 回归分析常数项t值没有显著异于零怎么办_洋蜜蜂统计辅导专题:回归分析关键词统计量须知...
  8. 地图加载不出来坐标标识点图片
  9. java更新word文档目录页码
  10. Flume Agent 组件如何协同工作
  11. amd支持服务器内存,AMD专用内存为什么只能在AMD平台使用?与普通内存有什么区别?...
  12. 解决服务器空间满/var/lib/docker/overlay2占用很大,千万慎用 docker system prune -a清理 mongodb等数据库容器及镜像可能被删,找回恢复数据
  13. SQL Server事务日志分析
  14. STM32贪吃蛇实现
  15. 虚拟化查看服务器sn,linux 查看服务器sn号
  16. 【HTCVR】VRTK基本功能脚本说明
  17. Unity_导航系统
  18. Merkle Patricia Tree 梅克尔帕特里夏树(MPT)规范
  19. 量化交易 实战第二课 金融时间序列分析 Part 1
  20. Everything介绍

热门文章

  1. NOIP2018 赛前集训总结反思
  2. JZOJ 3870. 【NOIP2014八校联考第4场第1试10.19】单词检索(search)
  3. python 浮点数精度丢失_javascript解决小数的加减乘除精度丢失的方案
  4. win10win键无反应_最新Science:强烷基CH键的无定向硼化作用
  5. java实现图形界面输入半径求圆面积_测试开发工程师系列之Android自动化测试Appium(Python)连载(7)安卓图形界面...
  6. 中国邮政编码.html,全国邮政编码一览表.doc
  7. android动态刷新主页,Android app 页面加载统计工具
  8. yaml数组解析_yaml格式详解
  9. inner join 和 exists 效率_19条效率至少提高3倍的MySQL技巧
  10. [杂记]对RSA算法的数学原理的一点思考