2

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

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

这必须适用于 Windows XP 和 7。

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

4

5 回答 5

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语法,它应该可以毫无问题地工作。

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

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

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

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

于 2013-06-13T16:28:21.250 回答
0

为了让它工作,你需要先处理这些。

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

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

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

于 2013-06-14T09:24:09.590 回答
0

There's a thread on connect which goes into some detail on the subject of creating a share with WMI that Everyone can access, but it only targets Windows 7 and so might not work on XP.

It could be a good starting point though.

于 2013-06-13T16:15:35.510 回答
0

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

于 2013-06-15T18:50:30.430 回答
0

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

对于域中的 Windows 7 客户端,此设置不存在。应该可以通过将安全策略“网络访问:限制对命名管道和共享的匿名访问”设置为禁用。但这对我不起作用。在“网络访问:可以匿名访问的共享”中指定共享给了我读取权限,但没有写入权限。请注意,您必须授予本地“匿名登录”用户共享和 NTFS 权限(此处仍然无法写入)。另请注意,我对域或 AD 一无所知,所以我不知道这是否可以被域策略或其他任何东西阻止。

我找到了另一种解决方案,尽管我对此不满意。最大的缺点是您需要成为 SQL Server 的系统管理员。

  • 在客户端计算机上创建本地临时用户。最大限度。用户名长度为 20,您可以使用 GUID 作为密码,这应该满足各种密码策略。
  • 创建一个共享并授予临时用户对该共享和共享目录本身的读写访问权限。
  • 启用 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 对 xp_cmdshell 有以下说明:

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

于 2013-06-18T12:41:23.837 回答