.NET文件夹权限问题

时间:2010-01-29 20:58:27

标签: c# sql-server security permissions

我正在制作一个试图将数据库恢复到sql server的软件,但为此,我需要完全控制将托管.mdf和.ldf文件的文件夹,我正在使用System.Security.AccessControl课程给予每个人完全控制但不起作用! 我只是不知道它为什么会发生...该应用程序适用于规则,但当它到达恢复数据库部分时,它会抛出一个异常,告诉我“操作系统返回错误(错误5,访问被拒绝)”。我的代码如下:

public static void GiveDirFullPermissionEveryoneDotNet(String dir)
{
    GiveDirFullPermissionDotNet(dir, new String[] { @"TODOS", @"EVERYONE", @"BUILTIN/Users", @"Users", @"NT AUTHORITY\NETWORK SERVICE", @"NETWORK", @"Administrators", @"Administrator", @"Administradores", @"Administrador", @"SYSTEM" });
}

public static void GiveDirFullPermissionDotNet(String dir, String[] users)
{
    DirectorySecurity dirSec = Directory.GetAccessControl(dir);
    FileSystemAccessRule fsar;

    foreach (String userAtual in users)
    {
        try
        {
            fsar = new FileSystemAccessRule(userAtual
                                          , FileSystemRights.FullControl
                                          , InheritanceFlags.ContainerInherit | InheritanceFlags.ObjectInherit
                                          , PropagationFlags.InheritOnly
                                          , AccessControlType.Allow);
            dirSec.AddAccessRule(fsar);
        }
        catch (Exception)
        {
            continue;
        }
    }

    Directory.SetAccessControl(dir, dirSec);
}

我尝试了shell方式,使用“CACLS.EXE”,但有些Windows版本的“ICACLS.EXE”(感谢微软的大脑,为我们的开发人员提供便携性!)。所以我真的想用.NET方式做,请帮助。

修改

我将在这里发布我的RestoreDatabase方法,在“sqlRestore.SqlRestore(sqlServer);”处抛出异常线

public void RestoreDatabase(string databaseName,
                            string filePath,
                            string serverName,
                            string userName,
                            string password,
                            string dataFilePath,
                            string logFilePath)
{
    //! Classe de restauração do SQL server
    Restore sqlRestore = new Restore();

    //! adicionando o arquivo indicado ao Restore
    BackupDeviceItem deviceItem = new BackupDeviceItem(filePath, DeviceType.File);
    sqlRestore.Devices.Add(deviceItem);
    sqlRestore.Database = databaseName;

    ServerConnection connection;

    //! Se passou string vazia no usuário, tenta Windows Authentication
    if (userName == "")
    {
        SqlConnection sqlCon = new SqlConnection(@"Data Source=" + serverName + @"; Integrated Security=True;");
        connection = new ServerConnection(sqlCon);
    }
    //! Se passou login de usuário, tenta Server Autentication
    else
        connection = new ServerConnection(serverName, userName, password);


    Server sqlServer = new Server(connection);

    Database db = sqlServer.Databases[databaseName];
    sqlRestore.Action = RestoreActionType.Database;
    string dataFileLocation = dataFilePath + databaseName + ".mdf";
    string logFileLocation = logFilePath + databaseName + "_Log.ldf";
    db = sqlServer.Databases[databaseName];
    RelocateFile rf = new RelocateFile(databaseName, dataFileLocation);

    sqlRestore.RelocateFiles.Add(new RelocateFile(databaseName, dataFileLocation));
    sqlRestore.RelocateFiles.Add(new RelocateFile(databaseName + "_log", logFileLocation));
    sqlRestore.ReplaceDatabase = true;
    sqlRestore.Complete += new ServerMessageEventHandler(sqlRestoreComplete);
    sqlRestore.PercentCompleteNotification = 10;
    sqlRestore.PercentComplete += new PercentCompleteEventHandler(sqlRestorePercentComplete);

    sqlRestore.SqlRestore(sqlServer);

    db = sqlServer.Databases[databaseName];

    db.SetOnline();

    sqlServer.Refresh();
}

3 个答案:

答案 0 :(得分:1)

我的钱不是.Net问题,而是SQL Server的问题......

这是我的猜测(来自here

  

从   http://www.fmsinc.com/freE/NewTips/SQL/SQLtip9.asp

     

虽然只显示本地设备   企业管理器的备份/还原   对话框,有一种方法可以创建或   还原SQL Server数据库备份   在网络文件共享上。创建或   在a上恢复数据库备份   网络文件共享需要   以下先决条件:

     

1)SQL Server服务,关于   包含SQL实例的服务器   服务器,必须在a下运行   域级帐户(例如域名)   管理员帐户)。这是   通过更改“登录”完成   名为的服务的属性   “MSSQLSERVER”和“SQLSERVERAGENT”上   运行SQL Server的服务器(不是   你的本地实例)。当你有   完成了更改登录   有关这两项服务的信息,您   将需要重启“MSSQLSERVER”   该服务器上的服务。请注意这一点   会询问你是否要重启   “SQLSERVERAGENT”以及 - 答案:   是。

     

2)SQL Server服务帐户必须   拥有该文件的FULL CONTROL权限   系统文件夹和共享。那   意味着你需要共享   登录帐户的位置   你在1(上面)中指定已满   控制权。

     

3)文件共享应该只是   通过UNC名称访问。映射驱动器   可能不会始终可见   SQL服务。

     

4)您无法指定路径   使用浏览省略号(...)。您   必须输入完全限定的路径

答案 1 :(得分:1)

我自己就找到了答案......

在我的方法“RestoreDatabase”中,当我在“Restore”类中设置“RelocateFile”实例时,我说sql server将.mdf和.ldf文件移动到我指向的新文件夹,直到现在它听起来不错,因为我向将接收文件的文件夹中的每个人授予完全权限。

但问题出现的地方:SQL Server在其默认数据文件夹中创建.mdf和.ldf文件,使用自己的用户(这个用户完全控制SQL的默认数据文件夹)但是(再次)当他移动时恢复完成后,文件使用另一个用户,该用户必须拥有SQL默认数据文件夹的权限。如果此用户没有所需的权限,会发生什么?答案是:“我到底发生了什么:'操作系统返回错误(错误5,访问被拒绝)'”。

要解决此问题,我登录到SQL服务器,查询SQL默认数据文件夹位置并设置完全控制权。在那之后,一切都很顺利=]

希望这有帮助有同样问题的人! 感谢所有试图帮助的人!

答案 2 :(得分:0)

我已经测试了您的代码“RestoreDatabase”而没有对我的计算机进行任何权限修改,它对我有用。 Visual Studio 2008 SP1, SQL 2008 Express SP1, Windows 7 x64。

我希望这会对你有所帮助。