Оказывается есть способ преодолеть эту проблемму, и обеспечить подключение всех из под учетной записи рабочего процесса ASP.NET. У класса WindowsIdentity есть метод Impersonate(IntPtr), который позволяет проводить имперсонацию в ручную (как его использовать - см. MSDN). Если в этот метод передать IntPtr.Zero, то произойдет имперсонация к исходной учетной записи рабочего процесса ASP.NET. Этим и воспользуемся.
// заметьте, метод возвращает уже открытое соединение
public SqlConnection RevertAndOpenConnection(string connectionString)
{
SqlConnection connection = null;
WindowsImpersonationContext ctx = null;
try
{
// Самый главный трюк. Возвращаемся к identity процесса.
ctx = WindowsIdentity.Impersonate(IntPtr.Zero);
connection = new SqlConnection(connectionString);
// Открываем соединение
connection.Open();
}
finally
{
// Восстанавливаем identity потока
if(ctx != null) ctx.Undo();
}
return connection;
}
// пример использования RevertAndOpenConnection()
public void UsingExample()
{
using(SqlConnection connection = RevertAndOpenConnection("Integrated Security=true;server=."))
{
SqlCommand command = new SqlCommand("select suser_sname()", connection);
// в строке userName будет имя учетной записи рабочего процесса
string userName = command.ExecuteScalar().ToString();
System.Diagnostics.Debug.WriteLine(userName);
}
}
Проверял. Трюк работает на IIS 5.0 и IIS6.0 под Windows XP и под Windows2003.
Эту идею мне подкинул коллега Михаил Ознобкин, за что ему от всех нас большой респект.
1 комментарий:
Отправить комментарий