xp_CmdShell
требуется сопоставление windows для успешного выполнения.Если вы вошли в систему с пользователем с ролью sysadmin
(я полагаю, это ваш первый сценарий), будет использоваться учетная запись для учетной записи службы SQL Server.
Если пользователь не't sysadmin
(это должен быть пользователь IIS), тогда он будет выдавать себя за настроенную учетную запись для специальных учетных данных с именем ##xp_cmdshell_proxy_account##
, которые необходимо настроить.
Чтобы настроить эту учетную запись, используйтеSP sp_xp_cmdshell_proxy_account , например:
EXEC sp_xp_cmdshell_proxy_account 'DOMAIN\SQLServerCMDProxy','sdfh%dkc93vcMt0';
Это сопоставление можно проверить с помощью:
select * from sys.credentials
Вам также потребуется предоставить команду execute для процедуры xp_cmdshell
, если вы еще этого не сделали:
GRANT EXEC ON xp_cmdshell TO 'IISUser'
И вы можете проверить, работает ли она правильно, выдав себя за имя пользователя с достаточным количеством привилегий.:
EXECUTE AS LOGIN = 'IISUser' -- Shift priviledges to this login for the current session
EXEC xp_cmdshell 'dir *.exe'; -- Try to execute the xp_cmdshell
REVERT -- Revert to the previous login
PD: Будьте очень осторожны при разрешении использования xp_cmdshell
на вашем SQL Server, так как это может открыть дыры в безопасности, особенно при предоставлении разрешений для неконтролируемых входов в систему.,Даже если вы инкапсулируете определенный вызов в SP, есть обходные пути, которые пользователь может сделать, чтобы обойти и выполнить xp_cmdshell
напрямую.Правильный способ сделать это - подписать сертификат с помощью пользовательского логина.