パラメータとして渡されたコマンドを実行する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
が表示されますが、usernameカラムには値はありません。 SQL Serverサービスはローカルシステムアカウントで実行されています。
ここで何が問題になりますか?それがパーミッションに関連している場合、ストアドプロシージャを呼び出すユーザのコンテキストの下でCLRストアドプロシージャを実行する方法はありますか?
ありがとうございました。それは私にとって不思議なように働いた。 – Mahesh