Запуск процесса и олицетворение
Вопрос
У меня проблема с запуском процессов в олицетворенном контексте в 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" в коде веб-сервиса записывается следующая ошибка:
Необработанное Исключение:Система.Безопасность.Исключение SecurityException:Доступ запрещен. в системе.Безопасность.Директор.Идентификатор Windows.GetCurrentInternal(TokenAccessLevels желаемый доступ, только логический поток) в системе.Безопасность.Директор.Идентификатор Windows.GetCurrent() в ObfuscatedMdc.Program.Main(Строка[] аргументов) Зоной сборки, в которой произошел сбой, было: MyComputer
Олицетворяемый пользователь является локальным администратором и имеет доступ к C:\KB\GetWindowUser.exe исполняемому файлу.
Когда я явно указываю пользователя window в свойствах ProcesStartInfo Домен, Пользователя и пароль, я получил следующее сообщение:http://img201.imageshack.us/img201/5870/pstartah8.jpg
Можно ли запустить процесс с учетными данными, отличными от ASPNET, из asp.net (IIS 5.1)?
Решение
Вы должны поместить привилегированный код в 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
Что именно ты пытаешься сделать?Я не совсем понимаю, в чем смысл вашего кода в создании другого исполняемого файла.Это выглядит довольно странно.Возможно, было бы более полезно сначала изложить деловую проблему, которую вы пытаетесь решить.
Похоже, вы пытаетесь заставить службу IIS выдавать себя за пользователя с более высокими привилегиями, чем у самой службы (в данном случае администратора).Windows блокирует это как брешь в системе безопасности, поскольку в этот момент вы фактически умоляете кого-то завладеть вашей системой.Возможно, есть способ обойти это ограничение, но не делайте этого - это для вашего же блага.
Вместо этого попросите IIS выдавать себя за пользователя с ограниченными разрешениями, который обладает именно теми правами, которые вам нужны.Например.создайте учетную запись пользователя, которая владеет только теми папками, в которые вы хотите, чтобы ваша веб-служба выполняла запись, или любой другой подходящей комбинацией прав.Если вы выдаете себя за пользователя с ограниченным доступом, вы не увидите этот код ошибки, но все равно сможете вызвать безопасный исполняемый файл, который у вас есть здесь.