Я создаю службу сторожевого устройства, которая будет контролировать другие службы на различных удаленных серверах (все в одном домене).Пользователь, которого я использую для подключения к удаленным серверам, не является администратором.Когда я пытаюсь перечислить службы в классе 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, поэтому, пожалуйста, будьте как можно более подробно в своих ответах:)