2011-01-28 41 views
7

Tôi đang cố gắng chạy một lệnh thông qua dấu nhắc lệnh từ một ứng dụng web ASP.Net. Tôi có thể thấy quá trình bắt đầu trong trình quản lý tác vụ trên máy chủ web, tuy nhiên quá trình này chỉ nằm ở đó và không bao giờ thoát cũng như không chạy các lệnh mà tôi đã chỉ định.Tại sao sẽ không "cmd.exe/C lệnh" kết thúc khi được gọi thông qua Process.Start()?

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

      startInfo.FileName = "cmd.exe"; 
      startInfo.Arguments = "/C " +command; 
      startInfo.UserName = "myuser"; 
      startInfo.UseShellExecute = false; 
      startInfo.RedirectStandardOutput = true; 
      startInfo.Domain = "mydomain"; 
      startInfo.CreateNoWindow = true; 

      String pass = "mypass"; 
      System.Security.SecureString secPass = new System.Security.SecureString(); 

      foreach (char c in pass.ToCharArray()) 
      { 
       secPass.AppendChar(c); 
      } 
      secPass.MakeReadOnly(); 

      startInfo.Password = secPass; 

      process.StartInfo = startInfo; 
      process.Start(); 
      //output = process.StandardOutput.ReadToEnd(); 
      process.WaitForExit(); 
      process.Close(); 

Tôi đã thử cả hai có và không đọc đầu ra tiêu chuẩn.

Ứng dụng sẽ treo trên process.WaitForExit(); cho đến khi tôi giết quá trình thông qua trình quản lý tác vụ.

+2

Nếu bạn thử đọc đầu ra tiêu chuẩn, bạn đã xem đầu ra chuẩn là gì chưa? Hãy thử đọc lỗi tiêu chuẩn là tốt; bạn có thể nhận được một số loại thông báo lỗi, có thể là một trong đó thậm chí nói "Đẩy bất kỳ chìa khóa để tiếp tục ..." hoặc một cái gì đó để có hiệu lực đó. – GWLlosa

+0

@GWLlosa, cả hai đầu ra tiêu chuẩn và lỗi chuẩn đều trống. Tôi nghĩ về điều đó "Đẩy bất kỳ chìa khóa ..." vì vậy tôi đã cố gắng viết một ký tự cho đầu vào tiêu chuẩn, nhưng vẫn không có gì. –

+2

Tại sao chạy nó thông qua cmd? Tại sao không chỉ chạy nó trực tiếp? –

Trả lời

2

Tôi nghĩ rằng chúng ta cần hiểu những lệnh bạn đang thực sự xử lý để xác định những gì đang diễn ra. Ngoài ra chúng ta cần phải biết những gì hệ điều hành máy chủ đang chạy.

Ví dụ, tôi đã thấy trong bình luận của bạn nơi bạn đã thử "echo test> C: \ test.txt" Trong Windows Server 2008 (và Windows 7) thư mục gốc yêu cầu quyền quản trị viên để tạo tệp. Nếu điều này được thực hiện dưới IIS, tôi đoán là người dùng IIS của bạn không phải là quản trị viên và bạn đang nhận được các ngoại lệ bảo mật.

Ngoài ra, một số lệnh có thể yêu cầu đặc quyền nâng cao do UAC. Tôi không nhớ chính xác, nhưng tôi đoán rằng nếu những lệnh đó đang bị bắt bởi UAC sau đó quá trình đang chờ xác nhận UAC ... Mà tôi tin bạn không thể cung cấp thông qua một dòng lệnh.

Loại sự cố này sẽ không được nhìn thấy nếu bạn đăng nhập vào máy và thực hiện trực tiếp ... trừ khi bạn đăng nhập bằng tài khoản người dùng quy trình công nhân. Vì vậy, điều đầu tiên bạn cần làm là tìm hiểu xem bạn đang cố gắng chạy cái gì và xem liệu người dùng mà quy trình công nhân đang thực thi có thể thực hiện những hành động đó hay không. An ninh là có để bảo vệ bạn, vì vậy hãy cẩn thận về việc cấp quyền bổ sung cho người dùng.

Lý do tại sao nó có thể hoạt động trên một máy so với máy khác một lần nữa phụ thuộc vào các máy tính của hệ điều hành đang chạy và cấu hình của người dùng các lệnh đang thực hiện theo.

Nếu điều này thực sự là vấn đề bảo mật, như tôi nghi ngờ, thì bạn nên đăng câu hỏi trên serverfault.com để hỏi bạn cần thực thi những lệnh nào khác nhau trong người dùng quy trình công nhân của bạn.

Bạn có thể xem nhật ký sự kiện máy để xem có bất kỳ cảnh báo hoặc lỗi nào được ném về lệnh hay không. Đôi khi những thứ như thế này có thể hiển thị ở đó để cung cấp cho bạn thêm một chút thông tin về những gì đã xảy ra.

+0

Chà. Tôi chỉ thấy câu hỏi này bao nhiêu tuổi ... oops. – NotMe

+0

Tôi không quan tâm, cảm ơn bạn đã nhập. Đã quên nó thực sự. Đó là vấn đề quyền. –

1

Sau khi được chuyển đến CMD, điều khiển đã được chuyển đến trình bao. Sẽ tốt hơn nếu bạn đóng nó như thế này:

private void closeSubProcess() 
    { 
     Process[] currentProcesses = Process.GetProcesses(); 
     foreach (Process p in currentProcesses) 
     { 
      string s = p.ProcessName; 
      s = s.ToLower(); 
      if (s.CompareTo("YOURPROGRAMNAMEHERE") == 0) 
      { 
       p.CloseMainWindow(); 
       p.Close(); 
      } 
     } 
    } 
+1

Điều đó có khả năng dẫn đến kết thúc quá trình trước khi nó đã thực hiện bất cứ điều gì nó có nghĩa vụ phải làm. – andynormancx

+0

Đúng, bạn sẽ cần tạo một tệp hoặc cập nhật một cái gì đó để báo cho phần .NET được thực hiện và sau đó kích hoạt nó. – jschorr

0

Tôi đang gọi cmd.exe để bắt đầu mô-đun nút trong Windows. npm rõ ràng phải được cài đặt trước, cùng với mô-đun nút tôi cần, và sau đó tôi có thể gọi mô-đun với args trong C#. Vấn đề là, cmd.exe sẽ không tắt, tôi phải sử dụng Task Mgr (giống như câu hỏi này!).

 //This requires npm, and the module installed by npm... 
     ProcessStartInfo psi = new ProcessStartInfo(); 
     psi.FileName = "cmd.exe"; 
     psi.WindowStyle = ProcessWindowStyle.Hidden; 
     psi.UseShellExecute = true; //closes command window 
     psi.Arguments = "/c <nodemodulename>" + file1 + ".txt " + file2 + ".log"; 
     Process p = Process.Start(psi); 
     p.Close(); 

Đối số /c là chìa khóa để đóng cmd.exe. Khi tôi bắt đầu, tôi đã đặt trong đối số /K, điều này giữ cho điều xấu hổ chạy. Giải quyết. Hi vọng điêu nay co ich.(Điều này giống như cổ xưa, nhưng chúng tôi luôn quên)

+0

(Tôi nhận ra câu hỏi ban đầu có đối số/c, nhưng tôi nghĩ nó sẽ là tốt để cung cấp này anyway (/ K vs/c) .Tôi chúc bạn tốt. –

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