Как удаленно управлять службой Windows с помощью ServiceController?
Я пытаюсь контролировать службы Windows, которые установлены на удаленном компьютере. Я использую ServiceController
учебный класс.
У меня есть это:
ServiceController svc = new ServiceController("MyWindowsService", "COMPUTER_NAME");
Благодаря этому я могу получить статус службы Windows следующим образом:
string status = svc.Status.ToString();
Но я не могу контролировать службу Windows (делая svc.Start();
или же svc.Stop();
). Я получаю следующее исключение:
Не удается открыть службу Servicexxx на компьютере "COMPUTER_NAME"
Это нормально, я полагаю, что-то связано с разрешениями на доступ. Но как? Я посмотрел в Google, но не нашел то, что искал. Однако я часто читаю что-то, связанное с подражанием, но я не знаю, что это значит.
NB. Локальный и удаленный компьютеры работают под управлением Win XP Pro.
4 ответа
Задача решена.
Олицетворение заключается в запуске фрагмента кода с использованием определенного логина / пароля. Я нашел этот очень полезный проект: http://www.codeproject.com/KB/cs/svcmgr.aspx?display=Print который мне очень помог!
Запуск и остановка служб - это привилегированная операция, обычно доступная только администраторам. Убедитесь, что используемая учетная запись пользователя имеет достаточные права на целевом компьютере. Задайте больше вопросов об этом на serverfault.com
Чтобы решить эту проблему, дайте своему имени права администратора на удаленном компьютере / сервере, такие как домен / имя пользователя, и вы сможете успешно запустить пакет, так как у меня была такая же проблема, и когда я давал разрешения для самообслуживания, которые были доступны на удаленном компьютере. сервер
у меня была такая же проблема, но сделано. попробуйте этот код ниже
protected void Button4_Click1(object sender, EventArgs e)
{
//1º connect to remote computer
ConnectionOptions connection = new ConnectionOptions();
connection.Username = "USER NAME OF REMOTE COMPUTER";
connection.Password = "PASS WORD OF REMOTE COMPUTER";
connection.Authority = "NTLMDOMAIN:DOMINE NAME OF YOUR LAN";
connection.EnablePrivileges = true;
connection.Authentication = AuthenticationLevel.Default;
connection.Impersonation = ImpersonationLevel.Impersonate;
ManagementScope scope = new ManagementScope(
"\\\\NAME OR IP OF REMOTE COMPUTER\\root\\CIMV2", connection);
scope.Connect();
// finsh connection
ManagementObjectSearcher moSearcher = new ManagementObjectSearcher();
moSearcher.Scope = scope;
moSearcher.Query = new ObjectQuery("SELECT * FROM win32_Service WHERE Name ='SERVICE NAME IN REMOTE COMPUTER'");
ManagementObjectCollection mbCollection = moSearcher.Get();
// ServiceController svc = new ServiceController("Jenkins", "10.224.62.35");
//namelbl.Text = svc.Status.ToString();
foreach (ManagementObject oReturn in mbCollection)
{
// invoke start
ManagementBaseObject outParams = oReturn.InvokeMethod("StartService", null, null);
//invoke stop
ManagementBaseObject outParams2 = oReturn.InvokeMethod("StopService", null, null);
//get result
string a = outParams["ReturnValue"].ToString();
// get service state
string state = oReturn.Properties["State"].Value.ToString().Trim();
MessageBox.Show(state);// TO DISPLAY STATOS FROM SERVICE IN REMOTE COMPUTER
}
}//THE CODE ABOVE IS WRITER IN C# I HOPE HELP SOME ONE. THANKS