如何在工作组环境中为MS SQL Server创建Windows服务帐户?

时间:2016-11-28 06:51:44

标签: sql-server windows networking windows-services

我在工作组中有两台Windows Server 2012 R2服务器,第一台服务器上有MS SQL Server,另一台服务器(其中包括)用作备份存储。在数据库服务器上,SQL Server数据库引擎和SQL Server代理都使用默认虚拟帐户运行 - NT Service \ MSSQLSERVER和NT Service \ SQLSERVERAGENT。

现在,我想使用Ola Hallengren维护作业来备份我的MS SQL Server数据库。这些脚本包装在SQL Server代理作业中,但备份是一个t-sql过程,因此由SQL Server数据库引擎使用NT Service \ MSSQLSERVER执行。

我在存储服务器上创建了一个帐户,并且该帐户具有此帐户的访问权限。我能够使用net use命令连接数据库服务器上的共享,为创建的帐户提供凭据。 有一个问题:共享是为运行net use命令的帐户连接的。

如果我使用本地系统帐户(应该是所有用户)连接共享,那么NT Service \ MSSQLSERVER仍然无法访问它,任何其他帐户都无法访问。似乎hack previously proposed on stackoverflow已在Windows Server 2012 R2中得到修复。

如果我将net use命令作为SQL Server代理作业中的一个步骤运行,则使用其他虚拟帐户 - NT Service \ SQLSERVERAGENT完成 - 并且备份步骤失败并显示“找不到文件夹”错误。

因此,我想了解一种使用all the necessary permissions创建Windows服务帐户的方法,以便在工作组环境中使用SQL Server数据库引擎服务。或解释为什么不能这样做。 理想情况下,它应该是一个脚本 - Powershell或VBScript。

我尝试将SQL Server Dabase Engine和SQL Server代理作为本地系统运行,备份就像魅力一样。但我不认为这是一个解决方案,因为从安全角度来看不建议这样做。

此外,由于安全原因相同,我不会考虑使用xp_cmdshell运行net use命令的解决方案。

3 个答案:

答案 0 :(得分:0)

好的,完成它的正确方法是执行以下操作:

  • 在两台服务器上创建一个名称完全相同的用户帐户。如果用户名为.\UserName而不是ServerName\UserName,则可以执行此操作。
  • 完成后,您需要嗅探虚拟服务帐户NT Service\MSSQLSERVER的权限。这可以通过使用SubInACL实用程序来完成。此工具由Microsoft专门为此目的创建,可以从官方Microsoft下载中心下载。或者您可以跳过嗅探实际权限并继续下一步。
  • 可以使用相同的SubInACL工具为新创建的帐户设置知识库文章https://msdn.microsoft.com/en-us/library/ms143504.aspx中描述的所有权限。互联网上有几篇关于如何使用该工具的文章,我使用了这篇文章 - https://redmondmag.com/articles/2008/03/01/dive-deep-with-subinacl.aspx
  • 最后的步骤是:在新创建的用户帐户下启动SQL Server服务,并提供对其他服务器上的共享文件夹的访问权限。

可能应该去superuser.com

答案 1 :(得分:-1)

是否可以使用SSISpackage执行以下操作:

  1. 使用登录详细信息等通过tsql创建和编写脚本。并将其导出到磁盘上的脚本文件中。
  2. 运行脚本运行。
  3. 再次删除脚本文件。
  4. 实施例: https://www.simple-talk.com/sql/ssis/adding-the-script-task-to-your-ssis-packages/

    使用T-sql创建批处理文件:

    --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
    

    Export to file

    Flat files connection

    我们选择在设定的时间创建文件。然后,我们设置一个单独的Windows计划任务,以便在创建后的设定时间独立于SQL运行。在那个时候与SSIS一起运行2010是不可预测的。只有一个非常长的目标列(长度为200,由您决定多长时间。)

答案 2 :(得分:-1)

恕我直言,你最好的选择仍然是在xp_cmdshell中运行net use \\remotehost\folder password /user:remotehost\username

你只需要运行一次然后再关闭xp_cmdshell如果你不喜欢它;它不像改变那个选项需要重启=)

为此我建议将其放入&#39; startup&#39;程序。您甚至可以添加WITH RECOMPILE,如果您担心有人会sp_helptext找到该登录的密码。然后,当找到加密=)

的启动过程时,人们可能会惊慌失措
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...到该共享。