Quelles sont les autorisations / droits nécessaires à un utilisateur pour disposer d'un accès WMI sur des ordinateurs distants?

33

J'écris un service de surveillance qui utilise WMI pour obtenir des informations à partir de machines distantes. Avoir des droits d'administrateur local sur toutes ces machines n'est pas possible pour des raisons politiques.

Est-ce possible? Quelles sont les autorisations / droits requis par mon utilisateur pour cela?

Jpoh
la source

Réponses:

31

Ce qui suit fonctionne sur Windows 2003 R2 SP 2, Windows Server 2012 R2

  1. Ajouter le ou les utilisateurs en question au groupe d' utilisateurs de l'Analyseur de performances
  2. Sous Services et applications, ouvrez la boîte de dialogue des propriétés du contrôle WMI (ou de l'exécution wmimgmt.msc). Dans l'onglet Sécurité, mettez en surbrillance Root/CIMV2, cliquez sur Sécurité; ajoutez des utilisateurs de l'analyseur de performances et activez les options: Enable AccountetRemote Enable
  3. Courez dcomcnfg. Dans Services de composants> Ordinateurs> Poste de travail, sous l'onglet Sécurité COM de la boîte de dialogue Propriétés, cliquez sur "Modifier les limites" pour Access Permissionset Launch and Activation Permissions. Ajoutez des utilisateurs de l'analyseur de performances et autorisez l'accès à distance, le lancement à distance et l'activation à distance.
  4. Sélectionnez Windows Management Instrumentation dans Component Services> Ordinateurs> Poste de travail> Config et donner DCOM Remote Launchet Remote Activationprivilèges aux utilisateurs Analyseur de performances du Groupe.

Remarques:

  • Alternativement aux étapes 3 et 4, vous pouvez affecter l'utilisateur au groupe Utilisateurs COM distribués (testé sur Windows Server 2012 R2).
  • Si l'utilisateur a besoin d'accéder à tous les espaces-noms, vous pouvez définir les paramètres dans 2. au Rootniveau et redéfinir les autorisations sur les sous-espaces-noms via la Advancedfenêtre deSecurity
Jpoh
la source
1
J'ai trouvé que les étapes 2 et 3 ne sont pas nécessaires si vous ajoutez l'utilisateur à Utilisateurs COM distribués.
Nexus
En travaillant sur WinXP et Win7, je n’ai pas pu ajouter le groupe "Utilisateurs COM distribués" - peut-être que ce groupe n’est accessible que sur des serveurs? Cela ne résoudrait pas le problème lors de la recherche de nom lors d'une tentative d'ajout aux autorisations. En outre, j'ai constaté que je devais définir des autorisations pour WMI sur "Racine" ainsi que sur "Racine / CIMV2" et que je devais accéder à des autorisations avancées et appliquer l'autorisation pour les sous-espaces de noms ainsi que pour l'espace de noms.
Shannon Wagner
Fonctionne également pour Windows 8! Aussi, est-ce que quelqu'un sait comment faire la même chose avec PowerShell ou un autre shell?
Bunyk
1
Dans le cas où vous souhaitez qu'un utilisateur puisse accéder à tout l'espace de noms, vous pouvez accorder l'autorisation à Racine et à tous les sous-espaces de noms en sélectionnant Racine, en ouvrant Sécurité puis Avancé et en configurant la récursivité. Par défaut, ces paramètres s'appliquent uniquement à l'objet sélectionné et ne sont pas mis en cascade.
Thomas
cela ne fonctionne pas pour l'espace de noms MSCluster
John
4

Tout ce que j'ai fait sous Windows 8 a été ajouté au groupe d'utilisateurs "Utilisateurs de la gestion à distance", et les requêtes WQL à distance ont fonctionné.

Bunyk
la source
1

Par défaut, seul le groupe Administrateurs local dispose d'autorisations distantes sur WMI. Vous devrez personnaliser les autorisations "Activer à distance" WMI.

ThatGraemeGuy
la source
1

Vous devrez peut-être également accorder des «autorisations d'accès à distance DCOM» et / ou «des autorisations de lancement et d'activation à distance DCOM», en fonction de ce que vous essayez d'exécuter. Cet article MSDN décrit les procédures pas à pas.

KevinH
la source
0

Ce qui suit a fonctionné pour moi dans un environnement de domaine r2 en 2012, même si je n'ai réussi à le faire que par serveur et non par l'ensemble du domaine:

1) Ajouter un utilisateur au groupe d'utilisateurs du journal de performances. 2) Exécutez wmimgmt.msc, cliquez avec le bouton droit de la souris sur "Contrôle WMI (LOCAL)", accédez à l'onglet Sécurité et accordez à l'utilisateur approprié "Activer le compte" et "Activer à distance" sur l'espace de nom souhaité (généralement CIMV2).

Si je parviens à le faire pour tout le domaine, je reviendrai et le mettrai à jour.

JustAGuy
la source
0

En fonction de la réponse choisie, j'ai modifié le script de Microsoft pour définir la sécurité WMI. Mon utilisateur de test était un utilisateur du domaine non administratif qui était membre des "Utilisateurs de gestion à distance" sur le système local pour des raisons non liées à ce problème. Après avoir accordé à mon utilisateur les autorisations EnableAccount, RemoteEnable et ExecuteMethods sur l'espace de noms cible, j'ai pu accéder à WMI.

Par conséquent, je n'ai pas ajouté mon utilisateur aux groupes locaux Utilisateurs de l' Analyseur de performances ou Utilisateurs du COM distribué .

Quelques notes concernant le script:

  1. Vous devez spécifier le chemin complet de l'espace de noms. Dans mon cas, l’espace de nommage était Root / Microsoft / SqlServer
  2. L'héritage était faux. Parce qu'il n'y a pas d'objets feuille que vous ne pouvez pas utiliser$OBJECT_INHERIT_ACE_FLAG
  3. Je me suis débarrassé de la fonction intégrée car elle était trop petite et elle n'a été utilisée qu'une fois.

Le script est ci-dessous. Je l'ai nommé 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
la source
-1

Nous avons fait cela pour PRTG: Nous avons créé un nouvel utilisateur de domaine: Création d'un objet de stratégie de groupe Dit pour placer son utilisateur dans le groupe "Utilisateurs du journal Performnce" et utilisation d'un script PowerShell pour ajouter cet utilisateur au contrôle WMI. grâce à:

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

Martijn van Dijck
la source
Veuillez inclure les informations pertinentes directement dans vos réponses. Les réponses postées devraient pouvoir être autonomes et utiliser simplement des liens pour référence.
Cory Knutson le