我在一个工作组中有两个Windows 2012 R2服务器,第一个有,另一个用作备份存储。在数据库服务器上,MSSQLSERVER数据库引擎和MSSQLSERVER代理都以默认虚拟帐户运行- NT Service\MSSQLSERVER和NT Service\SQLSERVERAGENT。
现在,我想使用Ola Hallengren维护作业来备份我的MS数据库。这些脚本被包装到MSSQLSERVER代理作业中,但是备份是由带有NT Service\MSSQLSERVER的MSSQLSERVER数据库引擎执行的the过程。
我在存储服务器上创建了一个帐户,并为该帐户创建了一个具有访问权限的共享文件夹。我能够通过一个net use命令连接数据库服务器上的共享,为创建的帐户提供凭据。有一个问题:共享是为运行net use命令的帐户连接的。
如果我将共享连接到本地系统帐户(应该是针对所有用户的),那么NT Service\MSSQLSERVER仍然无法访问它,任何其他帐户都不能访问它。以前在堆栈溢出上提出的hack似乎是在Windows 2012 R2中修复的。
如果我在Server代理作业中将net命令作为步骤运行,那么它将与其他虚拟帐户-- NT Service\SQLSERVERAGENT --一起完成,而备份步骤由于“文件夹未找到”错误而失败。
因此,我想知道如何使用所有必要的权限创建一个Windows帐户,以便在工作组环境中使用Server数据库引擎服务。或者解释为什么不能这样做。理想情况下,它应该是一个脚本- Powershell或VBScript。
我尝试将SQL Server Dabase引擎和SQL Server代理作为本地系统运行,并且备份工作起来很有魅力。但我不认为这是一种解决方案,因为从安全的角度来看,它是不被推荐的。
此外,出于同样的安全原因,我也不会考虑使用cmdshell运行net命令的解决方案。
发布于 2016-12-19 05:42:51
好的,正确的方法是做以下几件事:
.\UserName
而不是ServerName\UserName
,则可以这样做。NT Service\MSSQLSERVER
的权限。这可以通过使用SubInACL实用程序来完成。此工具正是由Microsoft为此目的创建的,可从官方Microsoft下载中心下载。或者,您可以跳过嗅探实际权限,然后继续到下一个点。也许这个应该转到superuser.com
发布于 2016-12-01 02:53:49
是否可以使用SSISpackage执行以下操作:
示例:https://www.simple-talk.com/sql/ssis/adding-the-script-task-to-your-ssis-packages/
若要使用T创建批处理文件:
--Set first day of Week to Monday
--Value First day of the week is
--1 Monday
--2 Tuesday
--3 Wednesday
--4 Thursday
--5 Friday
--6 Saturday
--7 (default, U.S. English) Sunday
SET DATEFIRST 1
Declare @CmdSource varchar(100),
@CmdDestination varchar(100),
@Year varchar(4),
@Week varchar (2),
@Difference int
Set @Difference = 0
Set @Year = Convert(varchar(4), DatePart(Year, GetDate()-@Difference))
Set @Week = Convert(varchar(2), DatePart(week, GetDate()-@Difference))
If @Year = '2010'
BEGIN
Set @Week = @Week - 1
END
SELECT @Week =
CASE Len(@Week)
WHEN 1
THEN '0' + @Week
else @Week
END
Set @CmdSource = 'XCopy "<sourcepath>' + @Year + '\extras text' + @Year + @Week + '.bak" '
Set @CmdDestination = '"<Destination path>" /Y'
SELECT @CmdSource + @CmdDestination as Batchfile
我们选择在设定的时间创建文件。然后,我们设置一个单独的windows调度任务,以便在创建之后的一个固定时间独立运行。2010年,使用SSIS运行是不可预测的。只有一个非常长的目标列(长度为200,最长为多久)。
发布于 2016-12-03 12:45:53
IMHO,您最好的选择仍然是在xp_cmdshell中运行xp_cmdshell。
您只需要运行它一次,然后如果您不喜欢它,可以再次关闭xp_cmdshell;这不像更改该选项需要重新引导=)
为此,我建议将其纳入“启动”程序。您甚至可以添加WITH RECOMPILE
,如果您担心有人会sp_helptext
它来找到该登录的pwd。再说一遍,当人们发现一个加密的启动过程时,人们可能会抓狂。
USE master
GO
CREATE PROCEDURE sp_net_use_that_other_server
AS
-- To allow advanced options to be changed.
EXEC sp_configure 'show advanced options', 1;
-- To update the currently configured value for advanced options.
RECONFIGURE;
-- To enable the feature.
EXEC sp_configure 'xp_cmdshell', 1;
-- To update the currently configured value for this feature.
RECONFIGURE;
-- you might want to fetch this dynamically from the database somewhere, or simply leave it hardcoded here...
EXEC master..xp_cmdshell 'net use \\remotehost\folder password /user:remotehost\username'
-- To disable the feature.
EXEC sp_configure 'xp_cmdshell', 0;
-- To update the currently configured value for this feature.
RECONFIGURE;
Return
GO
-- set this up as a startup procedure
EXEC sp_procoption @ProcName = 'sp_net_use_that_other_server'
, @OptionName = 'startup'
, @OptionValue = 'on';
GO
在此之后,数据库引擎应该能够对该共享进行BACKUP DATABASE...
。
https://stackoverflow.com/questions/40838585
复制相似问题