Если частенько сталкивались с бэкапом или восстановлением бд по локальной сети скорее всего вы использовали эту команду. Но использование этой команды крайне не рекомендуется. Да, всё в стиле microsoft использовать мы конечно не рекомендуем, но вот как восстановить бэкап который лежит где-то в сетевой папке и доступ к ней у конкретного пользователя без xp_cmdshell мы рассматривать не будем.

Так вот используя xp_cmdshell мы можем выполнять cmd команды в локальной системе через ms sql server, при этом от учетной записи самого ms sql server. Теперь понимаете почему не рекомендуется включать эту функцию?

Включаем xp_cmdshell

Как я говорил выше по умолчанию эта функция выключена, чтобы включить выполняем от пользователя с правами sysadmin:

-- To allow advanced options to be changed.
EXECUTE sp_configure 'show advanced options', 1;
GO
-- To update the currently configured value for advanced options.
RECONFIGURE;
GO
-- To enable the feature.
EXECUTE sp_configure 'xp_cmdshell', 1;
GO
-- To update the currently configured value for this feature.
RECONFIGURE;
GO
-- To set "show advanced options" back to false
EXECUTE sp_configure 'show advanced options', 0;
GO
-- To update the currently configured value for advanced options.
RECONFIGURE;
GO

Учётная запись прокси для xp_cmdshell

Дело в том, что обычный пользователь, который не имеет права sysadmin не сможет выполнять команды через xp_cmdshell. Для этого ему понадобится прокси с учетными данными пользователя с ролью sysadmin.

Если никаких прокси нет, то вы получите ошибку:

Msg 15153, Level 16, State 1, Procedure xp_cmdshell, Line 1 [Batch Start Line 10]
The xp_cmdshell proxy account information cannot be retrieved or is invalid. Verify that the '##xp_cmdshell_proxy_account##' credential exists and contains valid information.

Для того, чтобы создать прокси выполняем:

EXEC sp_xp_cmdshell_proxy_account 'serverдминистратор', 'pwd';
  • server\Администратор - собственно, пользователь у которого есть права sysadmin и который является также локальным пользователем ОС
  • pwd - пароль от этого пользователя

Если вдруг нужно удалить прокси:

EXEC sp_xp_cmdshell_proxy_account NULL;

Выдать разрешения на xp_cmdshell

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

GRANT exec ON xp_cmdshell TO N'<some_user>';

Чтобы проверить что всё работает выполняем команду от пользователя some_user:

EXEC xp_cmdshell 'whoami.exe';