Как запустить IIS Express как процесс, запущенный через службу Windows - PullRequest
10 голосов
/ 08 февраля 2011

Я пытаюсь распространить IIS Express с моим приложением. IIS Express будет обслуживать внешние веб-запросы через порт 80.

У меня нет проблем с запуском IIS Express, а также с обслуживанием внешних запросов, однако Microsoft в своей бесконечной мудрости решила запустить IIS Express из окна консоли, а также из панели задач. Вы можете отключить лоток с помощью аргумента командной строки, но не окна консоли.

Я хочу запустить IIS Express без отображения окна консоли. Я также хочу запустить IIS Express из службы Windows.

Запуск следующего кода из моего приложения делает именно то, что я хочу:

    Directory.SetCurrentDirectory(string.Format("{0}\\IIS Express", iisProgramDirectory));
    process.EnableRaisingEvents = true;
    //process.Exited += new EventHandler(process_Exited);
    process.StartInfo.FileName = "iisexpress.exe";
    process.StartInfo.Arguments = string.Format("\"/config:{0}webservice\\config\\applicationhost.config\"", dataDirectory);
    process.StartInfo.UseShellExecute = false;
    process.StartInfo.RedirectStandardOutput = true;
    process.StartInfo.RedirectStandardError = true;
    process.StartInfo.CreateNoWindow = true;
    process.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
    //process.StartInfo.UserName = "Administrator";
    //System.Security.SecureString securePwd = new System.Security.SecureString();
    //string password = "**********";
    //char[] pword = password.ToCharArray();
    //for (int i = 0; i < pword.Length; i++)
    //{
    //  securePwd.AppendChar(pword[i]);
    //}
    //process.StartInfo.Password = securePwd;
    process.Start();

Очевидно, я работаю администратором. IIS Express, очевидно, должен работать с правами администратора для обслуживания внешних запросов, а также для прослушивания порта 80.

Моя служба Windows работает под учетной записью службы Windows, которая, я считаю, имеет полные права, но процесс IIS Express просто грациозно завершается с кодом ошибки 0, когда я пытаюсь запустить его из службы Windows.

Я пробовал несколько сценариев (как вы можете видеть из фрагмента кода), но, похоже, нет способа заставить IIS Express работать с использованием моей службы Windows И скрыть проклятое окно консоли.

Любые предложения будут оценены.

Ответы [ 6 ]

7 голосов
/ 06 апреля 2011

Ответ вроде: string IIS_EXPRESS = @ "C: \ Program Files \ IIS Express \ iisexpress.exe";

    StringBuilder arguments = new StringBuilder();
    arguments.Append(@"/path:");
    arguments.Append(@"C:\Inetpub\wwwroot\ClientSyncService");
    arguments.Append(@" /Port:2000");
    Process process = Process.Start(new ProcessStartInfo()
        {
            FileName = IIS_EXPRESS,
            Arguments = arguments.ToString(),
            RedirectStandardOutput = true,
            UseShellExecute = false,
            CreateNoWindow = true
        });

Должно работать, однако хитрость заключается в том, что вам нужно предоставить ACL для идентификации службы, чтобы она могла стать владельцем порта 80. Другими словами, во время вашей программы установки (при условии, что у вас MSI, который будет работать с повышенными правами), заставьте ее запустить командную строку, например: netsh http add urlacl url = http://WhateverMachineName:80/ пользователь = все

, где вы можете ограничить "всех" вместо этого только конкретной учетной записью, под которой будет работать ваша служба. Когда вы это сделаете, IIS Express сможет нормально запускаться, не требуя прав администратора.

3 голосов
/ 10 августа 2012

Чтобы запустить IIS 7.5 от имени администратора, просто слегка измените свой код на:

Process process = Process.Start(new ProcessStartInfo()
{
    FileName = IIS_EXPRESS,
    Arguments = arguments.ToString(),
    RedirectStandardOutput = true,
    UseShellExecute = true,
    CreateNoWindow = true,
    Verb = "runas"
});

Это также позволит вам запустить сайт на порту 80.

2 голосов
/ 18 февраля 2011

Попробуй это.У нас была такая же ситуация, и это сработало.Это может вам помочь.

Это с IIS Express 7.5, который не нуждается в правах администратора.

string IIS_EXPRESS = @"C:\Program Files\IIS Express\iisexpress.exe";

StringBuilder arguments = new StringBuilder();
arguments.Append(@"/path:");
arguments.Append(@"C:\Inetpub\wwwroot\ClientSyncService");
arguments.Append(@" /Port:2000");
Process process = Process.Start(new ProcessStartInfo()
{
    FileName = IIS_EXPRESS,
    Arguments = arguments.ToString(),
    RedirectStandardOutput = true,
    UseShellExecute = false,
    CreateNoWindow = true
});
0 голосов
/ 27 июня 2013

Я знаю, что это старый пост, но рассматривали ли вы Microsoft SRVANY Service Wrapper?

Он устанавливается и запускается как служба Windows (с любыми учетными данными) и запускает ваш процесс в процессе без окон.

Все, что вы можете запустить из командной строки (или из окна Пуск / Запуск), вы можете запустить как службу через SRVANY:

Хорошая запись по адресу: http://www.tacktech.com/display.cfm?ttid=197

0 голосов
/ 28 июня 2011

Это невозможно сделать, если вы также хотите использовать порт 80.

0 голосов
/ 08 февраля 2011

Похожий вопрос (запуск iisexpress без консольного окна) на форумах iis.net.Пожалуйста, посмотрите на http://forums.iis.net/p/1175262/1970513.aspx#1970513

...