Які дозволи / права потрібно користувачеві мати доступ до WMI на віддалених машинах?


33

Я пишу службу моніторингу, яка використовує WMI для отримання інформації з віддалених машин. Мати права місцевого адміністратора на всіх цих машинах з політичних причин неможливо.

Чи можливо це? Які дозволи / права вимагає мій користувач для цього?

Відповіді:


31

Наступні роботи над Window 2003 R2 SP 2, Windows Server 2012 R2

  1. Додайте запитаних користувачів до групи користувачів Monitor Monitor
  2. У розділі Служби та програми відкрийте діалогове вікно властивостей керування (або запуску wmimgmt.msc) WMI . На вкладці Безпека виділіть Root/CIMV2, натисніть Захист; додайте користувачів Monitor Monitor і включіть параметри: Enable AccountіRemote Enable
  3. Біжи dcomcnfg. У розділі Послуги компонентів> Комп'ютери> Мій комп'ютер, на вкладці безпеки COM діалогового вікна Властивості натисніть «Змінити ліміти» для обох Access Permissionsі Launch and Activation Permissions. Додайте користувачів Monitor Monitor і дозволяйте віддалений доступ, віддалений запуск та віддалену активацію.
  4. Виберіть «Інструментарій управління Windows» у розділі Послуги компонентів> Комп'ютери> Мій комп’ютер> Налаштування DCOM та надання Remote Launchта Remote Activationпривілеї Групі користувачів монітора продуктивності .

Примітки:

  • В якості альтернативи крокам 3 та 4 можна призначити користувача групі розповсюджених користувачів COM (Тестовано на Windows Server 2012 R2)
  • Якщо користувачеві потрібен доступ до всіх просторів імен, ви можете встановити його налаштування на Rootрівні 2. та повторно дозволити до просторів під імен через Advancedвікно вSecurity

1
Я виявив, що кроки 2 і 3 не потрібні, якщо ви додаєте користувача до розповсюджених користувачів COM.
Nexus

Працюючи над WinXP та Win7, я не зміг додати групу "Розподілені користувачі COM" - можливо, ця група доступна лише на серверах? Він не вирішиться під час пошуку імен при спробі додати до прав доступу. Крім того, я виявив, що мені потрібно встановити дозволи для WMI на "Root", а також "Root / CIMV2", і мені довелося перейти до розширених дозволів і застосувати дозвіл на простори імен, а також на простір імен.
Шеннон Вагнер

Працює також для Windows 8! Крім того, хтось знає, як зробити те ж саме з powerhell чи іншою оболонкою?
Буник

1
У випадку, якщо ви хочете, щоб користувач мав доступ до всього простору імен, ви можете надати дозвіл на Root та всі простори імен, вибравши Root, відкривши Security, потім Advanced та налаштувавши рекурсію. За замовчуванням ці налаштування застосовуються лише до обраного об'єкта і не каскадуються.
Томас

це не працює для простору імен MSCluster
Іван,

4

Все, що я робив у Windows 8, було додано користувачем до групи "Користувачі віддаленого управління", і працювали віддалені WQL-запити.


1

За замовчуванням лише локальна група адміністраторів має віддалені дозволи на WMI. Вам доведеться налаштувати дозволи WMI "Remote Enable".


1

Можливо, вам також доведеться надати "дозволи на віддалений доступ DCOM" та / або "дозволи на віддалений запуск та активацію DCOM" залежно від того, що саме ви намагаєтеся зробити. Ця стаття MSDN містить покрокові процедури.


0

Наступне працювало для мене в середовищі домену 2012 р2, хоча мені вдалося це зробити лише на сервері, а не на весь домен:

1) Додайте користувача до групи користувачів журналу ефективності. 2) Запустіть wmimgmt.msc, клацніть правою кнопкою миші «Керування WMI (LOCAL), перейдіть на вкладку Безпека та надайте відповідному користувачеві« Увімкнути акаунт »та« Віддалене включення »у потрібному просторі імен (звичайно CIMV2).

Якщо мені вдасться це зробити для всього домену, я повернусь та оновлю.


0

На основі обраної відповіді я змінив сценарій від Microsoft, щоб встановити захист WMI. Мій тестовий користувач був користувачем без домену, який не входив до складу адміністратора домену, який був членом локальної системи "Користувачі віддаленого управління" з причин, не пов'язаних із цією проблемою. Після надання моєму користувачу дозволів EnableAccount, RemoteEnable та ExecuteMethods на цільовому просторі імен я отримав доступ до WMI.

Отже, я не додав свого користувача до локальних груп Performance Monitor або розповсюджених користувачів COM .

Кілька приміток щодо сценарію:

  1. Ви повинні вказати повний шлях простору імен. У моєму випадку простір імен був Root / Microsoft / SqlServer
  2. Спадкування було неправильним. Тому що немає об'єктів з листя, якими ви не можете користуватися$OBJECT_INHERIT_ACE_FLAG
  3. Я позбувся вбудованої функції, тому що вона була занадто маленькою і її використовували лише один раз.

Сценарій нижче. Я назвав його 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)" }

-1

Ми зробили це для PRTG: Ми створили нового користувача домену: створили GPO Dit, щоб перевести його користувача в групу "Користувачі журналу виконання" та застосували сценарій powerhell, щоб додати цього користувача до WMI Control. завдяки:

https://live.paloaltonetworks.com/t5/Management-Articles/PowerShell-Script-for-setting-WMI-Permissions-for-User-ID/ta-p/53646


Будь ласка, включіть відповідну інформацію безпосередньо у відповіді. Опубліковані відповіді повинні мати можливість самостійно використовувати лише посилання для довідки.
Cory Knutson
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.