Я создаю программное обеспечение, которое пытается восстановить базу данных на сервере sql, но для этого мне нужен полный контроль над папкой, в которой будут храниться файлы .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);
}
Я пробовал это оболочкой, используя «CACLS.EXE», но некоторые версии Windows используют его «ICACLS.EXE» (спасибо большое мозгу в Microsoft за заботу о переносимости для нас, разработчиков!). Поэтому я действительно хочу сделать это .NET-способом, пожалуйста, помогите.
EDIT:
Я опубликую здесь мой метод 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();
}