2017-03-17 21 views
0

Microsoft.SqlServer.Management.Smoで復元しようとしていますが、アクセス拒否エラーが続いています。C#データベースをmicrosoft.sqlserver.management.smo 5(アクセスが拒否されました)

インスタンス(MSSQL$LOCAL2016)のサービスユーザをフォルダへのフルアクセス権を持つように設定しました。

フォルダーはインスタンスのデフォルトのフォルダーです(ただし、本番環境に移行しても同じことは言えません)。

は私が

rstDatabase.SqlRestore(sqlServer); 

がエラーで失敗したC#の中にフォルダを作成します。私は「みんなのフルアクセスを許可するようにしても、これまでのようにフォルダのアクセス権を変更した

The operating system returned the error '5(Access is denied.)' while attempting 'RestoreContainer::ValidateTargetForCreation' on 'C:\Database\Rates.setuptest\Data'.
File 'RateUploader' cannot be restored to 'C:\Database\Rates.setuptest\Data'. Use WITH MOVE to identify a valid location for the file.
The operating system returned the error '5(Access is denied.)' while attempting 'RestoreContainer::ValidateTargetForCreation' on 'C:\Database\Rates.setuptest\Logs'.
File 'RateUploader_log' cannot be restored to 'C:\Database\Rates.setuptest\Logs'. Use WITH MOVE to identify a valid location for the file.
Problems were identified while planning for the RESTORE statement. Previous messages provide details.
RESTORE DATABASE is terminating abnormally.

サービスログインをローカルサービスに変更し、ローカルディレクトリへのアクセスを許可しました

私はアイデア

の外に新鮮だ。ここのコードですが、それは

public static IEnumerable<RestoreDatabaseResponse> RestoreDatabase(String databaseName) 
    { 
     var eventQueue = new Queue<RestoreDatabaseResponse>(); 
     var counter = 0; 

     MySqlConnectionStringBuilder stringBuilder = new MySqlConnectionStringBuilder(ConfigurationManager.ConnectionStrings["adminSqlAccess"].ConnectionString); 

     string serverName = stringBuilder.Server, userName = stringBuilder.UserID, password = stringBuilder.Password, 
      pFileLocation = string.Format(ConfigurationManager.AppSettings["dbPath"], databaseName, "Data"), 
      lFileLocation = string.Format(ConfigurationManager.AppSettings["dbPath"], databaseName, "Logs"), 
      bakFileLocation = ConfigurationManager.AppSettings["bakDbPath"]; 

     //permisions are propagating 
     if (!Directory.Exists(pFileLocation)) 
      Directory.CreateDirectory(pFileLocation); 
     if (!Directory.Exists(lFileLocation)) 
      Directory.CreateDirectory(lFileLocation); 

     ServerConnection connection = new ServerConnection(serverName, userName, password); 
     Server sqlServer = new Server(connection); 
     Restore rstDatabase = new Restore(); 

     //recently added events for reporting. Still fails without these two 
     rstDatabase.Complete += (sender, args) => 
     { 
      eventQueue.Enqueue(new RestoreDatabaseResponse 
      { 
       Command = $"Restore {databaseName}", 
       Status = ResponseStatus.Success, 
       Detail = "Complete", 
       Index = counter++, 
       PercentComplete = 100 
      }); 
     }; 

     rstDatabase.PercentComplete += (sender, args) => 
     { 
      eventQueue.Enqueue(new RestoreDatabaseResponse 
      { 
       Command = $"Restore {databaseName}", 
       Status = ResponseStatus.PartialSuccess, 
       Detail = "Running", 
       Index = counter++, 
       PercentComplete = args.Percent 
      }); 
     }; 

     rstDatabase.Action = RestoreActionType.Database; 
     rstDatabase.Database = $"Rates.{databaseName}"; 

     // I even tried skipping this step. Still error 
     rstDatabase.RelocateFiles.Add(new RelocateFile("RateUploader", pFileLocation)); 
     rstDatabase.RelocateFiles.Add(new RelocateFile("RateUploader_log", lFileLocation)); 

     BackupDeviceItem bkpDevice = new BackupDeviceItem(bakFileLocation, DeviceType.File); 
     rstDatabase.Devices.Add(bkpDevice); 
     rstDatabase.ReplaceDatabase = true; 
     RestoreDatabaseResponse errorResponse = null; 

     try 
     { 
      rstDatabase.SqlRestore(sqlServer); 
     } 
     catch (Exception exception) 
     { 
      errorResponse = new RestoreDatabaseResponse 
      { 
       Command = $"Restore {databaseName}", 
       Status = ResponseStatus.Failure, 
       Detail = exception, 
       Index = counter++, 
       PercentComplete = 0 
      }; 
     } 

     if (errorResponse != null) 
     { 
      yield return errorResponse; 
      yield break; 
     } 

     while (true) 
     { 
      if (!eventQueue.Any()) 
       Thread.Sleep(100); 
      else 
      { 
       var e = eventQueue.Dequeue(); 
       yield return e; 

       if(e.Status== ResponseStatus.Success) 
        yield break; 
      } 
     } 
    } 

答えて

0

ああピートのためにかなり標準です!

私は別のフォルダに移動する意味するものではなく、また、エラーメッセージはほとんどの人が持っているように思われる権限の問題と同じである公正、「移動」することに移転パスから> _ <

をファイル名を省略ヒット

+0

あなたはそれを理解してうれしいです。実際の意図である可能性があるので、移動誤差は適用可能であり、エンジンは知る方法がない。つまり、一般にユーザーに返されるセキュリティエラーメッセージは、悪意のあるユーザーを助けることを避けるためにはあいまいな傾向があります。エラーログ(デフォルトではセキュリティ保護されています)には、通常より詳細な情報があります。 – SQLmojoe

関連する問題