Не удается открыть диспетчер управления службами на компьютере

1

Я пытаюсь написать программу, которая будет подключаться к удаленному серверу и отображать некоторый статус службы. Услуга также написана нами (моей компанией).

Для этого я написал консольное приложение, и код

static void Main(string[] args)
    {
        ConnectionOptions options = new ConnectionOptions();
        options.Password = "mypassword";
        options.Username = "Administrator";
        options.Impersonation =
            System.Management.ImpersonationLevel.Impersonate;

        ManagementScope scope =
            new ManagementScope(
            "\\\\ip_of_the_server\\root\\cimv2", options);
        scope.Connect();

        ServiceController svc = new ServiceController("My_Service_Name", "ip_of_the_server");

        var status = svc.Status.ToString();
        Console.WriteLine(svc.DisplayName + " : " status);

    }

Но я не могу заставить его работать. Ошибка, которую я получаю:

Cannot open Service Control Manager on computer 'ip_of_the_server'. This operation might require other privileges.

внутреннее исключение: "Доступ запрещен".

трассировки стека:

   at System.ServiceProcess.ServiceController.GetDataBaseHandleWithAccess(String     machineName, Int32 serviceControlManaqerAccess)
   at System.ServiceProcess.ServiceController.GetDataBaseHandleWithConnectAccess()
   at System.ServiceProcess.ServiceController.GenerateNames()
   at System.ServiceProcess.ServiceController.get_ServiceName()
   at System.ServiceProcess.ServiceController.GenerateStatus()
   at System.ServiceProcess.ServiceController.get_Status()
   at ServiceConsole.Program.Main(String[] args) in c:\Users\Kandroid\Documents\Visual Studio     2013\Projects\ServiceConsole\ServiceConsole\Program.cs:line 33
   at System.AppDomain._nExecuteAssembly(RuntimeAssembly assembly, String[] args)
   at System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity,   String[] args)
   at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
   at System.Threading.ThreadHelper.ThreadStart_Context(Object state)
   at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
   at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
   at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
   at System.Threading.ThreadHelper.ThreadStart()

Любая идея, как ее решить?

  • 0
    Использовать учетную запись с правильными разрешениями?
  • 0
    :) Да, конечно. Но я использую «Администратор». а также какое разрешение мне нужно?
Показать ещё 2 комментария
Теги:
service
windows-server-2012

1 ответ

2
Лучший ответ

Поскольку вы уже создали панель управления, просто используйте WQL для запроса поставщика WMI для правильного объекта WMI, в этом случае WIN32_Service, примерно так:

var svc = new ManagementObjectSearcher(
    scope,
    new ObjectQuery("Select Status,State from Win32_Service  where Name='My_Service_Name'"))
        .Get()
        .GetEnumerator();

    if (svc.MoveNext())
    {
          var status = svc.Current["Status"].ToString();
          var state = svc.Current["State"].ToString();
          Console.WriteLine("service status {0}", status);
          // if not running, StartService
          if (!String.Equals(state, "running",StringComparison.InvariantCultureIgnoreCase) {
               ( (ManagementObject) svc.Current ).InvokeMethod("StartService", new object[] {});
          }
    }
    else 
    {
           Console.WriteLine("service not found");
    }

ManagementObjectSearcher отвечает за получение коллекции управляемых объектов WMI. ObjectQuery будет возвращать экземпляры классов из области видимости. Мы можем выполнять базовые выражения для выбора sql для выбора и вывода результатов.

Итератор возвращает ManagementObjectBase, который имеет Item доступа Access, чтобы извлекать свойства из возвращаемого экземпляра.

  • 0
    Спасибо ... Ваш код работает. Но таким образом, как бы я начал и остановил службу?
  • 0
    Я добавил код для вызова операции StartService
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню