2011-08-26 28 views
8

Tôi muốn chạy một quy trình từ một máy khách mạng nội bộ ở phía dịch vụ WCF. Trong trường hợp của tôi, một khách hàng yêu cầu một máy chủ tạo một quy trình mới trên máy của máy chủ theo các thông tin được cung cấp. dịch vụ WCF được lưu trữ trên IIS 7.5 và tôi bắt đầu một quá trình sử dụng mã nàyLàm cách nào để bắt đầu quá trình từ dịch vụ WCF được lưu trữ trên IIS?

var processInfo = new ProcessStartInfo("C:\\Windows\\System32\\notepad.exe") 
{ 
    UserName = "some user", 
    Password = MakeSecureString("some password"), 
    UseShellExecute = false, 
    LoadUserProfile = true 
}; 

Process process = Process.Start(processInfo); 

Mã này hoạt động nếu tôi tổ chức dịch vụ WCF như một ứng dụng giao diện điều khiển tự lưu trữ chạy dưới dùng admin và tôi thấy notepad bắt đầu dưới người dùng khác . Nó không thành công trên IIS không có ngoại lệ, nhưng quá trình được ngay lập tức chấm dứt

process.HasExited = true; 
process.ExitCode = -1073741502; 

Mở ứng dụng IIS WCF đang chạy theo người sử dụng với quyền quản trị và đã có niềm tin đầy đủ theo quy định tại web.config. Tôi không thể sử dụng ứng dụng tự lưu trữ vì nó không hỗ trợ giao hàng liên tục dễ dàng (như WebDeploy với các trang web IIS).

Q: Làm cách nào để bắt đầu quá trình ở phía máy chủ từ dịch vụ WCF được lưu trữ trên IIS?

EDIT:
tôi stumbled khi post này, với các vấn đề tương tự và tôi đã thử tất cả các phương pháp đó, bao gồm tất cả các biến thể cho Process.Start và P/Invoke với CreateProcessWithLogonW và CreateProcessAsUser Tôi cũng đã cố gắng cấp giấy phép bổ sung cho người dùng. Không phải điều này sẽ làm việc với các thông báo lỗi giống với những thông báo mà anh chàng đã đăng.

+0

bất kỳ giải pháp cuối cùng nào có mẫu mã nguồn đầy đủ? – Kiquenet

+0

Nó không thể không có hack hacks. Tôi đã không làm điều đó. – oleksii

+0

mà hacks bẩn? – Kiquenet

Trả lời

4

Oleksii, điểm là nếu bạn lưu trữ các dịch vụ WCF trong một ứng dụng giao diện điều khiển, có một phiên cửa sổ (một người dùng đăng nhập và Windows Explorer nạp) cho người dùng đó và notepad được mở ra và hiển thị cho người dùng đó, vì vậy bạn thấy nó trong giao diện người dùng.

khi bạn lưu trữ dịch vụ WCF trong IIS, là máy chủ, IIS yêu cầu và không cho phép tương tác người dùng và cũng hoạt động nếu không có người dùng nào đăng nhập; trong bối cảnh đó, không có giao diện người dùng nào lưu trữ notepad hoặc các ứng dụng hỗ trợ giao diện người dùng khác, bạn có thể thực hiện quy trình tạo công việc hoặc các công việc theo lô khác nhưng không hiển thị ứng dụng giao diện người dùng cửa sổ, vì Windows Explorer không được tải cho bạn và không có chỗ hiển thị giao diện người dùng của quy trình của bạn.

+1

Tôi muốn WCF dịch vụ lưu trữ trong IIS (với người dùng A trong AppPool), và mạo danh với người dùng khác B khi tôi gọi lệnh EXE của tôi (commandline, không phải UI) bằng cách sử dụng Process.Start. Bất kỳ đề xuất? Có lẽ không thể. – Kiquenet

1

đây là những gì tôi sử dụng để gọi GnuPGP để thực hiện mã hóa. Thiết lập của bạn so sánh như thế nào?

private int ExecuteCommand(string arguments, string passPhrase, int timeout) 
     { 
      Process processObject; 
      ProcessStartInfo pInfo = new ProcessStartInfo(_executablePath, arguments); 


      pInfo.CreateNoWindow = true; 
      pInfo.UseShellExecute = false; 

      pInfo.RedirectStandardInput = true; 
      pInfo.RedirectStandardOutput = true; 
      pInfo.RedirectStandardError = true; 
      processObject = Process.Start(pInfo); 

      if (!string.IsNullOrEmpty(passPhrase)) 
      { 
       processObject.StandardInput.WriteLine(passPhrase); 
       processObject.StandardInput.Flush(); 
      } 

      string result = processObject.StandardOutput.ReadToEnd(); 
      string error = processObject.StandardError.ReadToEnd(); 

      if (!processObject.WaitForExit(timeout)) 
      { 
       throw new TimeoutException("GnuPG operation timeout. Waited " + timeout + " milliseconds "); 
      } 

      int exitcode = processObject.ExitCode; 

      Error = error; 
      Output = result; 

      return exitcode; 

     } 
+0

Không có điều đó sẽ không giúp đỡ sau dòng này 'processObject = Process.Start (pInfo);' nó có HasExited được đặt thành true. – oleksii

+0

Bạn không thực sự cố gắng chạy notepad, phải không? –

+0

thực sự tôi là, nó là một khai thác thử nghiệm kiểm tra khả năng của phần mềm khác để phát hiện một quá trình bắt đầu. – oleksii

1

Có cài đặt ứng dụng để đảm bảo cài đặt này tải hồ sơ người dùng.

loadUserProfile Optional Boolean attribute. 

Specifies whether IIS loads the user profile for the application pool identity. Setting  
this value to false causes IIS to revert to IIS 6.0 behavior. IIS 6.0 does not load the 
user profile for an application pool identity. 

The default value is false. 

Điều đó cùng với việc trở thành người dùng miền với danh tính đủ quyền có thể hoạt động ?? Tôi biết rằng ở mức tối thiểu người dùng sẽ cần hồ sơ người dùng.

Điều đó nói rằng, đó là một chút kiến ​​trúc kỳ lạ. Nó có vẻ như một vòm tốt hơn sẽ có một quá trình liên tục như một dịch vụ cửa sổ mà các trang web giao tiếp với nhưng tôi không chắc chắn những hạn chế của bạn là gì.

Hy vọng điều đó sẽ hữu ích.

+0

Cảm ơn câu trả lời của bạn. Điều này có ý nghĩa. Với IIS, việc cung cấp sản phẩm qua WebDeploy dễ dàng hơn khi tôi có thể tạo một trang trại. Điều đó nói rằng, tôi đã thử Win Service và có cùng một vấn đề ở đó. Tôi đang đảo ngược để lưu trữ dòng lệnh và triển khai kịch bản vì nó là đau đớn để cấu hình này trên IIS. – oleksii

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