如何在工作组环境中为 MS SQL 服务器创建 Windows 服务帐户?
How to create a Windows service account for MS SQL Server in a workgroup environment?
我在一个工作组中有两台 Windows Server 2012 R2 服务器,第一台我有 MS SQL 服务器,另一台(除其他外)用作备份存储。在数据库服务器上,SQL 服务器数据库引擎和 SQL 服务器代理 运行 具有默认虚拟帐户 - NT Service\MSSQLSERVER 和 NT Service\SQLSERVERAGENT。
现在,我想使用 Ola Hallengren 维护工作来备份我的 MS SQL 服务器数据库。这些脚本被包装到 SQL 服务器代理作业中,但备份是一个 t-sql 过程,因此由 SQL 服务器数据库引擎与 NT Service\MSSQLSERVER 执行。
我已经在存储服务器上创建了一个帐户,并为该帐户创建了一个具有访问权限的共享文件夹。我能够使用为创建的帐户提供凭据的 net use 命令连接数据库服务器上的共享。
有一个问题:该共享已连接到 运行 网络使用命令的帐户。
如果我将共享连接到本地系统帐户(应该适用于所有用户),那么 NT Service\MSSQLSERVER 仍然无法访问它,任何其他帐户都不能。 hack previously proposed on Whosebug 似乎已在 Windows Server 2012 R2 中修复。
如果我 运行 net use 命令作为 SQL Server Agent 作业的一个步骤,那么它是用另一个虚拟帐户 - NT Service\SQLSERVERAGENT - 和备份完成的步骤失败并出现 "folder not found" 错误。
所以我想知道一种使用 all the necessary permissions 创建 Windows 服务帐户的方法,以便在工作组环境中使用 SQL 服务器数据库引擎服务。或者解释为什么它不能完成。
理想情况下,它应该是一个脚本 - Powershell 或 VBScript。
我尝试 运行 SQL 服务器数据库引擎和 SQL 服务器代理作为本地系统,并且备份非常有效。但我不会将此视为解决方案,因为从安全角度来看不推荐这样做。
另外,出于同样的安全原因,我不会考虑使用 xp_cmdshell 运行 net use 命令的解决方案。
是否可以使用 SSI 包来执行以下操作:
- 使用登录详细信息等通过 tsql 创建和编写脚本。并将其导出到磁盘上的脚本文件。
- 运行 运行 脚本。
- 再次删除脚本文件。
示例:
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
我们选择在设定的时间创建文件。然后我们在创建后的设定时间独立于 SQL 设置一个单独的 windows 计划任务到 运行。 运行 那个时候的SSIS 2010,风雨飘摇。只有一个很长的目标列(长度200,你想多长。)
恕我直言,你最好的选择仍然是 运行 net use \remotehost\folder password /user:remotehost\username
in xp_cmdshell.
你只需要运行一次,如果你不喜欢,可以再次关闭xp_cmdshell;这不像更改该选项需要重新启动 =)
为此,我建议将其放入 'startup' 程序中。如果您担心有人会 sp_helptext
来查找该登录的密码,您甚至可以添加 WITH RECOMPILE
。再说一次,人们在找到加密的启动过程时可能会吓坏 =)
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...
到那个共享。
好的,完成它的正确方法是执行以下操作:
- 在两台服务器上创建一个名称完全相同的用户帐户。如果用户名为
.\UserName
而不是 ServerName\UserName
,则可以这样做。
- 完成后,您需要嗅探虚拟服务帐户的权限
NT Service\MSSQLSERVER
。这可以通过使用 SubInACL 实用程序来完成。此工具由 Microsoft 专门为此目的创建,可从 Microsoft 官方下载中心下载。或者您可以跳过嗅探实际权限并继续下一点。
- 知识库文章https://msdn.microsoft.com/en-us/library/ms143504.aspx can be set in place for the newly created account with the same SubInACL tool. There are several articles across the Internet on how to use the tool, I used this one - https://redmondmag.com/articles/2008/03/01/dive-deep-with-subinacl.aspx
中描述的所有权限
- 最后的步骤是:在新创建的用户帐户下启动 SQL 服务器服务,并提供对另一台服务器上共享文件夹的访问权限。
可能这应该转到 superuser.com
我在一个工作组中有两台 Windows Server 2012 R2 服务器,第一台我有 MS SQL 服务器,另一台(除其他外)用作备份存储。在数据库服务器上,SQL 服务器数据库引擎和 SQL 服务器代理 运行 具有默认虚拟帐户 - NT Service\MSSQLSERVER 和 NT Service\SQLSERVERAGENT。
现在,我想使用 Ola Hallengren 维护工作来备份我的 MS SQL 服务器数据库。这些脚本被包装到 SQL 服务器代理作业中,但备份是一个 t-sql 过程,因此由 SQL 服务器数据库引擎与 NT Service\MSSQLSERVER 执行。
我已经在存储服务器上创建了一个帐户,并为该帐户创建了一个具有访问权限的共享文件夹。我能够使用为创建的帐户提供凭据的 net use 命令连接数据库服务器上的共享。 有一个问题:该共享已连接到 运行 网络使用命令的帐户。
如果我将共享连接到本地系统帐户(应该适用于所有用户),那么 NT Service\MSSQLSERVER 仍然无法访问它,任何其他帐户都不能。 hack previously proposed on Whosebug 似乎已在 Windows Server 2012 R2 中修复。
如果我 运行 net use 命令作为 SQL Server Agent 作业的一个步骤,那么它是用另一个虚拟帐户 - NT Service\SQLSERVERAGENT - 和备份完成的步骤失败并出现 "folder not found" 错误。
所以我想知道一种使用 all the necessary permissions 创建 Windows 服务帐户的方法,以便在工作组环境中使用 SQL 服务器数据库引擎服务。或者解释为什么它不能完成。 理想情况下,它应该是一个脚本 - Powershell 或 VBScript。
我尝试 运行 SQL 服务器数据库引擎和 SQL 服务器代理作为本地系统,并且备份非常有效。但我不会将此视为解决方案,因为从安全角度来看不推荐这样做。
另外,出于同样的安全原因,我不会考虑使用 xp_cmdshell 运行 net use 命令的解决方案。
是否可以使用 SSI 包来执行以下操作:
- 使用登录详细信息等通过 tsql 创建和编写脚本。并将其导出到磁盘上的脚本文件。
- 运行 运行 脚本。
- 再次删除脚本文件。
示例: 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
我们选择在设定的时间创建文件。然后我们在创建后的设定时间独立于 SQL 设置一个单独的 windows 计划任务到 运行。 运行 那个时候的SSIS 2010,风雨飘摇。只有一个很长的目标列(长度200,你想多长。)
恕我直言,你最好的选择仍然是 运行 net use \remotehost\folder password /user:remotehost\username
in xp_cmdshell.
你只需要运行一次,如果你不喜欢,可以再次关闭xp_cmdshell;这不像更改该选项需要重新启动 =)
为此,我建议将其放入 'startup' 程序中。如果您担心有人会 sp_helptext
来查找该登录的密码,您甚至可以添加 WITH RECOMPILE
。再说一次,人们在找到加密的启动过程时可能会吓坏 =)
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...
到那个共享。
好的,完成它的正确方法是执行以下操作:
- 在两台服务器上创建一个名称完全相同的用户帐户。如果用户名为
.\UserName
而不是ServerName\UserName
,则可以这样做。 - 完成后,您需要嗅探虚拟服务帐户的权限
NT Service\MSSQLSERVER
。这可以通过使用 SubInACL 实用程序来完成。此工具由 Microsoft 专门为此目的创建,可从 Microsoft 官方下载中心下载。或者您可以跳过嗅探实际权限并继续下一点。 - 知识库文章https://msdn.microsoft.com/en-us/library/ms143504.aspx can be set in place for the newly created account with the same SubInACL tool. There are several articles across the Internet on how to use the tool, I used this one - https://redmondmag.com/articles/2008/03/01/dive-deep-with-subinacl.aspx 中描述的所有权限
- 最后的步骤是:在新创建的用户帐户下启动 SQL 服务器服务,并提供对另一台服务器上共享文件夹的访问权限。
可能这应该转到 superuser.com