如何将IIS Express作为通过Windows服务启动的进程运行

时间:2011-02-08 09:29:26

标签: iis-express

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

我在运行IIS Express和提供外部请求方面没有任何问题,但Microsoft以其无限的智慧决定从控制台窗口以及系统托盘项运行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并隐藏darn控制台窗口。

任何建议都将受到赞赏。

6 个答案:

答案 0 :(得分: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应该能够在没有管理员权限的情况下正常启动。

答案 1 :(得分: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上运行您的站点。

答案 2 :(得分: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
});

答案 3 :(得分:0)

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

答案 4 :(得分:0)

我知道这是一篇旧帖子,但你考虑过微软的SRVANY Service Wrapper吗?

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

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

好评: http://www.tacktech.com/display.cfm?ttid=197

答案 5 :(得分:-1)

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