2012-04-19 30 views
6

Tôi đang bắt đầu một ứng dụng bảng điều khiển nhỏ từ bên trong ứng dụng web IIS của tôi. Mã này được bắt đầu từ bên trong bể bơi ứng dụng sử dụng mã như thế này,Sự khác biệt nào có UseShellExecute có?

Process process = new Process(); 
ProcessStartInfo processStartInfo = new ProcessStartInfo(); 

processStartInfo.CreateNoWindow = true; 
processStartInfo.WindowStyle = ProcessWindowStyle.Hidden; 

// .. 

process.Start(); 

tôi sử dụng để liên tục gặp phải lỗi,

Win32Exception exception has occured Message: No such interface supported 
ErrorCode: 80004005 NativeErrorCode: 80004002 

tôi đã chứng minh rằng khi điều này xảy ra các ứng dụng giao diện điều khiển sẽ không bắt đầu từ tất cả các.

tôi đã thêm vào mã ở trên này,

processStartInfo.UseShellExecute = false; 

Và vấn đề đã ra đi (cho đến nay, những ngón tay vượt qua). Tôi hiểu rằng bằng cách thực hiện thay đổi này, nó không yêu cầu ngữ cảnh máy tính để bàn hợp lệ để chạy, nhưng điều đó có nghĩa là gì. Nếu điều đó có nghĩa là chúng tôi không thể chạy mã trên nếu không có máy tính để bàn (áp dụng cho một nhóm ứng dụng IIS đang chạy với người dùng hệ thống), thì tại sao nó lại chạy trong quá khứ thay vì thất bại mỗi lần?

Có ai có bất kỳ ý tưởng nào tại sao điều này sẽ tạo sự khác biệt không? Không hỗ trợ giao diện nào trong ngữ cảnh này?

CẬP NHẬT:

Tôi đã thực hiện mọi thứ mọi người đã nói và tự nghiên cứu thêm. Vì vậy, để tóm tắt nếu bạn có UseShellExecute = true (đó là mặc định) thì nó sẽ gọi ShellExecuteEX trong shell32.dll để thực thi quá trình. Nó sẽ làm được điều này thực sự (sao chép từ System.dll sử dụng ILSpy),

public bool ShellExecuteOnSTAThread() 
{ 
    if (Thread.CurrentThread.GetApartmentState() != ApartmentState.STA) 
    { 
     ThreadStart start = new ThreadStart(this.ShellExecuteFunction); 
     Thread thread = new Thread(start); 
     thread.SetApartmentState(ApartmentState.STA); 
     thread.Start(); 
     thread.Join(); 
    } 
    else 
    { 
     this.ShellExecuteFunction(); 
    } 
    return this._succeeded; 
} 

Nếu bạn có UseShellExecute = false thì nó sẽ gọi CreateProcess trong kernel32.dll để bắt đầu quá trình.

Tôi đã tự hỏi liệu có sự cố với mã ShellExecuteOnSTAThread ở trên đang tạo chuỗi mới không? Có thể các hồ bơi ứng dụng đạt được một số giới hạn về luồng mà gián tiếp có thể gây ra một Win32Exception?

+0

Tôi đã thấy chế độ lỗi cụ thể này được đề cập nhiều lần trong vài tháng qua. Không có gì gần với một lời giải thích, nhưng bằng cách sử dụng UseShellExecute = false sẽ nhất định sửa chữa nó. –

+0

Cảm ơn. Bạn đã thấy nó ở đâu khác? Tôi thực sự không thể tìm thấy nó ở đâu? Xin lỗi nếu tôi hỏi một câu hỏi bạn không thể trả lời, nhưng tôi sẽ tò mò nếu bạn có thể tìm thấy chúng. – peter

+1

Điều này không trả lời những gì Hans đang nhận được nhưng câu hỏi SO này có một số chi tiết thú vị: http://stackoverflow.com/questions/5255086/when-do-we-need-to-set-useshellexecute-to-true –

Trả lời

7

Lỗi này có thể xảy ra khi một số đối tượng COM không được đăng ký, mặc dù đó là một chút bí ẩn đối với tôi tại sao nó không liên tục.

Trong sự công bằng, sinh ra một thực thi cục bộ từ bên trong IIS là một điều khá hiếm và nó có thể gây ra vấn đề bảo mật hoặc ít nhất gây ra sự cố với IIS nếu lệnh không thành công vì lý do nào đó và không t kiểm soát trở lại hệ thống. Trong thực tế, thực hành tốt nhất cho một cái gì đó như thế là ghi lại hành động mà bạn cần xảy ra bên trong cơ quan đăng ký, cơ sở dữ liệu hoặc một số loại tập tin và chạy ứng dụng cục bộ của bạn như một nhiệm vụ theo lịch hoặc một dịch vụ windows.

Để tham chiếu, UseShellExec cho biết hạt nhân có nên khởi động trực tiếp exe hay không hoặc liệu nó có nên yêu cầu Explorer khởi chạy tệp hay không.

Bạn có thể gặp phải sự cố này khi không có ai đăng nhập để không nhất thiết phải một trình nạp được tải để khởi chạy exe. Tuy nhiên, cuối cùng, những gì bạn đang cố gắng làm là một điều tồi tệ trong sản xuất - bạn không thể đảm bảo trạng thái của IIS khi nó cố gắng khởi chạy exe này và đúng như vậy, IIS không phải là một Shell.

+0

Để đủ điều kiện quan tâm bảo mật, IIS thường chạy với các đặc quyền cao và khởi chạy một quá trình theo cách bạn đang cố gắng khởi động nó với cùng một tập các đặc quyền. IMHO điều này hiếm khi là một điều tốt. –

+1

OK, cảm ơn. Tôi không lo lắng về an ninh, tôi không có thời gian để giải thích toàn bộ câu chuyện về điều đó. Tôi đồng ý, bạn nói rằng chúng tôi có thể gặp sự cố khi không có ai đăng nhập vào máy chủ. Nghe có vẻ đúng, nhưng có vẻ như không phải vậy. Nó phải liên quan đến một số vấn đề khác mà 'tải vỏ' gây ra. – peter

+0

Bảo mật sang một bên, nó vẫn là một câu hỏi về việc có một trạng thái hợp lệ trên máy chủ. Điều gì sẽ xảy ra nếu một cái gì đó ngăn chặn các exe và quá trình công nhân IIS khởi động lại hoặc quay xuống vì một thời gian chờ hoạt động? Tôi đoán biết những gì exe này được dự định làm là sẽ giúp đỡ; ngay cả khi bạn chỉ có thể cung cấp chế độ xem dặm cao. –

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