【问题标题】:How to run IIS Express as a process started via a Windows Service如何将 IIS Express 作为通过 Windows 服务启动的进程运行
【发布时间】:2011-02-08 09:29:26
【问题描述】:

我正在尝试将 IIS Express 与我的应用程序一起分发。 IIS Express 将在端口 80 上提供外部 Web 请求。

我在运行 IIS Express 和服务外部请求方面没有任何问题,但是微软以其无限的智慧决定从控制台窗口和系统托盘项运行 IIS Express。您可以通过命令行参数禁用托盘项,但不能通过控制台窗口。

我想在不显示控制台窗口的情况下运行 IIS Express。我还想从 Windows 服务运行 IIS Express。

在我的应用程序中运行以下代码正是我想要的:

    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 服务帐户下运行,但是当我尝试从 Windows 服务运行 IIS Express 进程时,它只是优雅地退出,错误代码为 0。

我尝试了许多方案(从代码 sn-p 中可以看出),但我似乎无法使用我的 Windows 服务运行 IIS Express 并隐藏该死的控制台窗口。

任何建议将不胜感激。

【问题讨论】:

  • 附言。你能接受更多的答案吗?对你提出的问题。

标签: iis-express


【解决方案1】:

答案如下: 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 添加 urlacl url=http://WhateverMachineName:80/ user=everyone

您可以将“所有人”限制为仅用于运行您的服务的特定帐户。当您这样做时,IIS express 应该能够正常启动而无需管理员权限。

【讨论】:

  • 我知道这是一个旧线程,但我正在尝试做同样的事情,但我无法让它与 C:\program files (x86)\ 中的 32 位 iisexpress.exe 一起工作IIS 快递。出于某种原因,只有 64 位 iisexpress.exe 有效。
【解决方案2】:

要以管理员身份运行 IIS 7.5,只需将代码稍微更改为:

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

这也将使您能够在端口 80 上运行您的网站。

【讨论】:

    【解决方案3】:

    试试这个。我们有同样的情况,这很有效。这可能会对您有所帮助。

    这适用于不需要管理员权限的 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
    });
    

    【讨论】:

    • 感谢您抽出宝贵时间,但是正如我在问题中提到的那样,这在尝试使用端口 80 时不起作用,因为在端口 80 上提供外部请求时,IIS Express 必须以管理员身份运行。
    【解决方案4】:

    在 iis.net 论坛上有一个类似的问题(在没有控制台窗口的情况下运行 iisexpress)。 请看http://forums.iis.net/p/1175262/1970513.aspx#1970513

    【讨论】:

    • 感谢您的链接和投票。我认为在隐藏控制台窗口时,越来越多的人正在用鼹鼠山制造山峰,但话说回来,他们只使用批处理文件!我遇到的问题是将它作为在 Windows 服务中启动的进程运行。我无法让它运行,更不用说没有控制台窗口了。
    • David.. 我认为您需要检查“会话 0 隔离”.. 根据您的评论,我认为您正在尝试从 Windows 服务内部启动 IIS express...它将启动 IIS,但这将在会话 0 中...检查当您运行您的服务时转到任务管理器-> 进程-> 单击显示所有用户的进程。在那里,您可以看到 IIS 以您的名义运行,但会话 id 为 0……即使我正在寻找相同的解决方案。如果你得到一个..也请告诉我
    【解决方案5】:

    我知道这是一篇旧帖子,但您是否考虑过 Microsoft 的 SRVANY Service Wrapper?

    它作为 Windows 服务安装和运行(在任何凭据下),并在无 Windows 进程中启动您的进程。

    任何您可以从命令行(或开始/运行窗口)运行的东西,您都可以通过 SRVANY 作为服务运行:

    写得不错: http://www.tacktech.com/display.cfm?ttid=197

    【讨论】:

      【解决方案6】:

      如果你还想使用80端口就不行了。

      【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-02
      • 2012-04-14
      • 2016-04-18
      • 2015-03-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多