使用c#创建SQL Server备份文件(.bak)到任何位置

8 c# sql-server permissions backup

我正在尝试用C#编写简单的应用程序,这将允许我备份,压缩和通过ftp发送我的SQL Server数据库.我遇到的一个问题是,如果我尝试在"C:\ Program Files\Microsoft SQL Server\MSSQL.3\MSSQL\Backup"之外的其他位置执行此操作,则无法创建备份文件(.bak)或"C:\ Program Files\Microsoft SQL Server\MSSQL.3\MSSQL\Data"文件夹.我知道这是一个暂缓问题.有人可以指向我的资源或在这里写一个简短的片段如何以编程方式将这样的权限添加到我的系统上的任何文件夹.

关心克里斯

And*_*air 9

我假设您正在运行您的程序作为计划任务...您是否为任务的执行用户提供了目标文件夹的写入权限?

编辑:
拥有权限,您可以拥有2个场景:

  • Windows身份验证
  • 混合认证

如果您使用的是Windows身份验证,则会获取Windows用户的读写权限.否则为sql server服务帐户的权限.

这种行为对我来说很有意义,也许在你的场景中可能会受到影响!

编辑2:
我不想鼓励你这样做......一些管理员可能会恨你,当你搞砸了他的ACL的,但是可能做的伎俩

顺便说一句:Magnus Johansson 已经给你一个"试试这个"链接

无论你采用哪种方法 - 一定要交给正确的用户(如上所述!)

(完整的历史记录)
...

旁注:
我知道这不是你问题的确切答案,但我建议你smo生成备份......

喜欢

using Microsoft.SqlServer.Management.Smo;

var bdi = new BackupDeviceItem(/* your path inlcuding desired file */);
var backup = new Backup
{
    Database = /* name of the database */,
    Initialize = true
};

backup.Devices.Add(bdi);

var server = new Server(this.SqlServer);

try
{
    backup.SqlBackup(server);
}
catch (Exception ex)
{
    // * log or sth
}
Run Code Online (Sandbox Code Playgroud)

你只需要关心.dll的.获取所需服务器版本的程序集(某些参数/属性因服务器版本而异)这里有
更多信息


小智 6

好伙计们,马格努斯和dittodhole!非常感谢你的帮助.我将Magnus'es链接到关于在文件夹上设置permisions的文章以及一些更多的研究,最后我得到了它:).所以重新说,我正在使用Smo,并创建一个具有适当权限的文件夹,我必须寻找组而不是win32_Users.如果有人发现这篇帖子他会发现它很有用,你可以在这里找一个简短的片段:

string tempPath = Directory.CreateDirectory("C:\\path_to_your_folder").FullName;

//set permissions
SelectQuery sQuery = new SelectQuery("Win32_Group", 
                                     "Domain='" + 
                                     System.Environment.UserDomainName.ToString() + 
                                     "'");
try
{
    DirectoryInfo myDirectoryInfo = new DirectoryInfo("C:\\path_to_your_folder");
    DirectorySecurity myDirectorySecurity = myDirectoryInfo.GetAccessControl();
    ManagementObjectSearcher mSearcher = new ManagementObjectSearcher(sQuery);
    foreach (ManagementObject mObject in mSearcher.Get())
    {
        string User = System.Environment.UserDomainName + "\\" + mObject["Name"];
        if(User.StartsWith("your-machine-name\\SQL"))
        {
            myDirectorySecurity.
            AddAccessRule(new FileSystemAccessRule(User, 
                                                   FileSystemRights.FullControl,
                                                   AccessControlType.Allow));
        }
    }
    myDirectoryInfo.SetAccessControl(myDirectorySecurity);
}
catch (Exception ex)
{
    Console.WriteLine(ex.StackTrace);
}
Run Code Online (Sandbox Code Playgroud)

再次感谢大家的帮助!Stackoverflow岩石!


Mag*_*son 1

看看这篇文章

请记住为运行 SQL Server 实例的帐户设置权限。