2016-05-09 5 views
3

Я разрабатываю службу Windows запросов WMI для запросов к сетевым серверам. Если я запустил приложение в консоли, он работает так, как ожидалось, но служба не выполнит запрос WMI. Есть ли способ настроить службу, чтобы RPC не сбой из-за недостаточных привилегий? Я использую учетные данные в запросе WMI для подключения к удаленному компьютеру, поэтому это не должно быть проблемой.C# - Служба Windows - Удаленный запрос WMI вызывает ошибку: RPC не найден

Благодаря

+0

В какой учетной записи работает служба? – BugFinder

+0

Возможный дубликат [«Сервер RPC недоступен» с использованием запроса WMI] (http://stackoverflow.com/questions/5224596/the-rpc-server-is-unavailable-using-wmi-query) –

ответ

1

Возможная причина:

  • Firewall конфигурации (соединения RPC закупорка)

  • Вы не имеете достаточно прав для выполнения запросов WMI.

Второй пункт действителен, если вы пытаетесь запустить запросы на удаленных компьютерах. Вы можете использовать wbemtest для проверки.

  1. Windows + R (команда запуска)

  2. Тип WBEMTEST

Вы должны подключить ManagementScope и проверить это действия scope.IsConnected. Это всего лишь фрагмент кода, вам, возможно, придется предоставить ему структуру.

ConnectionOptions cOption = new ConnectionOptions(); 
    ManagementScope scope = new ManagementScope("\\\\" + machine + "\\" + nameSpaceRoot + "\\" + managementScope, cOption); 
      scope.Options.Username = UserName; 
      scope.Options.Password = passWord; 
      scope.Options.EnablePrivileges = true; 
      scope.Options.Authentication = AuthenticationLevel.PacketPrivacy; 
      //scope.Options.Timeout = TimeSpan.FromSeconds(180); 
      //cOption.Timeout = TimeSpan.FromSeconds(180); 
      scope.Options.Impersonation = ImpersonationLevel.Impersonate; 
      scope.Connect(); 
      return scope; 



    if (scope.IsConnected && scope != null) 
    { 
    query = new ObjectQuery(@"Select * from Win32_SCSIController"); 
          searcher = new ManagementObjectSearcher(scope, query); searcher.Options.Timeout = new TimeSpan(0, 0, wbemConnectFlagUseMaxWait); 
          ManagementObjectCollection qWin32_SCSIController = searcher.Get(); 
    foreach (ManagementObject item in qWin32_SCSIController) 
    {  
    <Some code here> 
    } 

 Смежные вопросы

  • Нет связанных вопросов^_^