Вопрос

У меня проблема с запуском процессов в олицетворенном контексте в 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 выдавать себя за пользователя с ограниченными разрешениями, который обладает именно теми правами, которые вам нужны.Например.создайте учетную запись пользователя, которая владеет только теми папками, в которые вы хотите, чтобы ваша веб-служба выполняла запись, или любой другой подходящей комбинацией прав.Если вы выдаете себя за пользователя с ограниченным доступом, вы не увидите этот код ошибки, но все равно сможете вызвать безопасный исполняемый файл, который у вас есть здесь.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top