从远程SQL Server获取备份

时间:2013-06-13 16:06:19

标签: c# sql-server database-backups fileshare

我正在编写一个程序来创建数据库备份,之后我需要能够访问程序中的备份文件。用户应该只向数据库提供连接信息。服务器和客户端位于同一网络中,但不一定位于同一域中。该程序以管理员身份运行。

我最初的计划是使用WMI在客户端上创建共享,然后以该共享作为目标执行备份。但我有身份验证问题。我想我需要一种方法来创建一个每个人都可以连接的共享,而不会被提示登录。

这必须适用于Windows XP和7。

这可能吗?还有其他解决方案吗?

5 个答案:

答案 0 :(得分:2)

我不太清楚你的意思:

  

我正在编写一个程序来创建数据库的备份,我需要   之后能够访问我程序中的备份文件。

如果您的意思是客户端需要还原 备份,您实际上可以实际执行此操作。

备份示例:

using (SqlConnection defaultSqlConnection = new SqlConnection("Insert Connection String Here"))
{
        string backupDb = "BACKUP DATABASE [DatabaseName] TO DISK = 'C:\\Users\\Account\\Desktop\\Database Name.bak'";

     using (SqlCommand backupCommand = new SqlCommand(backupDb, defaultSqlConnection))
     {
          defaultSqlConnection.Open();
          backupCommand.ExecuteNonQuery();
     }
}

正如您所看到的,我们的应用程序很简单,只需使用 SQL 来创建备份。由于 Restore 的方法有所不同,还原过程有点复杂。您可以找到语法 here。如果您结合我的原始示例,只需使用 Restore 语法,它应该没有问题。

显然你可能会遇到这样的问题:

  • 使用数据库的多个用户
  • 读取/写入网络共享的权限。

您还需要确保针对多个方面进行良好的异常处理和测试,以确保正确完成任务。

希望能指出正确的方向,我相信CodePlex有一个实用程序来完成很多 MSSQL 功能,例如:验证,还原,备份和创建

答案 1 :(得分:0)

有一个thread on connect详细介绍了使用WMI创建每个人都可以访问的共享主题,但它只针对Windows 7,因此可能无法在XP上运行。

这可能是一个很好的起点。

答案 2 :(得分:0)

为了让这个工作起作用,你需要先处理好这些。

  • 确保备份存储在可通过网络访问的某个共享文件夹中
  • 确保运行应用程序的用户至少具有对该共享
  • 的读取权限

您可以在客户端计算机上使用WMI创建共享文件夹,但请注意,您需要在客户端计算机上拥有管理员权限才能执行此操作。不确定很多用户会乐意在他们的服务器上为您提供管理员访问权限。

要求用户同时提供可以存储备份的连接和已创建的共享文件夹,这可能是一个不错的选择。

答案 3 :(得分:0)

在过去的某个时候,我尝试从共享文件夹运行数据库还原,我发现SQL Server对这些备份文件的位置非常严格。简而言之,它们必须位于您的计算机上,甚至不是同一网络上的共享文件夹。您也无法恢复闪存驱动器。这些规则是否已经改变我不知道,但SQL Server 2008也是如此。您必须先将远程备份复制到本地文件夹。

答案 4 :(得分:0)

如果Windows 7客户端不在域中,则可以通过在高级共享设置下关闭密码保护共享来进行无需身份验证的连接。

在域中使用Windows 7客户端时,此设置不存在。应该可以通过将安全策略“网络访问:限制对命名管道和共享的匿名访问”设置为禁用来实现。但这对我不起作用。在“网络访问:可以匿名访问的共享”中指定共享给了我读访问权限,但没有写入。请注意,您必须提供本地“ANONYMOUS LOGON”用户共享和NTFS权限(仍然写入此处不起作用)。另请注意,我对域或AD没有任何线索,所以我不知道域名政策或其他任何内容是否可以阻止这种情况。

我发现了另一个必须要做的解决方案,虽然我对它不满意。最大的缺点是你需要在SQL Server上使用sysadmin。

  • 在客户端计算机上创建本地临时用户。最大。用户名长度为20,可以使用GUID作为密码,这应该满足各种密码策略。
  • 创建共享并为临时用户授予对共享和共享目录本身的读写权限。
  • Enable xp_cmdshell
  • 使用xp_cmdshell和'net use'使用临时用户帐户创建无设备共享。例如:xp_cmdshell 'net use \\hostname\tmp /user:hostname\TmpUser E2C3E1B0-AFE6-49D6-96BD-DA5957EB319B'
  • 像往常一样备份到共享。
  • 再次使用xp_cmdshell和'net use'删除共享。例如:xp_cmdshell 'net use \\hostname\tmp /delete /yes'
  • 如果需要,请再次禁用xp_cmdshell。
  • 删除共享,删除目录权限并删除临时用户帐户。

您需要SQL Server上的sysadmin,因为Microsoft会说xx_cmdshell:

  

当不是sysadmin固定服务器角色成员的用户调用它时,xp_cmdshell使用存储在名为## xp_cmdshell_proxy_account ##的凭据中的帐户名和密码连接到Windows。如果此代理凭据不存在,则xp_cmdshell将失败。