Если частенько сталкивались с бэкапом или восстановлением бд по локальной сети скорее всего вы использовали эту команду. Но использование этой команды крайне не рекомендуется. Да, всё в стиле 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';
Комментарии