Выполнить команду xp_cmdshell в качестве конкретного пользователя
Я хотел бы запустить xp_cmdshell (процедура TSQL), чтобы смонтировать сетевой диск, а затем получить доступ к файлам mdb для удаленных пользователей.
Я администратор сервера MS SQL, и я допустил выполнение xp_cmdshell.
Однако все еще существует проблема:
-
Когда я вызываю xp_cmdshell, пользователь выполняет команду SQL SysAdmin, то есть учетную запись, которая запускает процесс SQL Server.
-
Я хочу, чтобы xp_cmdshell выполнялся как учетная запись, с которой я подключен к SQL-серверу, то есть администратор
Оба эти счета находятся в группе администратора, группе SQLAdmin и предоставляются CONTROL SERVER. Оба пользователя принадлежат к одному домену. Все это выполняется на той же машине.
Из-за этого конфликта я не могу использовать сетевой диск, потому что он монтируется для SysAdmin, а не для администратора.
Я попытался использовать sp_ xp_ cmdshell_ proxy_ account, чтобы указать учетную запись, с которой я хочу запустить xp_cmdshell, но SysAdmin по-прежнему является используемой учетной записью.
Поэтому этот код:
select user_name(), suser_name;
exec xp_cmdshell 'echo %username%';
:
Administrator Administrator
SysAdmin
Кто-нибудь знает, как хорошо выполнить команду xp_cmdshell? Есть ли что-то (пере) настроить?
Спасибо за вашу помощь.
Ответы
Ответ 1
Поскольку вы подключаетесь к SQL в качестве входа в группу sysadmin, xp_cmdshell
работает как учетная запись службы.
Если вы подключаетесь как вход с низким привилегией, тогда он будет использовать xp_cmdshell_proxy_account
. Поэтому сначала попробуйте сделать EXECUTE AS LOGIN='lowprivaccount'
, чтобы узнать, помогает ли это.
Конечно, то, что вы на самом деле спрашиваете, не является ожидаемым. Ожидаемое использование заключается в том, что учетные записи с высокими привилегиями могут позволить xp_cmdshell
использовать учетную запись службы, тогда как всем остальным приходится мириться с учетной записью прокси-сервера с более низким привилегией.
Ответ 2
Мне действительно пришлось использовать этот метод в прошлом для подобных вещей в сетевых ресурсах, попробуйте это...
- сопоставьте свой диск и сделайте его постоянным.
xp_cmdshell "net use t:\\<server> \< share < пароль > /пользователь: < имя_пользователя > /persistent: yes"
- код t-sql, использующий привод t
- удалить отображение диска xp_cmdshell "net use t:/delete"
вы можете настроить задание, выполняемое при запуске службы sql, и создать карту для этого диска, чтобы вы всегда имели доступ к ресурсу, пока работает sql. Все, что вам нужно сделать, это установить sproc, который отображает диск, и выполнить его первоначальное отображение диска и использовать sp_procoption (http://msdn.microsoft.com/en-us/library/ms181720.aspx)
Ответ 3
Возможно, вы могли бы попробовать PsExec? Загрузите файл по этому URL-адресу и скопируйте его в член папки из переменной окружения% Path%.
http://technet.microsoft.com/en-us/sysinternals/bb897553.aspx
exec xp_cmdshell 'psexec -u Administrator -p password net use ...'
Ответ 4
Вы можете попробовать "сетевое использование" с именем пользователя и паролем внутри xp_cmdshell. Это устанавливает учетные данные для подключения к UNC.
Однако я не знаю, как долго это будет продолжаться. Если он сохраняется неопределенно долго (например, до перезапуска сервера), вы можете иметь хранимую процедуру запуска, которая использует "сетевое использование", и обеспечивает ее доступность для использования позже.
Последующая xp_cmdshell (для доступа к файлам MDB) не требует проверки подлинности, поскольку учетные данные уже установлены в ОС.
Ответ 5
Я нашел, что эта страница помогла заполнить пробелы в процессе фактического добавления учетной записи домена и связывания ее.
http://sqlblog.com/blogs/tibor_karaszi/archive/2007/08/23/xp-cmdshell-and-permissions.aspx
Ответ 6
После перезагрузки сервер должен выполнить команду сохранения команды plase...
Use Master GO
EXEC master.dbo.sp_configure 'show advanced options', 1 RECONFIGURE WITH
OVERRIDE GO
EXEC master.dbo.sp_configure 'xp_cmdshell', 1 RECONFIGURE WITH OVERRIDE GO
exec xp_cmdshell 'net use \ip\xxx pass /user:xxx /persistent:no'
Use Master GO
EXEC master.dbo.sp_configure 'show advanced options', 1 RECONFIGURE WITH
OVERRIDE GO
EXEC master.dbo.sp_configure 'xp_cmdshell', 0 RECONFIGURE WITH OVERRIDE
Ответ 7
Вы должны создать хранимую процедуру, в которую вы поместите свой xp_cmdshell script.
Хранимая процедура выполняется с использованием учетной записи администратора, поэтому ваша xp_cmdshell будет успешно выполняться при выполнении хранимой процедуры
create procedure RunShellIndirectly
as
declare @tawandachinaka as varchar(50)
set @tawandachinaka='DIR "c:\scrap measurement\"*.csv /B'
EXEC xp_cmdshell @tawandachinaka