Visual SVN服务器C#代码未正确添加用户权限(版本2.7.2)

Visual SVN服务器C#代码未正确添加用户权限(版本2.7.2),c#,svn,wmi,visualsvn-server,C#,Svn,Wmi,Visualsvn Server,故事时间!我们的一位更不满的员工在最后一天的前一天决定升级visual svn并修改我们的web界面。我们设置了旧的身份验证,一切正常。在我们遵循“如果它没有坏,就不要修复它”口号的大计划中,给这个特定的应用程序留下足迹 它没有坏,他把它修好了 我们到了。我发现关于用C#与visualsvn接口的问题,看起来他刚刚从那里逐字复制并粘贴了代码 我们的界面非常简单。有一个输入框,用户在其中输入所需回购协议的名称。下面是一个文本区域,他/她可以在其中添加用户以访问回购协议。用户查找是根据电子邮件地址完

故事时间!我们的一位更不满的员工在最后一天的前一天决定升级visual svn并修改我们的web界面。我们设置了旧的身份验证,一切正常。在我们遵循“如果它没有坏,就不要修复它”口号的大计划中,给这个特定的应用程序留下足迹

它没有坏,他把它修好了

我们到了。我发现关于用C#与visualsvn接口的问题,看起来他刚刚从那里逐字复制并粘贴了代码

我们的界面非常简单。有一个输入框,用户在其中输入所需回购协议的名称。下面是一个文本区域,他/她可以在其中添加用户以访问回购协议。用户查找是根据电子邮件地址完成的,它会访问我们的active directory。这样做的最终结果是,我有了需要创建的回购协议的名称,以及需要授予读/写访问权限的用户/SID

在测试他粘贴的代码时,似乎存储库创建得很好(当我以管理员身份登录服务器时,它们就会显示出来)。以下是回购创建代码:

static public bool CreateRepository(repository r)
{

    ManagementClass repoClass = new ManagementClass("root\\VisualSVN", "VisualSVN_Repository", null);
    // Obtain in-parameters for the method
    ManagementBaseObject inParams = repoClass.GetMethodParameters("Create");


    // Add the input parameters.
    inParams["Name"] = r.name; 

    // Execute the method and obtain the return values.
    ManagementBaseObject outParams =
        repoClass.InvokeMethod("Create", inParams, null);

    return true;
}
“repository r”在方法参数中,repository是一个具有以下属性的类:

private int _id;
private string _name;
private System.Nullable<System.DateTime> _deleteAfter;
private EntitySet<UserRepositoryRight> _UserRepositoryRights;
在这里,一切看起来都正常,但它似乎并没有转移到repo,并添加用户对所创建的repo拥有ReadWrite(键值为2)权限。该方法的结尾只是将数据保存到我们的网站数据库中,以便我们与之交互


所以,根本的问题是,如果我在这里通过web界面创建一个回购协议,我在尝试访问它时会收到一个403禁止的错误,但在创建和删除它时没有错误。有人能给我指出正确的方向吗?

如果在运行代码时没有出现任何错误,我猜访问规则设置在路径
/trunk
上,这在最新版本中根本不存在。您可以在某个新的测试存储库上尝试该脚本,该存储库的根目录中包含“/trunk”。否则,您只需更改参数[“Path”]=“/trunk”中的代码字符串
参数[“路径”]=“/”


VisualSVN Server允许您对最新版本中不存在的项目(文件和文件夹)设置基于路径的授权规则,因为这些项目可以存在于早期版本和更新版本中。

所谓“升级visual svn”,您的意思是“将VisualSVN Server从2.5升级到2.7”?他从哪个版本升级的?@bahrep,是的。这是2.5或更低。他顺便向我提到,升级的原因是我们需要使用新的身份验证(WMI)。所以我们从一个没有这个的版本升级。我们并没有真正落后于升级,所以我愿意赌2.5
static public void UpdatePermissions(string sid, string repository, AccessLevel level, bool isAdmin = false)
{

    //Update SVN
    ManagementClass userClass = new ManagementClass("root\\VisualSVN", "VisualSVN_WindowsAccount", null);
    ManagementClass permClass = new ManagementClass("root\\VisualSVN", "VisualSVN_PermissionEntry", null);
    ManagementClass repoClass = new ManagementClass("root\\VisualSVN", "VisualSVN_Repository", null);

    ManagementObject userObject = userClass.CreateInstance();
    userObject.SetPropertyValue("SID", sid);

    ManagementObject permObject = permClass.CreateInstance();
    permObject.SetPropertyValue("Account", userObject);
    permObject.SetPropertyValue("AccessLevel", level);

    ManagementObject repoObject = repoClass.CreateInstance();
    repoObject.SetPropertyValue("Name", repository);

    ManagementBaseObject inParams =
        repoClass.GetMethodParameters("SetSecurity");

    inParams["Path"] = "/trunk";
    inParams["Permissions"] = new object[] { permObject };

    ManagementBaseObject outParams =
        repoObject.InvokeMethod("SetSecurity", inParams, null);


    //Update in DB
    var db = new DataMapSVNServiceDataContext();
    if (level == AccessLevel.NoAccess) //If we are removing the user
    {
        var output = (db.repositories.Single(r => r.name == repository)).UserRepositoryRights.Single(u => u.User.Sid == sid);
        if (output.isAdmin != null && !((bool)output.isAdmin)) //making sure DB owner isn't ever removed
            db.UserRepositoryRights.DeleteOnSubmit(output);
    }
    if (level == AccessLevel.ReadWrite) //if we are adding the user
    {
        var add = new UserRepositoryRight
        {
            isAdmin = isAdmin,
            User = db.Users.Single(u => u.Sid == sid),
            repository = db.repositories.Single(r => r.name == repository)
        };
        db.UserRepositoryRights.InsertOnSubmit(add);
    }
    db.SubmitChanges();
}