Есть несколько шагов, которые вы должны предпринять, чтобы успешно использовать подключение WMI. Основы в том, что вы должны разрешить удаленное управление на целевом поле, конечно. Если вы не можете использовать RDP, скорее всего, вы не сможете удаленно управлять чем-либо еще. Это также может включать проблемы с брандмауэром Windows. Убедитесь, что ваш запрос может вообще войти.
Далее начните с простого. Можете ли вы даже опросить запущенные процессы на этой коробке? Попробуйте вывести все запущенные процессы в поле назначения с помощью System.Diagnostics.Process currentProcess = System.Diagnostics.Process.GetProcesses ("имя-машины"). Если вы можете хотя бы получить некоторую информацию о коробке, то полученное вами сообщение RPC связано с передачей неверных аргументов, возможно?
В любом случае, я недавно написал веб-приложение, которое позволяло пользователям находить сервер в локальной сети и завершать там целевой процесс или запускать новый. Я сделал это в C #, поэтому фрагмент кода ниже - именно то, что я использовал. Это не самое лучшее, но сейчас оно работает на производстве:
public static class RemoteProcessAccess
{
public static void KillProcessByProcessID(string NameOfServer, string DomainName, string LogIn, string Password, int processID)
{
//#1 The vars for this static method
#region /// <variables> ...
string userName;
string password;
string machineName;
string myDomain;
Hashtable hs = new Hashtable();
ManagementScope mScope;
ConnectionOptions cnOptions;
ManagementObjectSearcher objSearcher;
ManagementOperationObserver opsObserver;
ManagementClass manageClass;
DirectoryEntry entry;
DirectorySearcher searcher;
DirectorySearcher userSearcher;
#endregion
//#2 Set the basics sent into the method
machineName = NameOfServer;
myDomain = DomainName;
userName = LogIn;
password = Password;
cnOptions = new ConnectionOptions();
cnOptions.Impersonation = ImpersonationLevel.Impersonate;
cnOptions.EnablePrivileges = true;
cnOptions.Username = myDomain + "\\" + userName;
cnOptions.Password = password;
mScope = new ManagementScope(@"\\" + machineName + @"\ROOT\CIMV2", cnOptions);
//#3 Begin Connection to Remote Box
mScope.Connect();
objSearcher = new ManagementObjectSearcher(String.Format("Select * from Win32_Process Where ProcessID = {0}", processID));
opsObserver = new ManagementOperationObserver();
objSearcher.Scope = mScope;
string[] sep = { "\n", "\t" };
//#4 Loop through
foreach (ManagementObject obj in objSearcher.Get())
{
string caption = obj.GetText(TextFormat.Mof);
string[] split = caption.Split(sep, StringSplitOptions.RemoveEmptyEntries);
// Iterate through the splitter
for (int i = 0; i < split.Length; i++)
{
if (split[i].Split('=').Length > 1)
{
string[] procDetails = split[i].Split('=');
procDetails[1] = procDetails[1].Replace(@"""", "");
procDetails[1] = procDetails[1].Replace(';', ' ');
switch (procDetails[0].Trim().ToLower())
{
//You could look for any of the properties here and do something else,
case "processid":
int tmpProc = Convert.ToInt32(procDetails[1].ToString());
//if the process id equals the one passed in....
//(this is redundant since we should have limited the return
//by the query where above, but we're paranoid here
if (tmpProc.Equals(processID))
{
obj.InvokeMethod(opsObserver, "Terminate", null);
}
break;
}//end process ID switch...
}//end our if statement...
}//end our for loop...
}//end our for each loop...
}//end static method
}