Jakich uprawnień / uprawnień potrzebuje użytkownik, aby mieć dostęp do WMI na zdalnych komputerach?

33

Piszę usługę monitorowania, która używa WMI do uzyskiwania informacji ze zdalnych komputerów. Posiadanie lokalnych uprawnień administratora na wszystkich tych komputerach nie jest możliwe z powodów politycznych.

czy to możliwe? Jakich uprawnień / uprawnień wymaga do tego mój użytkownik?

jpoh
źródło

Odpowiedzi:

31

Poniższe działa w systemie Windows 2003 R2 SP 2, Windows Server 2012 R2

  1. Dodaj danych użytkowników do grupy użytkowników Monitora wydajności
  2. W obszarze Usługi i aplikacje przywołaj okno dialogowe właściwości WMI Control (lub uruchom wmimgmt.msc). Na karcie Zabezpieczenia podświetl Root/CIMV2, kliknij Zabezpieczenia; dodaj użytkowników Monitora wydajności i włącz opcje: Enable AccountiRemote Enable
  3. Uruchom dcomcnfg. W Component Services> Komputery> Mój komputer, na karcie bezpieczeństwa COM okna dialogowego Właściwości kliknij „Edytuj ograniczenia” dla obu Access Permissionsi Launch and Activation Permissions. Dodaj użytkowników Monitora wydajności i zezwól na zdalny dostęp, zdalne uruchamianie i zdalną aktywację.
  4. Wybierz Instrumentacja zarządzania Windows w obszarze Usługi składowe> Komputery> Mój komputer> Konfiguracja DCOM i nadaj Remote Launchi Remote Activationuprawnienia grupie użytkowników Monitora wydajności .

Uwagi:

  • Alternatywnie do kroku 3 i 4 można przypisać użytkownika do grupy Użytkownicy rozproszonych COM (testowane w systemie Windows Server 2012 R2)
  • Jeśli użytkownik potrzebuje dostępu do wszystkich przestrzeni nazw, możesz ustawić ustawienia w 2. na Rootpoziomie i ponownie przypisać uprawnienia do tych nazw poprzez Advancedokno wSecurity
jpoh
źródło
1
Odkryłem, że kroki 2 i 3 nie są konieczne, jeśli dodasz użytkownika do użytkowników rozproszonego COM.
Nexus
Pracując na WinXP i Win7, nie byłem w stanie dodać grupy „Użytkownicy rozproszonego COM” - może ta grupa jest dostępna tylko na serwerach? Nie rozwiązałoby się to podczas wyszukiwania nazwy podczas próby dodania do uprawnień. Odkryłem również, że musiałem ustawić uprawnienia do WMI na „Root” oraz „Root / CIMV2” i że musiałem przejść do uprawnień zaawansowanych i zastosować uprawnienia do przestrzeni podrzędnych, a także przestrzeni nazw.
Shannon Wagner,
Działa również w systemie Windows 8! Ponadto, czy ktoś wie, jak to zrobić z PowerShell lub innej powłoki?
Bunyk
1
W przypadku, gdy chcesz, aby użytkownik mógł uzyskać dostęp do całej przestrzeni nazw, możesz udzielić uprawnienia rootowi i wszystkim podobszarom nazw, wybierając opcję rootowania, otwierając zabezpieczenia, a następnie zaawansowane i konfigurując rekursję. Domyślnie te ustawienia dotyczą tylko wybranego obiektu i nie są kaskadowane.
Thomas
że nie działa dla nazw MSCluster
Jan
4

Wszystko, co zrobiłem w systemie Windows 8, to dodanie użytkownika do grupy „Użytkownicy zdalnego zarządzania” i zdalne żądania WQL działały.

Bunyk
źródło
1

Domyślnie tylko lokalna grupa Administratorzy ma zdalne uprawnienia do WMI. Będziesz musiał dostosować uprawnienia WMI „Remote Enable”.

ThatGraemeGuy
źródło
1

Może być także konieczne przyznanie „uprawnień do zdalnego dostępu DCOM” i / lub „uprawnień do zdalnego uruchamiania i aktywacji DCOM” w zależności od tego, co dokładnie próbujesz zrobić. W tym artykule MSDN opisano procedury krok po kroku.

KevinH
źródło
0

Poniższe działało dla mnie w środowisku domeny 2012 r2, chociaż udało mi się to zrobić tylko na serwer, a nie całą domenę:

1) Dodaj użytkownika do grupy użytkowników dziennika wydajności. 2) Uruchom wmimgmt.msc, kliknij prawym przyciskiem myszy „Kontrola WMI (LOKALNIE), przejdź do zakładki Zabezpieczenia i przyznaj odpowiedniemu użytkownikowi„ Włącz konto ”i„ Zdalne włączanie ”w wybranej przestrzeni nazw (zwykle CIMV2).

Jeśli uda mi się to zrobić dla całej domeny, wrócę i zaktualizuję.

JustAGuy
źródło
0

W oparciu o wybraną odpowiedź zmodyfikowałem skrypt od Microsoft, aby ustawić zabezpieczenia WMI. Mój użytkownik testowy był użytkownikiem domeny nieadministracyjnej, który był członkiem „Użytkowników zdalnego zarządzania” w systemie lokalnym z powodów niezwiązanych z tym problemem. Po udzieleniu mojemu użytkownikowi uprawnień EnableAccount, RemoteEnable i ExecuteMethods w docelowej przestrzeni nazw, miałem dostęp do WMI.

Nie dodałem więc mojego użytkownika do użytkowników Monitora wydajności lokalnych grup ani rozproszeni COM .

Kilka uwag dotyczących skryptu:

  1. Musisz podać pełną ścieżkę przestrzeni nazw. W moim przypadku przestrzeń nazw to Root / Microsoft / SqlServer
  2. Dziedziczenie było błędne. Ponieważ nie ma żadnych obiektów liścia, których nie można użyć$OBJECT_INHERIT_ACE_FLAG
  3. Pozbyłem się wbudowanej funkcji, ponieważ była ona zbyt mała i została użyta tylko raz.

Skrypt znajduje się poniżej. Nazwałem go 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)" }
Slogmeister Extraordinaire
źródło
-1

Zrobiliśmy to dla PRTG: Stworzyliśmy nowego użytkownika domeny: Utworzyliśmy GPO Dit, aby umieścić jego użytkownika w grupie „Użytkownicy dziennika wydajności” i użyliśmy skryptu PowerShell, aby dodać tego użytkownika do WMI Control. dzięki:

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

Martijn van Dijck
źródło
Podaj odpowiednie informacje bezpośrednio w swoich odpowiedziach. Odpowiedzi opublikowane powinny być samodzielne i po prostu korzystać z linków w celach informacyjnych.
Cory Knutson