Выполнить команду 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) не требует проверки подлинности, поскольку учетные данные уже установлены в ОС.

Ответ 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