【发布时间】:2011-01-11 00:41:29
【问题描述】:
我正在制作一个尝试将数据库恢复到 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”(感谢 Microsoft 为我们开发人员提供可移植性的优秀人才!)。所以我真的很想用 .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();
}
【问题讨论】:
-
为什么每个人都需要访问此目录才能执行还原?如果是您在进行恢复,难道您不是唯一需要完全访问权限的人吗?您不应该已经拥有完全访问权限吗?
-
是的!那是个大问题!为什么我作为管理员无法访问该目录?我可以在资源管理器中做任何事情,但是当我的应用程序尝试做某事时,操作系统会打我
-
最有趣的是,我试图访问的目录是我几秒钟前在同一个应用程序中创建的!
-
这是一个蹩脚的问题,但是您在尝试还原之前是否停止了 SQL Server 服务?
-
如果你想解决这个问题,你必须删除你的 try/catch 块。
标签: c# sql-server security permissions