2016-11-28 4 views
2

У меня есть два сервера Windows Server 2012 R2 в рабочей группе, на первом у меня есть MS SQL Server, другой используется (в том числе) как хранилище для резервных копий. На сервере базы данных как SQL Server Database Engine, так и Агент SQL Server работают с виртуальными учетными записями по умолчанию - NT Service \ MSSQLSERVER и NT Service \ SQLSERVERAGENT.Как создать учетную запись службы Windows для MS SQL Server в среде рабочей группы?

Теперь я хочу использовать рабочие задания Ola Hallengren для резервного копирования баз данных MS SQL Server. Эти сценарии завернуты в задание агента SQL Server, но резервная копия - это процедура t-sql, выполняемая таким образом SQL Server Database Engine с помощью службы NT \ MSSQLSERVER.

Я создал учетную запись на сервере хранения и общую папку с правами доступа для этой учетной записи. Я могу подключить общий ресурс на сервере базы данных с помощью команды net use, предоставляющей учетные данные для созданной учетной записи. Уловка: общий ресурс подключен для учетной записи, которая запускает команду использования сети.

Если я подключу общий ресурс с помощью учетной записи локальной системы (которая должна быть для всех пользователей), то NT Service \ MSSQLSERVER не сможет получить к ней доступ, ни одна другая учетная запись не сможет. Похоже, что hack previously proposed on stackoverflow исправлен в Windows Server 2012 R2.

И если я запустил команду использования сети в качестве шага в задаче агента SQL Server, то это делается с другой виртуальной учетной записью - службой NT \ SQLSERVERAGENT - и шаг резервного копирования завершился с ошибкой «папка не найдена».

Поэтому я хотел бы знать способ создания учетной записи службы Windows с помощью all the necessary permissions для службы SQL Server Database Engine, которая будет использоваться в среде рабочей группы. Или объяснение, почему это невозможно. В идеале это должен быть сценарий - Powershell или VBScript.

Я попытался запустить как SQL Server Dabase Engine, так и агент SQL Server как локальную систему, и резервная копия работала как очарование. Но я бы не рассматривал это как решение, потому что это не рекомендуется с точки зрения безопасности.

Также я не стал бы рассматривать решение для запуска команды сетевого использования с xp_cmdshell по тем же причинам безопасности.

+0

Как вы доступ к общему ресурсу, что это путь, который вы используете? Вы сопоставили диск или используете UNC-пути? – DavidG

+0

@DavidG, я использую UNC-путь, например: 'net use \\ remotehost \ folder password/user: remotehost \ username' – prot

+0

Проблема в том, что это допустимо только для текущего пользователя, вам нужно это сделать вошел в систему как тот же пользователь, с которым работает SQL. – DavidG

ответ

0

Хорошо, правильный способ сделать это должен сделать следующее:

  • Создание учетной записи пользователя на обоих серверах с точно таким же именем. Это можно сделать, если пользователь имеет имя .\UserName, а не ServerName\UserName.
  • После того, как это будет сделано, вам необходимо получить права доступа к учетной записи виртуального сервиса NT Service\MSSQLSERVER. И это можно сделать с помощью утилиты SubInACL. Этот инструмент создан Microsoft именно для этой цели и может быть загружен из официального центра загрузки Microsoft. Или вы можете пропустить нюхание фактических разрешений и перейти к следующему пункту.
  • Все права, описанные в статье базы знаний https://msdn.microsoft.com/en-us/library/ms143504.aspx, могут быть установлены на место для вновь созданной учетной записи с помощью того же инструмента SubInACL. В Интернете есть несколько статей о том, как использовать этот инструмент, я использовал этот код: https://redmondmag.com/articles/2008/03/01/dive-deep-with-subinacl.aspx
  • Последними шагами будут: запуск службы SQL Server под недавно созданной учетной записью пользователя и предоставление доступа к общей папке на другом сервере ,

Вероятно, это должно пойти на superuser.com

-1

Будет ли возможность использовать SSISpackage сделать следующее:

  1. Создание и сценарий с помощью TSQL с входа-детали и т.д.. и экспортировать его в файл сценария на диске.
  2. Запустите запуск сценария.
  3. Снова удалите файл сценария.

Пример: 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()[email protected])) 
Set @Week = Convert(varchar(2), DatePart(week, GetDate()[email protected])) 
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, до вас как долго.)

+0

Не могли бы вы продумать «Создание и сценарий через tsql с данными для входа». Я могу создать пакет SSIS с скриптом C#/VB.net. Здесь нет проблем. Но я не уверен, что понимаю, что внутри этого кода. Ваш ответ кажется скорее вопросом, чем ответом. – prot

+0

Мы делали что-то подобное в прошлом. Я все еще ищу его. Вернемся к вам с примером и примерами –

+0

Обновленный ответ, чтобы включить шаги и изображения с более подробной информацией. Надежда помогает –

-1

ИМХО, лучше всего по-прежнему выполнять net use \\remotehost\folder password /user:remotehost\username в 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... на эту акцию.

+0

Использование xp_cmdshell создает угрозу безопасности и обычно не рекомендуется. Проверьте эту ссылку. Https://blogs.msdn.microsoft.com/sqlsecurity/2008/01/10/xp_cmdshell – prot

+0

Следовательно, почему я предлагаю «закрыть это отверстие» снова сразу после того, как вам это больше не нужно; вам нужно только создать ресурс при запуске службы. – deroby