2010-05-11 23 views
6

tôi chạy một chương trình bên ngoài từ ASP.NET:NET 4: Process.Start bằng các thông tin trả về đầu ra sản phẩm nào

var process = new Process(); 
var startInfo = process.StartInfo; 

startInfo.FileName = filePath; 
startInfo.Arguments = arguments; 

startInfo.UseShellExecute = false; 
startInfo.RedirectStandardOutput = true; 
//startInfo.RedirectStandardError = true; 

process.Start(); 

process.WaitForExit(); 

Console.Write("Output: {0}", process.StandardOutput.ReadToEnd()); 
//Console.Write("Error Output: {0}", process.StandardError.ReadToEnd()); 

Tất cả mọi thứ hoạt động tốt với mã này: các chương trình bên ngoài được thực hiện và quá trình. StandardOutput.ReadToEnd() trả về kết quả chính xác.

Nhưng sau khi tôi thêm hai dòng sau trước khi Process.Start() (để chạy các chương trình trong bối cảnh của một tài khoản người dùng):

startInfo.UserName = userName; 
startInfo.Password = securePassword; 

Chương trình không được thực hiện và quá trình. StandardOutput.ReadToEnd() trả về một chuỗi rỗng. Không có ngoại lệ nào được ném ra.

userNamesecurePassword là chính xác (trong trường hợp thông tin không chính xác một ngoại lệ được ném).

Cách chạy chương trình trong ngữ cảnh của tài khoản người dùng khác?

Môi trường: NET 4, Windows Server 2008 32bit

UPD:

Ứng dụng này hoạt động tốt dưới ASP.NET máy chủ phát triển + Windows 7, nhưng không thành công trên IIS 7 + Windows Server 2008 Web Edition.

UPD2:

Các mặt hàng này trong nhật ký sự kiện:

Faulting cryptcp.exe ứng dụng, phiên bản 3.33.0.0, thời gian tem 0x4be18460, đứt gãy module kernel32.dll, phiên bản 6.0.6002.18005, thời gian tem 0x49e03821, mã ngoại lệ 0xc0000142, lỗi offset 0x00009eed, quá trình id 0xbf4, thời gian bắt đầu ứng dụng 0x01caf1b91f5b851a.

cryptcp.exe là tên của ứng dụng bên ngoài.

+0

Mặt khác, câu hỏi này http://stackoverflow.com/questions/2345620/alternative-to-allow-service-to-interact-with-desktop, được tìm thấy bằng cách tìm kiếm cùng một lỗi bù đắp và kernel32.dll có thể chỉ ra rằng đó là một vấn đề không thể khắc phục khi bạn đang chạy dưới IIS - cryptcp.exe phải tương tác với máy tính để bàn theo một cách nào đó (theo cách đọc của tôi) –

Trả lời

1

Nhìn vào MSDN documentation có một vài mục khác được đề xuất định cấu hình để khởi động ứng dụng đúng cách với tư cách người dùng khác.

  1. Đặt miền, tên người dùng, và các đặc tính mật khẩu (Bạn nên đặt tên miền)
  2. Đặt thư mục làm việc như theo mặc định với tên người dùng/mật khẩu nó là thư mục system32

có thể giúp bạn giải quyết vấn đề này.

+1

Kết quả tương tự. – alexey

2

According to Microsoft, bạn không thể đọc đầu ra tiêu chuẩn VÀ lỗi chuẩn như vậy khi nó kết thúc bế tắc. Để giải quyết, hãy sử dụng một cái gì đó như sau:

private readonly StringBuilder outputText = new StringBuilder(); 
private readonly StringBuilder errorText = new StringBuilder(); 

. . .

 process.OutputDataReceived += delegate(
      object sendingProcess, 
      DataReceivedEventArgs outLine) 
     { 
      if (!string.IsNullOrEmpty(outLine.Data)) 
      { 
       outputText.AppendLine(outLine.Data); 
      } 
     }; 

     process.ErrorDataReceived += delegate(
      object sendingProcess, 
      DataReceivedEventArgs errorLine) 
     { 
      if (!string.IsNullOrEmpty(errorLine.Data)) 
      { 
       errorText.AppendLine(errorLine.Data); 
      } 
     }; 

     process.BeginOutputReadLine(); 
     process.BeginErrorReadLine(); 
     process.WaitForExit(); 
     Console.WriteLine(errorText.ToString()); 
     Console.WriteLine(outputText.ToString()); 
+0

Cảm ơn, bình luận tốt. Nhưng câu hỏi này giải quyết một vấn đề khác. Tôi sẽ bình luận chuyển hướng đầu ra lỗi. – alexey

1

Có thể ứng dụng bạn đang bắt đầu cần tải hồ sơ (theo mặc định, sẽ không có). Bạn đã thử đặt thuộc tính LoadUserProfile thành true?

3

Tôi nhận ra điều này đã được hỏi một thời gian trước, nhưng tôi gặp phải cùng một vấn đề và tìm ra giải pháp trên trang web này: The Perils and Pitfalls of Launching a Process Under New Credentials

Áp dụng các giải pháp dưới phần Application Không thể khởi tạo đúng cố định nó cho tôi.

Hy vọng điều này sẽ tiết kiệm thời gian và thất vọng của người khác!

+0

Bằng cách này, bạn có nghĩa là sửa chữa là gì? Trang web được liên kết bị hỏng. – Doug