데이터베이스를 SQL 서버로 복원하려고하는 소프트웨어를 만들고 있습니다.하지만이를 위해서는 .mdf 및 .ldf 파일을 호스팅 할 폴더에 대해 모든 권한이 필요합니다. System.Security.AccessControl 클래스는 모든 사용자에게 모든 권한을 부여하지만 작동하지 않습니다! 나는 왜 그 일이 일어나는 지 모르겠다 ...이 애플리케이션은 규칙을 잘 따르지만, 데이터베이스 복원 부분에 도달하면 "운영 체제가 오류를 반환했다 (오류 5, 액세스가 거부 됨)"라는 예외를 throw합니다. ..NET 폴더 사용 권한 문제
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는"(덕분에 큰 뇌가 우리 개발자를 위해 휴대 돌보는 다음과 같이 내 코드는 !). 그래서 정말 .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();
}
복원을 수행하기 위해 모든 사람이이 디렉토리에 액세스해야하는 이유는 무엇입니까? 복원을 수행하는 경우 전체 액세스가 필요한 유일한 사용자가 아니며 이미 전체 액세스 권한을 갖고 있지 않아야합니다. –
예! thats 큰 질문! 관리자로서 디렉터리에 액세스 할 수없는 이유는 무엇입니까? 내가 탐색기에서 모든 것을 할 수 있지만 내 응용 프로그램이 뭔가를하려고하면 OS가 나를 때려 눕힘 – Tufo
가장 재미있는 일은 내가 방금 전에 동일한 앱에서 만든 초에 액세스하려고 시도하는 디렉토리입니다! – Tufo