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