Запуск / остановка служб Windows с помощью C # ServiceController и олицетворения - PullRequest
1 голос
/ 04 апреля 2019

Я разрабатываю удаленную библиотеку ключевых слов для фреймворка роботов.Эта библиотека работает в c # .net.

Удаленная библиотека построена с использованием NRobot-Server .Это относится к серверу xml-rpc и другим вещам, поэтому я могу писать только ключевые слова для фреймворка робота.К вашему сведению, этот сервер xml-rpc многопоточный.

На основании этого ответа и этой демонстрации Мне удалось что-то собрать,Однако я всегда получаю Cannot open <<my service>> service on computer '192.168.0.105'

Cannot open <<my service>> service on computer '192.168.0.105'.
at System.ServiceProcess.ServiceController.GetServiceHandle(Int32 desiredAccess)
   at System.ServiceProcess.ServiceController.Stop()
   at RKL.KeywordLibrary.KeywordLibraryImpl.ControlService(String host, String username, String password, String name, String action, String domain) in C:\Dev\QueueServiceSystemTestRKL\src\RKL\KeywordLibrary\KeywordLibraryImpl.cs:line 115
   at RKL.KeywordLibrary.RklKeywordClass.ControlService(String h
ost, String username, String password, String name, String action) in C:\Dev\RKL\src\RKL\KeywordLibrary\RKLKeywordClass.cs:line 21

Поскольку я должен иметь возможность удаленного управления службами, среда разработки выглядит следующим образом:

-------------------     --------------------                              
|      OS X       |     |      Win 10      |                              
|                 |     |                  |                             
| robot framework | --> |  remote keyword  |                                
|                 |     |   library (C#)   |                           
-------------------     --------------------                             
                                |
                                |
                                v 
                       --------------------- 
                       |  Win Server 2019  | 
                       |                   | 
                       |      service      | 
                       |                   | 
                       --------------------- 

Фактический код выглядит следующим образом (Я использую SimpleImpersonation nuget )

public void ControlService(string host, string username, string password, string name, string action)
{
    var credentials = new UserCredentials(username, password);
    Impersonation.RunAsUser(credentials, SimpleImpersonation.LogonType.Interactive, () =>
    {
        ServiceController sc = new ServiceController(name, host);
        TimeSpan timeout = new TimeSpan(0,0,30);
        switch (action)
        {
            case "start":
                sc.Start();
                sc.WaitForStatus(ServiceControllerStatus.Running, timeout);
                break;
            case "stop":
                sc.Stop();
                sc.WaitForStatus(ServiceControllerStatus.Stopped, timeout);
                break;
            default:
                string msg = String.Format("Unknown action: '{0}'", action);
                throw new Exception(msg);
        }
    });
}

Кроме того, я создал testuser на обеих машинах Windows, и оба пользователя являются администраторами.

В настоящее времяЯ пытаюсь отключить все окна безопасности, однако я мертв в воде.Просто пробую случайные вещи.

Кто-нибудь знает, где могут быть проблемы?Любая помощь будет оценена!

1 Ответ

1 голос
/ 04 апреля 2019

Итак, я узнал о классе ServiceControllerPermission и попробовал его. И это сработало

public void ControlService(string host, string username, string password, string name, string action)
{
    var credentials = new UserCredentials(username, password);
    Impersonation.RunAsUser(credentials, SimpleImpersonation.LogonType.Interactive, () =>
    {
        ServiceControllerPermission scp = new ServiceControllerPermission(ServiceControllerPermissionAccess.Control, host, name);
        scp.Assert();

        ServiceController sc = new ServiceController(name, host);
        TimeSpan timeout = new TimeSpan(0,0,30);
        switch (action)
        {
            case "start":
                sc.Start();
                sc.WaitForStatus(ServiceControllerStatus.Running, timeout);
                break;
            case "stop":
                sc.Stop();
                sc.WaitForStatus(ServiceControllerStatus.Stopped, timeout);
                break;
            default:
                string msg = String.Format("Unknown action: '{0}'", action);
                throw new Exception(msg);
        }
    });
}
...