Какие разрешения / права нужны пользователю для доступа к WMI на удаленных компьютерах?
Я пишу службу мониторинга, которая использует WMI для получения информации с удаленных машин. Наличие локальных прав администратора на всех этих машинах невозможно по политическим причинам.
Это возможно? Какие разрешения / права требуются моему пользователю для этого?
9 ответов
Следующее работает на Windows 2003 R2 SP 2, Windows Server 2012 R2
- Добавьте соответствующих пользователей в группу " Пользователи системного монитора ".
- В разделе "Службы и приложения" откройте диалоговое окно свойств элемента управления WMI (или запустите
wmimgmt.msc
). На вкладке Безопасность выделитеRoot/CIMV2
нажмите Безопасность; добавьте пользователей системного монитора и включите параметры:Enable Account
а такжеRemote Enable
- Бежать
dcomcnfg
, На Сервисы компонентов> Компьютеры> Мой компьютер, на вкладке "Безопасность COM" диалогового окна "Свойства" нажмите "Изменить пределы" для обоихAccess Permissions
а такжеLaunch and Activation Permissions
, Добавьте пользователей системного монитора и разрешите удаленный доступ, удаленный запуск и удаленную активацию. - Выберите Инструментарий управления Windows в разделе Службы компонентов> Компьютеры> Мой компьютер> Конфигурация DCOM и введите
Remote Launch
а такжеRemote Activation
привилегии для группы пользователей Performance Monitor.
Заметки:
- В качестве альтернативы шагам 3 и 4 можно назначить пользователя группе " Распределенные пользователи COM" (протестировано на Windows Server 2012 R2).
- Если пользователю нужен доступ ко всем пространствам имен, вы можете установить настройки в 2. на
Root
уровень и восстановить права доступа к подпространствам имен черезAdvanced
окно вSecurity
Все, что я делал в Windows 8, добавлял пользователя в группу "Пользователи удаленного управления", и удаленные WQL-запросы работали.
Мне здесь ничего не помогло. Я нашел видео YT в сочетании с произвольным комментарием , который решил проблему для меня (и, надеюсь, для вас тоже), но только при использованииinvoke-command
(бывший.invoke-command -ComputerName MyRemoteComputer -ScriptBlock {Get-Process -Name explorer}
).
На компьютере, к которому вы хотите получить удаленный доступ (в том же домене):
- [Нажмите правой кнопкой мыши Пуск] > >
lusrmgr.msc
(на контроллерах домена:dsa.msc
) - [Выберите
Groups
папка] (на контроллерах домена:Builtin
папка) - [Щелкните правой кнопкой мыши] >
Add to [a] group...
> - [Найдите пользователя/группу, которой вы хотите предоставить доступ к WMI] > (чтобы убедиться, что это правильная группа/пользователь) >
Почему добавление пользователя/группы в
Distributed COM Users
групповая помощь? Что ж, эта группа имеет права на удаленный запуск приложений и объектов в настройках. Вы можете просмотреть эти привилегии: [щелкните правой кнопкой мыши «Пуск»] > >
DCOMcnfg
>
Component Services
>
Computers
> [Щелкните правой кнопкой мыши
My Computer
] > >
COM Security
>
Edit Limits...
- В PowerShell с повышенными правами:
Set-PSSessionConfiguration -ShowSecurityDescriptorUI -Name Microsoft.PowerShell
-
Add...
> [Найдите пользователя/группу, которой вы хотите предоставить доступ к WMI] >Check Names
(чтобы подтвердить, что это правильная группа/пользователь) > - Под
Allow
столбец подPermissions for MyUser
, я выбрал толькоRead(Get,Enumerate,Subscribe)
иExecute(Invoke)
варианты (поскольку я предоставлял эти привилегии всемDomain Users
). -
Apply
>OK
- [Нажмите правой кнопкой мыши «Пуск »] >
Run
>services.msc
- [Щелкните правой кнопкой мыши] >
Restart
оба иWindows Remote Management (WS-Management)
.
- (Установите каждую из этих служб
Startup type
s дляAutomatic
--если еще не --в [щелкните правой кнопкой мыши] >Properties
.)
- (Если все еще не работает) Открыть
Windows Defender Firewall with Advanced Security
и [Щелкните правой кнопкой мыши] >Enable
каждыйWindows Management Instrumentation
Inbound Rule
.
Вам также может потребоваться предоставить "разрешения удаленного доступа DCOM" и / или "разрешения удаленного запуска и активации DCOM" в зависимости от того, что именно вы пытаетесь сделать. В этой статье MSDN приведены пошаговые инструкции.
По умолчанию только локальная группа "Администраторы" имеет удаленные разрешения для WMI. Вам нужно будет настроить разрешения WMI "Remote Enable".
Если вы пытаетесь получить доступ к WMI, доступны два протокола: DCOM и WinRM. Какой протокол вы используете, будет зависеть от используемых инструментов или API.Например, при использовании PowerShell «старый» командлет Get-WmiObject использует DCOM, тогда как «более новый» командлет Get-CimInstance использует WinRM.
Чтобы получить доступ к WMI без прав администратора с помощью DCOM, вам потребуются следующие группы/разрешения.
- Распределенные пользователи COM
- Разрешения «Удаленное включение» под контролем WMI для пространства имен, к которому вы хотите получить доступ (вы можете назначить их или с помощью / )
- Пользователи монитора производительности (для доступа к определенным показателям производительности через WMI, например, использование ЦП через значение Win32_Processor LoadPercentage)
Для доступа к WMI без прав администратора с помощью WinRM вам необходимы следующие группы/разрешения.
- Пользователи удаленного управления ИЛИ WinRMRemoteWMIUsers_ (несмотря на официальную документацию Microsoft, они, похоже, работают одинаково, а в более поздних версиях Windows доступен только первый)
- Разрешения «Удаленное включение» под контролем WMI для пространства имен, к которому вы хотите получить доступ (вы можете назначить их вручнуювручную или с помощью сценариясценария / групповой политикигрупповой политики )
- Пользователи монитора производительности (для доступа к определенным показателям производительности через WMI, например, использование ЦП через значение Win32_Processor LoadPercentage)
Кроме того, чтобы сделать что-либо из этого удаленно, убедитесь, что в брандмауэре Защитника Windows включены правила «Инструментарий управления Windows» для соответствующей области.
(Вы также можете использовать группу «Пользователи журнала производительности» для назначения разрешений метрик производительности DCOM и WMI вместо «Пользователи распределенного COM» и «Пользователи монитора производительности», но это предоставит дополнительные привилегии, которые могут быть неподходящими с точки зрения безопасности . Как предлагается в других ответах, вы также можете настроить разрешения на удаленный запуск и активацию DCOM вручную , но это кажется слишком сложным, поскольку и «Распределенным пользователям COM», и «Пользователям журнала производительности» эти разрешения уже назначены по умолчанию.)
Следующее сработало для меня в среде домена 2012 r2, хотя мне удалось сделать это только на сервер, а не на весь домен:
1) Добавить пользователя в группу пользователей журнала производительности. 2) Запустите wmimgmt.msc, щелкните правой кнопкой мыши "WMI Control (LOCAL)", перейдите на вкладку "Безопасность" и предоставьте соответствующему пользователю "Включить учетную запись" и "Удаленное включение" в требуемом пространстве имен (обычно CIMV2).
Если мне удастся сделать это для всего домена, я вернусь и обновлю.
Основываясь на выбранном ответе, я изменил скрипт от Microsoft, чтобы установить безопасность WMI. Мой тестовый пользователь был пользователем домена без прав администратора, который был членом группы "Пользователи удаленного управления" в локальной системе по причинам, не связанным с этой проблемой. После предоставления моему пользователю разрешений EnableAccount, RemoteEnable и ExecuteMethods в целевом пространстве имен я смог получить доступ к WMI.
Поэтому я не добавил своего пользователя в локальные группы " Пользователи системного монитора" или " Распределенные пользователи COM".
Пара замечаний по поводу сценария:
- Вы должны указать полный путь к пространству имен. В моем случае пространство имен было Root/Microsoft/SqlServer
- Наследование было неверным. Потому что нет листовых объектов, которые вы не можете использовать
$OBJECT_INHERIT_ACE_FLAG
- Я избавился от встроенной функции, потому что она была слишком маленькой и использовалась только один раз.
Сценарий ниже. Я назвал это Set-WMINamespaceSsecurity.ps1
Param ([Parameter(Mandatory=$true,Position=0)] [string]$Namespace,
[Parameter(Mandatory=$true,Position=1)] [ValidateSet("Add","Remove")] [string]$Operation,
[Parameter(Mandatory=$true,Position=2)] [string] $Account,
[Parameter(Mandatory=$false,Position=3)] [ValidateSet("EnableAccount","ExecuteMethods","FullWrite","PartialWrite","ProviderWrite","RemoteEnable","ReadSecurity","WriteSecurity")] [string[]] $Permissions=$null,
[Parameter(Mandatory=$false)] [switch]$AllowInherit,
[Parameter(Mandatory=$false)] [switch]$Deny,
[Parameter(Mandatory=$false)] [string]$ComputerName=".",
[Parameter(Mandatory=$false)] [System.Management.Automation.PSCredential]$Credential=$null)
$OBJECT_INHERIT_ACE_FLAG = 0x1
$CONTAINER_INHERIT_ACE_FLAG = 0x2
$ACCESS_ALLOWED_ACE_TYPE = 0x0
$ACCESS_DENIED_ACE_TYPE = 0x1
$WBEM_ENABLE = 0x01
$WBEM_METHOD_EXECUTE = 0x02
$WBEM_FULL_WRITE_REP = 0x04
$WBEM_PARTIAL_WRITE_REP = 0x08
$WBEM_WRITE_PROVIDER = 0x10
$WBEM_REMOTE_ACCESS = 0x20
$WBEM_RIGHT_SUBSCRIBE = 0x40
$WBEM_RIGHT_PUBLISH = 0x80
$READ_CONTROL = 0x20000
$WRITE_DAC = 0x40000
$WBEM_S_SUBJECT_TO_SDS = 0x43003
$ErrorActionPreference = "Stop"
$InvokeParams=@{Namespace=$Namespace;Path="__systemsecurity=@";ComputerName=$ComputerName}
if ($PSBoundParameters.ContainsKey("Credential")) { $InvokeParams+= @{Credential=$Credential}}
$output = Invoke-WmiMethod @InvokeParams -Name "GetSecurityDescriptor"
if ($output.ReturnValue -ne 0) { throw "GetSecurityDescriptor failed: $($output.ReturnValue)" }
$ACL = $output.Descriptor
if ($Account.Contains('\')) {
$Domain=$Account.Split('\')[0]
if (($Domain -eq ".") -or ($Domain -eq "BUILTIN")) { $Domain = $ComputerName }
$AccountName=$Account.Split('\')[1]
}
elseif ($Account.Contains('@')) {
$Somain=$Account.Split('@')[1].Split('.')[0]
$AccountName=$Account.Split('@')[0]
}
else {
$Domain = $ComputerName
$AccountName = $Account
}
$GetParams = @{Class="Win32_Account" ;Filter="Domain='$Domain' and Name='$AccountName'"}
$Win32Account = Get-WmiObject @GetParams
if ($Win32Account -eq $null) { throw "Account was not found: $Account" }
# Add Operation
if ($Operation -eq "Add") {
if ($Permissions -eq $null) { throw "Permissions must be specified for an add operation" }
# Construct AccessMask
$AccessMask=0
$WBEM_RIGHTS_FLAGS=$WBEM_ENABLE,$WBEM_METHOD_EXECUTE,$WBEM_FULL_WRITE_REP,$WBEM_PARTIAL_WRITE_REP,$WBEM_WRITE_PROVIDER,$WBEM_REMOTE_ACCESS,$READ_CONTROL,$WRITE_DAC
$WBEM_RIGHTS_STRINGS="EnableAccount","ExecuteMethods","FullWrite","PartialWrite","ProviderWrite","RemoteEnable","ReadSecurity","WriteSecurity"
$PermissionTable=@{}
for ($i=0; $i -lt $WBEM_RIGHTS_FLAGS.Count; $i++) { $PermissionTable.Add($WBEM_RIGHTS_STRINGS[$i].ToLower(), $WBEM_RIGHTS_FLAGS[$i]) }
foreach ($Permission in $Permissions) { $AccessMask+=$PermissionTable[$Permission.ToLower()] }
$ACE=(New-Object System.Management.ManagementClass("Win32_Ace")).CreateInstance()
$ACE.AccessMask=$AccessMask
# Do not use $OBJECT_INHERIT_ACE_FLAG. There are no leaf objects here.
if ($AllowInherit.IsPresent) { $ACE.AceFlags=$CONTAINER_INHERIT_ACE_FLAG }
else { $ACE.AceFlags=0 }
$Trustee=(New-Object System.Management.ManagementClass("Win32_Trustee")).CreateInstance()
$Trustee.SidString = $Win32Account.SID
$ACE.Trustee=$Trustee
if ($Deny.IsPresent) { $ACE.AceType = $ACCESS_DENIED_ACE_TYPE } else { $ACE.AceType = $ACCESS_ALLOWED_ACE_TYPE }
$ACL.DACL+=$ACE
}
#Remove Operation
else {
if ($Permissions -ne $null) { Write-Warning "Permissions are ignored for a remove operation" }
[System.Management.ManagementBaseObject[]]$newDACL = @()
foreach ($ACE in $ACL.DACL) {
if ($ACE.Trustee.SidString -ne $Win32Account.SID) { $newDACL+=$ACE }
}
$ACL.DACL = $newDACL
}
$SetParams=@{Name="SetSecurityDescriptor"; ArgumentList=$ACL}+$InvokeParams
$output = Invoke-WmiMethod @SetParams
if ($output.ReturnValue -ne 0) { throw "SetSecurityDescriptor failed: $($output.ReturnValue)" }
Мы сделали это для PRTG. Мы создали нового пользователя домена: создали Dit объекта групповой политики, чтобы поместить его в группу "Пользователи журнала Performnce", и использовали сценарий powershell, чтобы добавить этого пользователя в элемент управления WMI. благодаря: