Предоставление удаленному пользователю (не администратору) возможности перечислять службы в Win32_Service в пространстве имен cimv2 с использованием WMI & C # - PullRequest
4 голосов
/ 12 октября 2010

Я создаю службу сторожевого устройства, которая будет контролировать другие службы на различных удаленных серверах (все в одном домене).Пользователь, которого я использую для подключения к удаленным серверам, не является администратором.Когда я пытаюсь перечислить службы в классе Win32_Service, я получаю сообщение об ошибке отказа в доступе.

Я предоставил пользователю разрешения «Удаленное включение» и «Включить учетную запись» для пространства имен Root \ CIMV2 в элементе управления WMI.

Я могу подключиться к серверу с помощью следующего кода.Объект ServiceListItem - это простой класс, который содержит имя сервера и имя службы:

SecureString secureString = new SecureString();

foreach ( char c in "password" )
{
    secureString.AppendChar( c );
}

ConnectionOptions connectionOptions = new ConnectionOptions();

connectionOptions.Username = "domain\\user";
connectionOptions.SecurePassword = secureString;

foreach ( ServiceListItem service in _serviceList )
{
     ManagementScope managementScope = new ManagementScope();
     managementScope = new ManagementScope( String.Format( @"\\{0}\root\cimv2", service.ServerName ), connectionOptions );
     managementScope.Connect();

     //RelatedObjectQuery relatedObjectQuery = new RelatedObjectQuery( String.Format( "Win32_Service.Name='{0}'", service.ServiceName ) );
     //ManagementObjectSearcher objectSearcher = new ManagementObjectSearcher( managementScope, relatedObjectQuery );

     ObjectQuery objectQuery = new ObjectQuery( "SELECT * FROM Win32_Service WHERE Name = '" + service.ServiceName + "'" );
     ManagementObjectSearcher objectSearcher = new ManagementObjectSearcher( managementScope, objectQuery );

     ManagementObjectCollection objectCollection = objectSearcher.Get();

     foreach ( ManagementObject managementObject in objectCollection )
     {
          serviceStatus = managementObject.Properties["State"].Value.ToString();
          Debug.Print(service.ServiceName + " - " + serviceStatus);
          //break;
     }
}

. ManagementScope.Connect () работает нормально, что означает, что безопасность wmi на cimv2 установлена ​​правильно.Однако, когда я пытаюсь перечислить objectCollection, я получаю исключение «Отказано в доступе».Это говорит мне (я думаю), что у пользователя нет прав для перечисления класса Win32_Service (SC_MANAGER_ENUMERATE_SERVICE).

Я просто не смог найти хороших примеров того, как включить это разрешение дляудаленный пользователь.Я не очень опытен, когда дело доходит до написания кода с API Windows, поэтому, пожалуйста, будьте как можно более подробно в своих ответах:)

Ответы [ 2 ]

2 голосов
/ 31 марта 2013

Я застрял в аналогичной проблеме.В моем случае это не имело никакого отношения к разрешениям, которые я установил, перейдя по этой ссылке: http://www.poweradmin.com/help/enableWMI.aspx

Итак, после нескольких часов потерянных размышлений я обнаружил эту статью, в которой рассказывается, как UAC мешает вашемунабор разрешений и как это исправить: http://www.solarwinds.com/documentation/apm/docs/APMWMITroubleshooting.pdf

В моем случае раздел реестра не существовал, поэтому я его создал.

Tricky Registry Key

Надеюсь, это также помогает, ура!

1 голос
/ 13 декабря 2010

Пытаясь найти тот же ответ сам сегодня, я много гуглял. После полчаса заклинаний я нашел эту статью MSDN (907460) , в которой используется sc sdet. Кажется, он работает до сих пор, хотя дескриптор безопасности предназначен для Windows Server 2003. Я обнаружил, что вы можете сделать sc sdshow SCMANAGER, чтобы получить текущее значение, поэтому, когда завтра вернусь в офис, я буду сравнивать контраст, чтобы Я не заблокировал что-то, чего не должен был: -)

Для полноты, примечания в KB907460 (в случае, если он уходит / уходит):

Симптомы: После установки Microsoft Windows Server 2003 с пакетом обновления 1 (SP1) не администраторы не могут получить удаленный доступ к диспетчеру управления службами.

Причина: Windows Server 2003 с пакетом обновления 1 (SP1) изменяет параметры безопасности диспетчера служб по умолчанию.

Разрешение: Чтобы решить эту проблему, используйте версию 5.2.3790.1830 инструмента Sc.exe. Этот инструмент находится в папке% windir% \ System32. Сделать это, выполните следующие действия:

  • Нажмите Пуск, нажмите Выполнить, введите cmd и нажмите кнопку ОК.
  • Введите в командной строке следующую команду и нажмите клавишу ВВОД:

    sc sdset SCMANAGER D:(A;;CCLCRPRC;;;AU)(A;;CCLCRPWPRC;;;SY)(A;;KA;;;BA)S:(AU;FA;KA;;;WD)(AU;OIIOFA;GA;;;WD)
    
...