11

我正在尝试将 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。

我已经尝试了许多场景(正如您从代码片段中看到的那样),但我似乎无法使用我的 Windows 服务运行 IIS Express 并隐藏该死的控制台窗口。

任何建议将不胜感激。

4

6 回答 6

7

答案如下: 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/ user=everyone

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

于 2011-04-06T05:42:59.580 回答
3

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

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

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

于 2012-08-10T09:58:14.623 回答
2

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

这适用于不需要管理员权限的 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
});
于 2011-02-18T17:01:50.610 回答
0

我知道这是一篇旧帖子,但您是否考虑过 Microsoft 的 SRVANY 服务包装器?

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

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

不错的文章: http ://www.tacktech.com/display.cfm?ttid=197

于 2013-06-26T20:33:38.957 回答
0

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

于 2011-02-08T17:43:58.440 回答
-1

如果您还想使用端口 80,则无法完成。

于 2011-06-28T03:13:20.160 回答