2011-02-08 50 views
10

Tôi đang cố phân phối IIS Express bằng ứng dụng của mình. IIS Express sẽ cung cấp các yêu cầu web bên ngoài trên cổng 80.Cách chạy IIS Express như một quá trình được bắt đầu qua Dịch vụ Windows

Tôi không gặp vấn đề gì khi chạy IIS Express cũng như phục vụ các yêu cầu bên ngoài, tuy nhiên Microsoft trong trí tuệ vô hạn của họ đã quyết định chạy IIS Express từ cửa sổ bảng điều khiển cũng như mục khay hệ thống . Bạn có thể vô hiệu hóa mục khay bằng một đối số dòng lệnh nhưng không phải là cửa sổ bảng điều khiển.

Tôi muốn chạy IIS Express mà không có cửa sổ bảng điều khiển được hiển thị. Tôi cũng muốn chạy IIS Express từ một dịch vụ windows.

Chạy đoạn mã sau từ bên trong ứng dụng của tôi thực hiện chính xác những gì tôi muốn:

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(); 

Rõ ràng là tôi đang chạy as Administrator. IIS Express dường như cần chạy với quyền quản trị để phục vụ các yêu cầu bên ngoài cũng như lắng nghe trên cổng 80.

Dịch vụ cửa sổ của tôi chạy trong tài khoản Windows Service mà tôi cho là có đầy đủ đặc quyền nhưng quá trình IIS Express chỉ thoát ra một cách duyên dáng với mã lỗi của 0 khi tôi cố gắng chạy nó từ dịch vụ windows.

Tôi đã thử một số tình huống (như bạn có thể thấy từ đoạn mã) nhưng dường như không có cách nào tôi có thể chạy IIS Express bằng dịch vụ cửa sổ của mình VÀ ẩn cửa sổ bảng điều khiển darn.

Mọi đề xuất sẽ được đánh giá cao.

+1

PS. bạn cũng có thể chấp nhận nhiều câu trả lời hơn cho các câu hỏi bạn đã hỏi không. –

Trả lời

-1

Nó không thể được thực hiện nếu bạn cũng muốn sử dụng Cảng 80.

+0

Xem URL này về cách định cấu hình HTTP.sys để cho phép nghe các yêu cầu trên Cổng 80 với IIS Express. http://learn.iis.net/page.aspx/1005/handling-url-binding-failures-in-iis-express/ –

0

Có một câu hỏi tương tự (chạy iisexpress không có cửa sổ bảng điều khiển) trên diễn đàn iis.net. Vui lòng xem http://forums.iis.net/p/1175262/1970513.aspx#1970513

+0

Cảm ơn bạn đã liên kết và bỏ phiếu. Tôi nghĩ rằng nhiều người đang làm cho núi ra khỏi molehills khi nói đến ẩn cửa sổ giao diện điều khiển nhưng sau đó một lần nữa họ chỉ sử dụng các tập tin thực thi! Vấn đề tôi đang gặp là chạy nó như là một quá trình bắt đầu trong một dịch vụ windows. Tôi không thể làm cho nó chạy một mình mà không có một cửa sổ giao diện điều khiển. – David

+0

David .. tôi nghĩ rằng u cần phải kiểm tra về "cách ly 0 Session" .. mỗi bình luận của bạn tôi lấy nó như là bạn đang cố gắng để bắt đầu IIS thể hiện từ bên trong một cửa sổ dịch vụ ... nó sẽ bắt đầu IIS nhưng sẽ có trong phiên 0 ... để kiểm tra xem khi bạn chạy dịch vụ ur đi đến trình quản lý tác vụ-> quy trình-> hãy nhấp vào hiển thị quy trình từ tất cả người dùng. Ở đó bạn có thể thấy IIS chạy dưới tên của bạn nhưng với id phiên 0 ... thậm chí tôi đang tìm kiếm một giải pháp cho cùng. nếu bạn nhận được một .. xin vui lòng cho tôi cũng biết – Gautam

2

Hãy thử điều này. Chúng tôi đã có tình trạng tương tự và điều này đã làm việc. Điều này có thể giúp bạn.

Đây là với IIS Express 7.5 không cần quyền quản trị viên.

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

Cảm ơn đã dành thời gian như tôi đã đề cập trong câu hỏi của tôi, điều này sẽ không hoạt động khi cố gắng sử dụng cổng 80 như IIS Express phải được chạy như quản trị viên khi phục vụ yêu cầu bên ngoài trên cổng 80 – David

7

Câu trả lời như: chuỗi 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 
     }); 

nên làm việc, tuy nhiên Bí quyết là bạn cần phải cấp ACL cho danh tính của dịch vụ để có thể mất quyền sở hữu cổng 80. Nói cách khác, trong chương trình cài đặt của bạn (giả sử bạn có một MSI sẽ chạy cao), làm cho nó chạy một dòng lệnh như: netsh http add url url url = http: // WhateverMachineName: 80/user = Mọi người

nơi bạn có thể giới hạn "mọi người" thay vào đó chỉ là một tài khoản mà dịch vụ của bạn sẽ chạy. Khi bạn làm điều đó, sau đó IIS express sẽ có thể bắt đầu tốt mà không yêu cầu đặc quyền quản trị viên.

+0

Tôi biết đây là một chủ đề cũ nhưng tôi đang cố gắng để làm điều tương tự nhưng tôi không thể làm cho nó hoạt động với 32-bit iisexpress.exe được tìm thấy trong C: \ program files (x86) \ IIS Express. Chỉ có 64-bit iisexpress.exe hoạt động vì một lý do nào đó. – Dan

3

Để chạy IIS 7.5 as administrator, chỉ cần thay đổi mã của bạn hơi to:

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

này cũng sẽ cho phép bạn chạy trang web của bạn trên cổng 80.

0

Tôi biết đây là một bài đăng cũ, nhưng bạn có coi là Trình bao bọc dịch vụ SRVANY của Microsoft không?

Cài đặt và chạy dưới dạng Dịch vụ Windows (dưới mọi thông tin xác thực) và khởi chạy quy trình của bạn trong quy trình không cửa sổ.

Bất cứ điều gì bạn có thể chạy từ một dòng lệnh (hoặc Start/Run cửa sổ), bạn có thể chạy như một dịch vụ qua SRVANY:

đẹp viết lên tại địa chỉ: http://www.tacktech.com/display.cfm?ttid=197

Các vấn đề liên quan