2010-02-26 32 views
13

Làm cách nào tôi có thể bắt đầu quá trình trên máy tính từ xa trong C#, nói tên máy tính = "someComputer", sử dụng lớp System.Diagnostics.Process?Làm cách nào để thực thi quy trình trên máy từ xa, trong C#

Tôi đã tạo một ứng dụng bảng điều khiển nhỏ trên máy tính từ xa vừa viết "Hello world" thành tệp txt và tôi muốn gọi nó từ xa.

Bảng điều khiển ứng dụng đường dẫn: c: \ MyAppFolder \ MyApp.exe

Hiện nay tôi có điều này:

ProcessStartInfo startInfo = new ProcessStartInfo(string.Format(@"\\{0}\{1}", someComputer, somePath); 

      startInfo.UserName = "MyUserName"; 
      SecureString sec = new SecureString(); 
      string pwd = "MyPassword"; 
      foreach (char item in pwd) 
      { 
       sec.AppendChar(item); 
      } 
      sec.MakeReadOnly(); 
      startInfo.Password = sec; 
      startInfo.UseShellExecute = false; 

      Process.Start(startInfo); 

tôi tiếp tục nhận được "đường dẫn mạng không tìm thấy".

Trả lời

17

thể có thể sử dụng PsExec từ http://technet.microsoft.com/en-us/sysinternals/bb897553.aspx

Hoặc WMI:

object theProcessToRun() = { "YourFileHere" }; 

ManagementClass theClass = new ManagementClass(@"\\server\root\cimv2:Win32_Process"); 

theClass.InvokeMethod("Create", theProcessToRun); 
+1

Tôi đã đăng câu trả lời CW trích dẫn MSDN trên lớp Quy trình mà bạn nên kết hợp vào câu trả lời của mình để trả lời câu hỏi về cách sử dụng Quy trình. –

+0

tks cho câu trả lời của bạn? Nhân tiện, bạn có biết liệu SysInternals có hỗ trợ chính thức đầy đủ của microsoft không? – DJPB

+4

Btw, "YourFileHere" cần phải là đường dẫn cục bộ cho máy chủ và bạn có thể thêm thông số vào máy chủ, ví dụ: "C: \\ Dù sao \\ Whatever.exe -param1 -param2" và "máy chủ" trong chuỗi đó cần phải là tên máy chủ thực tế hoặc ip, ví dụ: "\\ localhost \ root \ cimv2: Win32_Process" –

-4

Tôi không tin rằng bạn có thể bắt đầu một quá trình thông qua một đường dẫn UNC trực tiếp; có nghĩa là, nếu System.Process sử dụng các cửa sổ comspec để khởi động ứng dụng ... làm thế nào về bạn kiểm tra lý thuyết này bằng cách ánh xạ một ổ đĩa đến "\ someComputer \ somePath", sau đó thay đổi việc tạo của bạn của ProcessStartInfo đến đó? Nếu nó hoạt động theo cách đó, thì bạn có thể cân nhắc việc ánh xạ tạm thời một ổ đĩa theo lập trình, khởi động ứng dụng của bạn, sau đó loại bỏ ánh xạ (giống như pushd/popd hoạt động từ cửa sổ lệnh).

+2

Tôi nghĩ rằng sẽ chỉ dẫn đến máy địa phương đọc tệp thực thi từ xa và chạy nó cục bộ. –

6

Theo MSDN, đối tượng Process chỉ cho phép truy cập đối với các quá trình từ xa không có khả năng bắt đầu hoặc dừng quá trình từ xa. Vì vậy, để trả lời câu hỏi của bạn liên quan đến việc sử dụng lớp này, bạn không thể.

14

Sử dụng một trong các cách sau:

Hoặc nếu bạn cảm thấy thích, hãy tiêm dịch vụ của riêng bạn hoặc thành phần COM. Điều đó sẽ rất gần với những gì PsExec làm.

Trong tất cả các phương pháp này, tôi thích công cụ lập lịch tác vụ. API sạch nhất của tất cả, tôi nghĩ. Kết nối với bộ lập lịch nhiệm vụ từ xa, tạo một nhiệm vụ mới cho tệp thực thi, chạy nó. Lưu ý: tên thực thi phải là cục bộ cho rằng máy. Không \ servername \ path \ file.exe, nhưng c: \ path \ file.exe. Xóa tác vụ nếu bạn cảm thấy thích.

Tất cả các phương pháp đó yêu cầu bạn có quyền truy cập quản trị vào máy mục tiêu.

ProcessStartInfo không thể khởi chạy quá trình từ xa.

+1

Làm Công cụ lập lịch biểu cho tùy chọn. Xem câu trả lời này để minh họa: http://stackoverflow.com/questions/6178437/start-remote-process-within-the-context/8818377#8818377 – Ben

+0

Một tùy chọn khác có thể hữu ích nếu máy đích là máy chủ SQL, là xp_CMDShell –

1

Ví dụ về WMI và các thông tin đăng nhập khác như quy trình hiện tại, theo mặc định, nó sử dụng cùng một người dùng khi quy trình chạy.

var hostname = "server"; //hostname or a IpAddress 

var connection = new ConnectionOptions(); 
//The '.\' is for a local user on the remote machine 
//Or 'mydomain\user' for a domain user 
connection.Username = @".\Administrator"; 
connection.Password = "passwordOfAdministrator"; 

object[] theProcessToRun = { "YourFileHere" }; //for example notepad.exe 

var wmiScope = new ManagementScope([email protected]"\\{hostName}\root\cimv2", connection); 
wmiScope.Connect(); 
using (var managementClass = new ManagementClass(wmiScope, new ManagementPath("Win32_Process"), new ObjectGetOptions())) 
{ 
    managementClass.InvokeMethod("Create", theProcessToRun); 
} 
Các vấn đề liên quan