`
dannyhz
  • 浏览: 379420 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
文章分类
社区版块
存档分类
最新评论

c#访问visualsvn server, 按照其 mof文件, 控制其服务端的功能,如建用户 设访问权限

 
阅读更多
https://yq.aliyun.com/articles/15964


摘要: VisualSVN Server可以用WMI接口管理(Windows Management Instrumentation)。 VisualSVN Server安装的计算机中,位于%VISUALSVN_SERVER%\WMI下的MOF文件描述了该接口。 


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
    }
}



分享到:
评论

相关推荐

    VisualSVN-Server V3.9.3 Windows SVN 服务端

    3. **全面的权限控制**:VisualSVN Server支持基于Apache的访问控制,允许管理员为每个仓库定义详细的用户和组权限,确保代码的安全性。 4. **高性能**:利用Windows的性能优势,VisualSVN Server提供快速的文件...

    VisualSVN Server最新免费版本

    2. **集成Active Directory**:VisualSVN Server支持与Active Directory进行集成,可以利用AD的用户和组信息来控制对SVN仓库的访问权限,简化了权限管理。 3. **Web界面管理**:通过内置的Web界面,管理员可以远程...

    VisualSVN-Server V5.0.2 Windows SVN 服务端软件(32 位 + 64 位)

    - VisualSVN Server提供了直观的管理界面,允许管理员创建用户账户,分配用户到特定的SVN仓库,并设定权限级别,如读取、写入和完全控制。 - 它还支持Active Directory集成,使得组织内的用户认证和权限管理更为...

    VisualSVN Server增加在线修改用户密码的功能

    2、修改conf目录下的httpd-custom.conf文件, 把“ScriptAlias”一行后面的路径修改为你的机器上的VisualSVN Server的实际路径; ------------------------- LoadModule alias_module bin/mod_alias.so LoadModule ...

    VisualSVN-Server-3.9.2 64位服务端

    - VisualSVN Server整合了Subversion的核心功能,并提供了图形化的管理界面,使得设置和管理SVN仓库以及用户权限变得直观易用。 - 它支持Active Directory集成,可以方便地与企业的用户账户进行同步,实现基于角色...

    VisualSVN Server的配置和使用方法

    VisualSVN Server是一款基于Windows平台的Subversion(SVN)服务器管理工具,用于集中管理和控制版本控制系统中的代码和其他文件。以下将详细阐述其配置和使用步骤。 1. **VisualSVN Server的安装与初始化** - ...

    VisualSVN-Server-2.1.4服务端.rar

    3. 用户与组管理:VisualSVN Server支持Active Directory集成,可以方便地管理用户和用户组,设定不同的访问权限,确保代码的安全性。 三、版本库操作 1. 创建版本库:在VisualSVN Server Manager中,点击“版本库...

    VisualSVN Server-svn服务端工具

    它的安装过程简洁明了,只需运行提供的msi安装文件(如"VisualSVN-Server-2.1.5.msi"),按照向导步骤即可快速完成配置。 其次,VisualSVN Server集成了mmc(Microsoft Management Console)管理工具,这是一个强大...

    SVN服务端:VisualSVN-Server-3.4.2

    10. **权限管理**:VisualSVN Server提供了细粒度的权限控制,可以为不同的用户或用户组分配读取、写入或完全访问权限,确保了项目的安全性。 通过VisualSVN Server 3.4.2,Windows用户可以获得一个强大且易用的SVN...

    VisualSVN-Server-2.1.7(服务端)

    首先,安装VisualSVN Server 2.1.7的过程中,用户可以通过简单的向导完成配置,包括设置SVN仓库的位置、定义用户访问权限、配置SSL加密等。其中,【压缩包子文件的文件名称列表】中的"3333VisualSVN-Server-2.1.7...

    【精华】 VisualSVN-Server

    因为如果直接使用Subversion,那么在Windows 系统上,要想让它随系统启动,就要封装SVN Server为windws service,还要通过修改配置文件来控制用户权限,另外如果要想以Web方式【http协议】访问,一般还要安装配置...

    VisualSVN-4.0.5 VisualSVN Server 4.10

    - 用户可以通过VisualSVN Server管理多个SVN仓库,并对每个仓库进行详细的访问控制,设置用户和组的权限。 - 新版本可能提供了更多仓库级别的设置选项,如备份策略、SSL证书管理等。 3. **用户和权限管理** - ...

    VisualSVN Server 新增用户修改登录密码的功能

    总的来说,通过VisualSVN Server提供的用户管理功能,我们可以轻松地实现让用户自行修改登录密码,这不仅提高了工作效率,也增强了系统的安全性。正确配置和管理VisualSVN Server是保证团队协同开发顺利进行的关键...

    为VisualSVN Server增加在线修改用户密码的功能

    总之,通过以上步骤,我们成功地为VisualSVN Server添加了在线修改用户密码的功能,提高了用户管理和权限控制的便利性。这种方法适用于VisualSVN Server的2.5.4及后续版本,如2.6.0。需要注意的是,对服务器配置的...

    VisualSVN server 服务端和 TortoiseSVN客户端

    将两者结合使用,开发者可以在本地使用TortoiseSVN进行日常开发工作,如编辑、提交代码,而VisualSVN Server则在服务器端负责存储和管理版本历史,同时处理多用户间的协同和权限控制。这种搭配是Windows环境下进行...

    VisualSVN Server Web管理工具

    在下载并部署"VisualSvn WebServer"压缩包后,用户需要按照文档的指示进行安装和配置,包括设置EXTJS库、连接到VisualSVN Server服务以及配置Web服务器(如IIS)以代理请求。安装完成后,通过Web浏览器访问管理页面...

    VisualSVN-Server-2.1.7.zip

    在实际开发环境中,VisualSVN Server 2.1.7支持多种版本控制客户端,如TortoiseSVN、AnkhSVN等,这些客户端提供了直观的图形用户界面,使得开发者可以在熟悉的Windows资源管理器中进行版本控制操作。通过这些客户端...

    VisualSVN Server(svn服务端工具)

    3. **集成Active Directory**:VisualSVN Server可以直接与Active Directory进行集成,利用已有的用户账户和组来控制对SVN仓库的访问。这简化了权限管理,避免了维护单独的身份验证机制。 4. **自动备份与恢复**:...

    VisualSVN Server2.5.5增加在线修改密码功能

    5. **用户权限**:为了保证安全性,可能需要设定一些权限规则,限制只有特定的用户或组能够访问密码修改功能。这可以通过Apache的访问控制指令来实现。 6. **日志记录**:当用户修改密码时,系统应该记录这些活动以...

    VisualSVN-Server-4.3.4-x64.rar

    安装文件"VisualSVN-Server-4.3.4-x64.msi"是一个标准的Windows Installer包,用户可以通过双击执行安装过程,按照向导提示完成配置,包括设置服务器地址、创建仓库、分配用户权限等。 在“淘淘商城”这样的电商...

Global site tag (gtag.js) - Google Analytics