2013-04-30 36 views
8

Tôi đang cố gắng thực thi PSExec từ ứng dụng Web Asp.Net của tôi để kết nối với máy chủ từ xa. Bằng cách nào đó, nó cung cấp cho "Access Denied Error -5" không có thông tin xác thực được đặt và bằng cách đặt thông tin xác thực trong lệnh PSEXEC, nó cung cấp "2250 Network connection could not be found". Tôi là quản trị viên trên máy chủ và tôi đã bật Windows authentication and Asp.Net Impersonation (IIS7.5). Thú vị hơn khi tôi cố gắng thực hiện điều này từ một console application hoặc thậm chí chỉ sử dụng command prompt nó chỉ hoạt động tốt. Tôi đang cố gắng làm một thao tác ping như một bài kiểm tra.Thực thi tập lệnh bằng cách sử dụng sysinternals PSExec từ ứng dụng Web Asp.Net

Dưới đây là đoạn mã của tôi: -

  var startInfo = new ProcessStartInfo{ 
       CreateNoWindow = true, 
       UseShellExecute = false, 
       FileName = FilePath, 
       Arguments = CommandArgs 
      } 

      Process vsCommandProcess = Process.Start(startInfo); 

      vsCommandProcess.WaitForExit(); 
      var exitCode = vsCommandProcess.ExitCode; 
      if (vsCommandProcess.ExitCode != 0) 
      { 
       ...rest of the code 

đây: -

FilePath --> C:\pstools\psexec.exe 
Arguments --> \\servername -accepteula -u domain\userName -p password ipconfig (1) 
       \\servername -accepteula ipconfig (2)   

(1) Gives Error 2250 (2) gives Error 5 

Lệnh cùng và mã làm việc với một ứng dụng console. SO tôi tin rằng nó chắc chắn là một cái gì đó để làm với các ứng dụng Asp.net mà không thể thực hiện qua các thông tin để từ xa đến máy. Tôi đã thử sự kiện startInfo.LoadUserProfile nhưng không có kết quả.

Đánh giá cao sự trợ giúp của bạn. Tôi đã cố gắng tìm kiếm các câu hỏi tương tự nhưng không thể tìm ra giải pháp cho vấn đề mà tôi đang gặp phải.

+0

1 Nếu nó hoạt động với bàn điều khiển chứ không phải với ứng dụng web asp, điều này nghe có vẻ giống như vấn đề bảo mật. 2 Bạn cũng đã kiểm tra xem phiên bản .net có đúng không? Hãy thử chạy hồ bơi ứng dụng của bạn trên IIS với .net 2.0 (Tôi đã có vấn đề này ngày hôm nay). – gartenabfall

+0

Tôi đang sử dụng phiên bản dotnet 4.0. vâng, có vẻ như mã thông báo xác thực không được chuyển tiếp .... – PSL

+0

IIS có chạy dưới cùng một đặc quyền người dùng như dấu nhắc lệnh của bạn không? – Powerslave

Trả lời

2

Cân nhắc việc lấy psexec trong quá trình. Đi WMI trực tiếp có thể đưa ra cái nhìn sâu sắc hơn vào những gì đang xảy ra sai:

var connOpts = new ConnectionOptions() 
{ 
// Optional, default is to use current identity 
    Username = "username", 
    Password = "password" 
}; 

// create a handle to the Win32_Process object on the remote computer 
ManagementScope mgmtScope = new ManagementScope(@"\\servername\root\cimv2", connOpts); 
ManagementClass w32Process = new ManagementClass(mgmtScope, 
    new ManagementPath("Win32_Process"), new ObjectGetOptions()); 

// create the process itself 
object[] createArgs = new object[] { 
    // [in] string CommandLine, 
    "notepad.exe", 
    // [in] string CurrentDirectory, 
    null, 
    // [in] Win32_ProcessStartup ProcessStartupInformation, 
    null, 
    // [out] uint32 ProcessId 
    0}; 

var result = (int)w32Process.InvokeMethod("Create", createArgs); 

switch (result) 
{ 
    case 0: /* no-op, successful start */ break; 
    case 2: throw new Exception("Access Denied"); 
    case 3: throw new Exception("Insufficient Privilege"); 
    case 8: throw new Exception("Unknown failure"); 
    case 9: throw new Exception("Path not found"); 
    case 21: throw new InvalidOperationException("Invalid Parameter"); 
} 

Nếu bạn vẫn gặp vấn đề với mạo danh, nó có thể hữu ích để đổ nội dung của HttpContext.Current.User.Identity để xác minh IIS được cấu hình đúng. Hơn nữa, nếu bạn đang sử dụng Kerberos (thông qua thương lượng/SPNEGO), bạn có thể cần phải allow the machine to delegate identity. Nếu bạn biết SPN mà máy sẽ kết nối, bạn có thể sử dụng ủy nhiệm bị hạn chế, nhưng trong nhiều trường hợp cần phải cho phép phái đoàn không bị giới hạn nếu các mục tiêu không được biết trước thời hạn.


Lưu ý: nếu bạn đang truy cập từ xa vào máy tính chỉ để chạy ipconfig, bạn có thể nhận được các thông tin tương tự thông qua WMI mà không cần phải gây rối với cố gắng để có được những STDOUT đầu ra trở lại vào máy tính gọi. Hãy xem lớp Win32_NetworkAdapterConfiguration.