Я написал хранимую процедуру CLR для выполнения команды, переданной ей в качестве параметра. Это код хранимой процедуры CLR; Я зарегистрировал сборку как «небезопасную» в SQL Server и создал из нее хранимую процедуру.CLR Сохраненная процедура для выполнения команды
[SqlProcedure]
public static int ExecuteCommand(string cmd)
{
int success = 0;
try
{
EventLog.WriteEntry("MyAppName", "Starting execution " + cmd + " Username: " + System.Security.Principal.WindowsIdentity.GetCurrent().Name + " OR " + Environment.UserName, EventLogEntryType.Information);
Process p = new Process();
p.StartInfo = new ProcessStartInfo() { FileName = "cmd.exe", Arguments = cmd, WindowStyle = ProcessWindowStyle.Hidden};
p.Start();
}
catch (Exception ex)
{
EventLog.WriteEntry("MyAppName", "Executed command : " + cmd + " with error : " + ex.Message, EventLogEntryType.Error);
success = 1;
}
return success;
}
Этот код может написать просмотра событий и выводит имя пользователя, как NT AUTHORITY\SYSTEM
. Затем он запускает cmd.exe
, но он не выполняет переданные команды (например, mkdir) и cmd.exe
остается в рабочем состоянии. В диспетчере задач я могу увидеть несколько экземпляров cmd.exe
для каждого запуска хранимой процедуры, но без значения в столбце имени пользователя. Служба SQL Server работает с учетной записью Local System.
Что здесь общего не работает? Если это связано с разрешениями, то есть способ выполнить хранимую процедуру CLR в контексте пользователя, который вызывает хранимую процедуру?
Спасибо. Это работало, как чудо для меня. – Mahesh