я могу выполнить команду DOS из библиотеки классов C #? - PullRequest
0 голосов
/ 13 апреля 2011

Мне нужно создать модуль IIS, который блокирует доступ пользователям, у которых нет сертификата от определенного центра сертификации.Я сделал список доверия сертификатов CTL.Я проверил это с помощью netsh http add sslcert ip .... и это работает.Теперь все, что мне нужно сделать, это реализовать вызов netsh в библиотеке классов c #.Я попытался использовать:

        Process pnet = new Process();
        pnet.StartInfo.FileName = "netsh";
        pnet.StartInfo.Arguments = "http delete sslcert ipport=0.0.0.0:443";
        pnet.StartInfo.UseShellExecute = false;
        pnet.StartInfo.CreateNoWindow = true;
        pnet.Start();
        pnet.Close();

Это работает в консольном приложении C #, но в классе библиотеки C # не запускается.

       namespace IISproject
       {
       public class MyModule : IHttpModule
       {
       #region IHttpModule Members
       public void Dispose()
       { 
       }
       public void Init(HttpApplication context)
       {
       context.PreRequestHandlerExecute += new EventHandler(OnPreRequestHandlerExecute);
    }
    #endregion
    public void OnPreRequestHandlerExecute(Object source, EventArgs e)
    {
        HttpApplication app = (HttpApplication)source;
        HttpRequest request = app.Context.Request;
        if (!String.IsNullOrEmpty(request.Headers["Referer"]))
        {
            throw new HttpException(403,
                                                    "Uh-uh!");
        }
        Process pnet = new Process();
        pnet.StartInfo.FileName = "netsh";
        pnet.StartInfo.Arguments = "http delete sslcert ipport=0.0.0.0:443";
        pnet.StartInfo.UseShellExecute = false;
        pnet.StartInfo.CreateNoWindow = true;
        pnet.Start();
        pnet.Close(); 
    }
}

Что я делаю не так? 10x

Ответы [ 2 ]

1 голос
/ 13 апреля 2011

Что я делаю не так? 10x

Я бы сказал: вы недостаточно заботитесь о безопасности. Очевидно, IIS не будет порождать какие-либо странные приложения. Вам необходимо запустить его в пуле приложений, настроенном для запуска в качестве пользователя с разрешениями на запуск этого процесса.

Вы можете получить преимущество от встроенной аутентификации Windows; таким образом, пользователь, входящий на веб-сервер, будет неявно определять разрешения, с которыми запускается процесс.

Тем не менее, вам будет гораздо лучше использовать собственный API (ADSI, WMI?) Для достижения цели

1 голос
/ 13 апреля 2011

Первый подозреваемый в подобных ситуациях в моей книге, отсутствие подробностей, является своего рода проблемой пути. Попробуйте полностью указать путь к команде и посмотрите, работает ли он лучше.

pnet.StartInfo.FileName = Environment.SystemDirectory + @"\netsh.exe"; // or something like that

Я бы с осторожностью отнесся к общей схеме вызова внешней команды таким образом, но, поскольку вы предоставляете как имя файла, так и его аргументы, это должно быть достаточно безопасно. Если у вас есть время, и вы еще этого не сделали, возможно, вы захотите узнать, есть ли API, чтобы делать то, что вы хотите. Скорее всего, есть; netsh вероятно, не magic.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...