Я разрабатываю удаленную библиотеку ключевых слов для платформы роботов. Эта библиотека работает в С# .net.
Удаленная библиотека создается с использованием NRobot-Сервер. Это обработка сервера 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, и оба пользователя являются администраторами.
В настоящее время я пытаюсь отключить всю безопасность Windows, однако я мертв в воде. Просто пробую случайные вещи.
Кто-нибудь знает, где может быть проблема? Любая помощь будет оценена по достоинству!
@PavelAnikhouski RemoteKeywordLibrary работает как служба Windows в локальной системе. Это относится и к этому? Я собираюсь попробовать.
Ваше сообщение об ошибке Cannot open CPI.StateServerEDS service on computer '192.168.0.105' часто означает, что нет доступа администратора. Взгляните также на этот нить, он описывает, как добавить необходимые значения в app.manifest.
Нет, это не помогло.
@PavelAnikhouski Я понял. Посмотреть ответ





Итак, я узнал о Класс 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);
}
});
}
Вы добавили
<requestedExecutionLevel level = "requireAdministrator" uiAccess = "false" />в свойapp.manifestфайл?