C#控制管理VisualSVN Server 分类: C# 2014-05-29 15:51 796人阅读 评论(0) 收藏
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 分类: C# 2014-05-29 15:51 796人阅读 评论(0) 收藏的更多相关文章
- hadoop调优之一:概述 分类: A1_HADOOP B3_LINUX 2015-03-13 20:51 395人阅读 评论(0) 收藏
hadoop集群性能低下的常见原因 (一)硬件环境 1.CPU/内存不足,或未充分利用 2.网络原因 3.磁盘原因 (二)map任务原因 1.输入文件中小文件过多,导致多次启动和停止JVM进程.可以设 ...
- 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 ...
- IOS之富文本编辑 分类: ios技术 2015-03-06 22:51 89人阅读 评论(0) 收藏
之前做项目时遇到一个问题: 使用UITextView显示一段电影的简介,由于字数比较多,所以字体设置的很小,行间距和段间距也很小,一大段文字挤在一起看起来很别扭,想要把行间距调大,结 ...
- 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 ...
- 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 ...
- 周赛-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 ...
- Ultra-QuickSort 分类: POJ 排序 2015-08-03 15:39 2人阅读 评论(0) 收藏
Ultra-QuickSort Time Limit: 7000MS Memory Limit: 65536K Total Submissions: 48111 Accepted: 17549 ...
- Drainage Ditches 分类: POJ 图论 2015-07-29 15:01 7人阅读 评论(0) 收藏
Drainage Ditches Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 62016 Accepted: 23808 De ...
- cf 61E. Enemy is weak 树状数组求逆序数(WA) 分类: Brush Mode 2014-10-19 15:16 104人阅读 评论(0) 收藏
#include <iostream> #include <algorithm> #include <cstdio> #include <cstring> ...
随机推荐
- 一种透明效果的view
设置这个view背景色: [UIColor colorWithRed: green: blue: alpha:0.3]; 效果如下:
- 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 ...
- linux下忘记密码怎么办,如何重置密码
文章转自:http://www.2cto.com/os/201104/86881.html 以下是网上的方法,我用的是第一种方法,经测试有效. 方法一:# /etc/init.d/mysql stop ...
- javascript 快速排序
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- HDOJ 2389 Rain on your Parade
HK.... Rain on your Parade Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 655350/165535 K ...
- Parencodings(imitate)
Parencodings Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 20679 Accepted: 12436 De ...
- Java笔记--泛型总结与详解
泛型简介: 在泛型没有出来之前,编写存储对象的数据结构是很不方便的.如果要针对每类型的对象写一个数据结构, 则当需要将其应用到其他对象上时,还需要重写这个数据结构.如果使用了Object类型, ...
- Coursera台大机器学习课程笔记8 -- Linear Regression
之前一直在讲机器为什么能够学习,从这节课开始讲一些基本的机器学习算法,也就是机器如何学习. 这节课讲的是线性回归,从使Ein最小化出发来,介绍了 Hat Matrix,要理解其中的几何意义.最后对比了 ...
- hrb 2134 素数
分拆素数和 Time Limit: 1000 MS Memory Limit: 32768 K Total Submit: 176(99 users) Total Accepted: 106(93 u ...
- Linux 高可用开源方案 Keepalived VS Heartbeat对比
1)Keepalived使用更简单:从安装.配置.使用.维护等角度上对比,Keepalived都比Heartbeat要简单得多,尤其是Heartbeat2.1.4后拆分成3个子项目,安装.配置.使用都 ...