Frage Welche Berechtigungen / Rechte benötigt ein Benutzer für WMI-Zugriff auf Remote-Computern?


Ich schreibe einen Überwachungsdienst, der WMI verwendet, um Informationen von Remote-Computern abzurufen. Lokale Administratorrechte auf all diesen Maschinen sind aus politischen Gründen nicht möglich.

Ist das möglich? Welche Berechtigungen / Rechte benötigt mein Benutzer dafür?


32
2018-06-19 07:17


Ursprung




Antworten:


Folgendes funktioniert auf Windows 2003 R2 SP 2, Windows Server 2012 R2

  1. Fügen Sie den oder die betreffenden Benutzer dem Benutzer hinzu Systemmonitor Benutzer Gruppe
  2. Öffnen Sie unter Dienste und Anwendungen den Eigenschaftendialog von WMI-Steuerelement (oder führen Sie es aus wmimgmt.msc). Markieren Sie auf der Registerkarte Sicherheit Root/CIMV2, klicken Sie auf Sicherheit; hinzufügen Systemmonitor Benutzer und aktivieren Sie die Optionen: Enable Account und Remote Enable
  3. Lauf dcomcnfg. Unter Komponentendienste> Computer> Arbeitsplatz klicken Sie auf der Registerkarte COM-Sicherheit des Dialogfelds Eigenschaften auf "Limits bearbeiten" für beide Access Permissions und Launch and Activation Permissions. Fügen Sie Systemmonitorbenutzer hinzu und ermöglichen Sie Remotezugriff, Remotestart und Remoteaktivierung.
  4. Wählen Sie Windows-Verwaltungsinstrumentation unter Komponentendienste> Computer> Arbeitsplatz> DCOM-Konfiguration und geben Sie Folgendes aus Remote Launch und Remote Activation Privilegien zu Systemmonitor Benutzer Gruppe.

Anmerkungen:

  • Alternativ zu Schritt 3 und 4 kann man den Benutzer der Gruppe zuordnen Verteilte COM-Benutzer (Getestet auf Windows Server 2012 R2)
  • Wenn der Benutzer Zugriff auf alle Namespaces benötigt, können Sie die Einstellungen in 2. bei Root level und recurse die Berechtigungen für die Sub-Namespaces über die Advanced Fenster herein Security

31
2017-07-24 07:42



Ich habe festgestellt, Schritte 2 und 3 sind nicht erforderlich, wenn Sie den Benutzer zu Distributed COM-Benutzer hinzufügen. - Nexus
Unter WinXP und Win7 konnte ich die Gruppe "Distributed COM Users" nicht hinzufügen - vielleicht ist diese Gruppe nur auf Servern erreichbar? Es würde nicht während der Namenssuche aufgelöst, wenn versucht wird, den Berechtigungen hinzuzufügen. Außerdem stellte ich fest, dass ich Berechtigungen für WMI auf "Root" sowie "Root / CIMV2" festlegen musste und dass ich in erweiterte Berechtigungen gehen musste und die Berechtigung für die Subnamespaces sowie den Namespace anwenden musste. - Shannon Wagner
Funktioniert auch für Windows 8! Kann jemand das auch mit Powershell oder einer anderen Shell machen? - Bunyk
Wenn Sie möchten, dass ein Benutzer auf den gesamten Namespace zugreifen kann, können Sie die Berechtigung erteilen Wurzel und alle Sub-Namespaces durch Auswahl von Root, öffnend Sicherheit dann Fortgeschritten und Einrichten der Rekursion. Standardmäßig gelten diese Einstellungen nur für das ausgewählte Objekt und unterlassen Sie Kaskade. - Thomas
das funktioniert nicht für den MSCluster-Namespace - John


Alles, was ich unter Windows 8 getan habe, wurde Benutzer zur Gruppe "Remote Management Users" hinzugefügt, und Remote-WQL-Anfragen funktionierten.


4
2018-03-31 13:33





Standardmäßig verfügt nur die lokale Gruppe Administratoren über Remoteberechtigungen für WMI. Sie müssen die WMI-Berechtigungen "Remote Enable" anpassen.


1
2018-06-19 07:41





Möglicherweise müssen Sie auch "DCOM-Remotezugriffsberechtigungen" und / oder "DCOM-Remotestart- und -aktivierungsberechtigungen" erteilen, je nachdem, was genau Sie versuchen. Dieser MSDN-Artikel gibt die Schritt-für-Schritt-Verfahren.


1
2018-06-19 11:23





Folgendes funktionierte für mich in einer 2012 R2-Domänenumgebung, obwohl ich es nur pro Server und nicht die gesamte Domäne geschafft habe:

1) Fügen Sie einen Benutzer zur Performance Log Benutzergruppe hinzu. 2) Führen Sie wmimgmt.msc aus, klicken Sie mit der rechten Maustaste auf "WMI Control (LOCAL), gehen Sie zur Registerkarte Sicherheit und erteilen Sie dem entsprechenden Benutzer" Enable Account "und" Remote Enable "für den gewünschten Namespace (normalerweise CIMV2).

Wenn ich es für die gesamte Domain schaffen kann, komme ich zurück und aktualisiere es.


0
2018-05-04 09:54





Basierend auf der gewählten Antwort änderte ich das Skript von Microsoft, um die WMI-Sicherheit festzulegen. Mein Testbenutzer war ein Benutzer ohne administrative Domäne, der aus Gründen ein Mitglied der "Remote Management Users" auf dem lokalen System war nicht verwandten zu diesem Problem. Nachdem ich meinem Benutzer die Berechtigungen EnableAccount, RemoteEnable und ExecuteMethods für den Zielnamespace gewährt hatte, konnte ich auf WMI zugreifen.

So tat ich nicht füge meinen Benutzer dem hinzu Systemmonitor Benutzer oder Verteilte COM-Benutzer lokale Gruppen.

Ein paar Anmerkungen zum Skript:

  1. Sie müssen den vollständigen Pfad des Namespace angeben. In meinem Fall war der Namespace Root / Microsoft / SqlServer
  2. Die Vererbung war falsch. Weil es keine Blattobjekte gibt, die Sie nicht verwenden können $OBJECT_INHERIT_ACE_FLAG
  3. Ich habe die eingebettete Funktion losgeworden, weil sie zu klein war und nur einmal verwendet wurde.

Das Skript ist unten. Ich nannte es 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)" }

0
2017-08-14 18:57





Wir haben das für PRTG getan: Wir haben einen neuen Domänenbenutzer erstellt: Erstellte ein Gruppenrichtlinienobjekt, um seinen Benutzer in die Gruppe "Performnce Log Users" zu stellen und verwendete ein Powershell-Skript, um diesen Benutzer zu WMI Control hinzuzufügen. Dank an:

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


-1
2018-05-19 12:32



Bitte geben Sie relevante Informationen direkt in Ihre Antworten ein. Die geposteten Antworten sollten in der Lage sein, alleine zu stehen und nur Links als Referenz zu verwenden. - Cory Knutson