У меня проблема с запуском процессов в олицетворенном контексте в ASP.NET 2.0.
Я запускаю новый процесс в коде веб-службы. IIS 5.1, .NET 2.0
[WebMethod]
public string HelloWorld()
{
string path = @"C:\KB\GetWindowUser.exe";
ProcessStartInfo startInfo = new ProcessStartInfo();
startInfo.WorkingDirectory = Path.GetDirectoryName(path);
startInfo.FileName = path;
startInfo.UseShellExecute = false;
startInfo.CreateNoWindow = true;
startInfo.ErrorDialog = false;
startInfo.RedirectStandardOutput = true;
startInfo.RedirectStandardError = true;
Process docCreateProcess = Process.Start(startInfo);
string errors = docCreateProcess.StandardError.ReadToEnd();
string output = docCreateProcess.StandardOutput.ReadToEnd();
}
«C: \ KB \ GetWindowUser.exe» - это консольное приложение, содержащее следующий код:
static void Main(string[] args)
{
Console.WriteLine("Windows: " + WindowsIdentity.GetCurrent().Name);
}
Когда я вызываю веб-службу без олицетворения, все работает нормально.
Когда я включаю олицетворение, в переменную "errors" кода веб-службы записывается следующая ошибка:
Необработанное исключение: System.Security.SecurityException: доступ запрещен. \ R \ n \ r \ n в System.Security.Principal.WindowsIdentity.GetCurrentInternal (TokenAccessLevels loadedAccess, Boolean threadOnly) \ r \ n в System.Security.Principal.WindowsIdentity .GetCurrent () \ r \ n в ObfuscatedMdc.Program.Main (String [] args) \ r \ nЗона сборки, в которой произошел сбой, была: \ r \ nMyComputer
Выдающийся пользователь является локальным администратором и имеет доступ к исполняемому файлу C: \ KB \ GetWindowUser.exe.
Когда я явно указываю пользователя окна в свойствах ProcesStartInfo Домен, Пользователь и Пароль, я получил следующее сообщение: http://img201.imageshack.us/img201/5870/pstartah8.jpg
Можно ли запустить процесс с учетными данными, отличными от ASPNET, из asp.net (IIS 5.1)?





Что именно ты пытаешься сделать? Я не совсем понимаю, в чем смысл вашего кода в создании другого исполняемого файла. Выглядит довольно странно. Возможно, было бы полезнее сначала изложить деловую проблему, которую вы пытаетесь решить.
Похоже, вы пытаетесь заставить службу IIS выдавать себя за пользователя с более высокими привилегиями, чем сама служба (в данном случае за администратора). Windows блокирует это как брешь в безопасности, поскольку в этот момент вы просто умоляете кого-то взять на себя управление вашей системой. Возможно, есть способ обойти это ограничение, но не делайте этого - это для вашего же блага.
Вместо этого попросите IIS выдать себя за пользователя с ограниченными разрешениями, у которого есть именно те права, которые вам нужны. Например. создайте учетную запись пользователя, которая владеет только теми папками, в которые ваша веб-служба должна писать, или любой другой подходящей комбинацией прав. Если вы выдаете себя за ограниченного пользователя, вы не увидите этот код ошибки, но все равно сможете вызвать доброкачественный исполняемый файл, который у вас есть.
Вы должны поместить привилегированный код в GAC (или запустить его с полным доверием).
Код в GAC должен подтверждать XXXPermission, где XXX - это разрешение, которое вы запрашиваете, будь то выдача себя за другое лицо, доступ к жесткому диску или что-то еще.
Вы должны вернуть утверждение сразу после слов.
Вы должны убедиться, что API вашей DLL, который вы помещаете в GAC, не имеет возможности для злоупотреблений. Например, если вы пишете веб-сайт, позволяющий пользователям выполнять резервное копирование сервера через приложение командной строки, ваш API должен по-прежнему предоставлять такой метод, как «BackUp ()», а не «LaunchAribitraryProcess (строковый путь)».
В файле web.config также должно быть настроено олицетворение, иначе вы столкнетесь с проблемами разрешения NTFS, а также с CAS.
Вот полное объяснение.
Вы также можете попробовать обернуть свой код внутри
using (Impersonator person = new Impersonator("domainName", "userName",
"password")
{
// do something requiring special permissions
}
как упомянуто в http://www.devnewsgroups.net/group/microsoft.public.dotnet.framework.windowsforms/topic62740.aspx
какое-либо окончательное решение с полным образцом исходного кода, работающим над этим?