Отказано в доступе по запросу wmi к root\MicrosoftIISV2 с правами администратора

Я делаю запрос wmi, чтобы проверить, работает ли пул IIS. Через powershell запрос работает

Get-WmiObject `
    -Credential (Get-Credential) `
    -ComputerName MyMachine `
    -Namespace root\MicrosoftIISV2 `
    -Query "select * from IISApplicationPoolSetting where Name='W3SVC/APPPOLLS/MyPool'"

Через С# я получаю ManagementException с ErrorCode AccessDenied

var ms = new ManagementScope($@"\\{myMachine}\root\MicrosoftIISV2", new ConnectionOptions
{
    Username = $".\\Administrator",
    SecurePassword = Secure("adminPwd")
});
var query = "SELECT * FROM IISApplicationPoolSetting where name='W3SVC/APPPOLLS/MyPool'";
using (var searcher = new ManagementObjectSearcher(ms, new SelectQuery(query)))
{
    var objects = searcher.Get(); // throws here
}

В обоих случаях пользователем является учетная запись администратора машины. Я надеюсь, что это не понадобится, установив правильные разрешения.

Я также проверяю состояние служб Windows, выполняя запрос к пространству имен root\cimv2 и классу Win32_Service, и он отлично работает в обоих подходах.

Прежде чем я смог заставить работать какой-либо подход, мне пришлось отключить удаленный UAC.

Set-ItemProperty `
    -Path HKLM:\Software\Microsoft\Windows\CurrentVersion\Policies\System `
    -Name LocalAccountTokenFilterPolicy -Value 1 -Type DWORD

Мои вопросы связаны с разрешениями/привилегиями:

  1. Почему я получаю исключение AccessDenied Exception с пользователем-администратором? Как я могу отладить это?
  2. Отключение удаленного UAC строго необходимо?
  3. Является ли использование учетной записи администратора или пользователя в группе администраторов неизбежным?

person pitermarx    schedule 03.08.2017    source источник
comment
Вам нужно сделать: ms.Connect(); прежде чем передать его в ManagementObjectSearcher - так что в идеале прямо перед вашей строкой запроса var. Вы сказали ему, какие учетные данные использовать, но забыли попытаться подключиться от имени этого пользователя. Отключение UAC не обязательно — и вам следует избегать этого, если это возможно. Наконец, это зависит от пользователя, под которым зарегистрирована вызывающая машина. Если приложение вошло в систему как домен/администратор (не локальный администратор), тогда администратор сможет вызывать удаленный компьютер, и передача учетных данных не требуется.   -  person Scott    schedule 03.08.2017
comment
Конечно, любой другой пользователь с разрешением на доступ к обеим машинам также должен работать, но это будет связано с разрешением безопасности сети AD. msdn.microsoft.com/en -нас/библиотека/   -  person Scott    schedule 03.08.2017
comment
@Scott, 1. вызов ms.Connect() не влияет на исключение. Кроме того, он работает и без него в пространстве имен root\cimv2. 2. Это правда, что администратору машины не нужно отключать удаленный UAC, но он нужен другим локальным пользователям в группе администраторов 3. Я уже заметил, что это проблема с разрешением безопасности   -  person pitermarx    schedule 03.08.2017


Ответы (1)


Думаю, я получил часть этого.

new ConnectionOptions
{
    Username = ".\\localAdministrator",
    SecurePassword = Secure("localAdminPwd"),
    Authentication = AuthenticationLevel.PacketPrivacy
}

С опцией PacketPrivacy исключений больше нет, и я могу использовать локального администратора (просто пользователь в группе «Администраторы»).

Я не уверен, что делает эта опция и зачем она нужна, но она решила мою основную проблему. Если кто-то понимает это достаточно хорошо, чтобы объяснить, я все равно могу пометить ответ как принятый.

Я буду продолжать изучать разрешения, чтобы выяснить, какие именно разрешения необходимы.

person pitermarx    schedule 03.08.2017