2010-01-29 7 views
1

데이터베이스를 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(); 
} 
+0

복원을 수행하기 위해 모든 사람이이 디렉토리에 액세스해야하는 이유는 무엇입니까? 복원을 수행하는 경우 전체 액세스가 필요한 유일한 사용자가 아니며 이미 전체 액세스 권한을 갖고 있지 않아야합니다. –

+0

예! thats 큰 질문! 관리자로서 디렉터리에 액세스 할 수없는 이유는 무엇입니까? 내가 탐색기에서 모든 것을 할 수 있지만 내 응용 프로그램이 뭔가를하려고하면 OS가 나를 때려 눕힘 – Tufo

+0

가장 재미있는 일은 내가 방금 전에 동일한 앱에서 만든 초에 액세스하려고 시도하는 디렉토리입니다! – Tufo

답변

1

난 그냥 혼자 대답 ... 내 방법 "RestoreDatabase"에서

, 나는 "복원"클래스 내부 "RelocateFile"인스턴스가 설정 발견, 나는의 .mdf를 이동 SQL Server에 말하는거야 파일을받을 폴더의 모든 사용자에게 전체 권한을 부여 할 때까지 지금까지 괜찮다고 생각할 때까지 .ldf 파일을 나와 가리키는 새 폴더로 복사합니다.

그러나 문제가 시작되는 곳 : SQL Server는 기본 데이터 폴더 내에 .mdf 및 .ldf 파일을 모두 만듭니다.이 사용자는 자신의 사용자 (SQL의 기본 데이터 폴더를 완전히 제어 할 수 있음)를 사용하지만 이동시 (다시) 복원 후 파일이 완료되면 그는 다른 사용자를 사용하며이 사용자는 SQL의 기본 데이터 폴더에 대한 권한을 가지고 있어야합니다. 이 사용자에게 필요한 권한이없는 경우 어떻게됩니까? 대답은 다음과 같습니다. "정확히 나에게 일어난 일 : 운영 체제가 오류를 반환했습니다 (오류 5, 액세스가 거부되었습니다)." "

이 문제를 해결하려면 SQL 서버에 로그인하여 SQL 기본 데이터 폴더 위치를 쿼리하고 여기에 모든 권한을 설정하십시오. 그 후에 모든 것이 잘됩니다.]]

같은 문제가있는 사람에게 도움을 청하십시오! 도움을 주신 모든 분들께 감사드립니다!

1

내 돈

여기 (here에서) 내 생각 엔

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

에서의 ... 이것은 닷넷 문제가 있지만, SQL 서버에 문제가되지 않는에

로컬 장치 만 Enterprise Manager의 백업/복원 대화 상자에 표시되지만 생성 방법은 있습니다 e 또는 네트워크 파일 공유에 SQL Server 데이터베이스 백업 을 복원하십시오. 다음과 같은 전제 조건이 네트워크 파일 공유에 데이터베이스 백업을 복원 필요 작성 또는 :

1) SQL 서버 서비스를 SQL Server 인스턴스를 포함하는 서버에, 도메인 -에서 실행해야 (예 : 도메인 관리자 계정). 이것은 "MSSQLSERVER"및 "SQLSERVERAGENT"라는 서비스의 속성을 (로컬 인스턴스가 아닌 ) 인 서버에서 에 변경하여 수행 한 입니다. 이이 두 가지 서비스에 대한 정보를 에 기록한 로그를 변경 한 경우 은 해당 서버에서 "MSSQLSERVER" 서비스를 다시 시작해야합니다. 이 은 "SQLSERVERAGENT"를 다시 시작할지 묻는 메시지가 표시됩니다. - 답변 : 예.

2) SQL Server 서비스 계정은 시스템 폴더와 공유에 대한 모든 권한을 가지고 있어야합니다. 즉, 은 공유 계정 ( )이 1 (위)에 지정된 로그온 계정에 전체 제어 권한이 있어야한다는 것을 의미합니다.

3) 파일 공유는 UNC 이름을 통해 액세스 된 여야합니다. 매핑 된 드라이브 은 SQL Service에서 계속 표시되지 않을 수 있습니다.

4) 찾아보기 생략 부호 (...)를 사용하여 까지 경로를 지정할 수 없습니다. 당신은 완전한 경로

+0

sqlservr.exe가 NETWORK SERVICE 사용자로 실행 중이며 sqlwriter.exe가 SYSTEM 사용자로 실행되고 있습니다. 내 코드에서 볼 수 있듯이 둘 다 모든 권한을 얻고 있습니다. – Tufo

+0

1) 위 응답 2) 위 응답 3) 해당 없음 단순히 C : \ program files \ myApp 폴더 4) "C : \ program files \ myapp"폴더에 전체/절대 경로를 지정하고 % programfiles % neiter 관계형 경로가 아닌 ... – Tufo

0

내 컴퓨터에 대한 사용 권한의 수정없이 코드 "RestoreDatabase"을 테스트 한 그리고 그것은 나를 위해 작동을 입력해야합니다. Visual Studio 2008 SP1, SQL 2008 Express SP1, Windows 7 x64.

이 정보가 도움이되기를 바랍니다.

+0

광산은 VS2008 SP1, SQL 2005 Express, Win7 x64 ... 하지만 다른 가상 머신에서 테스트 할 때 같은 문제가 발생합니다 ... – Tufo

+0

아마도 데이터베이스 구조에 따라 다릅니다. 테스트 DB를 만들고 백업하고 복원하려고 시도하십시오. – ikhaldeev