¿Qué permisos / derechos necesita un usuario para tener acceso WMI en máquinas remotas?

33

Estoy escribiendo un servicio de monitoreo que usa WMI para obtener información de máquinas remotas. Tener derechos de administrador local en todas estas máquinas no es posible por razones políticas.

es posible? ¿Qué permisos / derechos requiere mi usuario para esto?

jpoh
fuente

Respuestas:

31

Lo siguiente funciona en Windows 2003 R2 SP 2, Windows Server 2012 R2

  1. Agregue los usuarios en cuestión al grupo de usuarios del Monitor de rendimiento
  2. En Servicios y aplicaciones, abra el cuadro de diálogo de propiedades de Control WMI (o ejecutar wmimgmt.msc). En la pestaña Seguridad, resalte Root/CIMV2, haga clic en Seguridad; agregue usuarios de Monitor de rendimiento y habilite las opciones: Enable AccountyRemote Enable
  3. Ejecutar dcomcnfg. En Servicios de componentes> Computadoras> Mi PC, en la pestaña de seguridad COM del cuadro de diálogo Propiedades, haga clic en "Editar límites" para ambos Access Permissionsy Launch and Activation Permissions. Agregue usuarios de Monitor de rendimiento y permita el acceso remoto, el inicio remoto y la activación remota.
  4. Seleccionar Instrumental de administración de Windows en Servicios de componentes> Equipos> Mi PC> Configuración DCOM y darle Remote Launchy Remote Activationprivilegios a los usuarios del Monitor de rendimiento del grupo.

Notas:

  • Como alternativa a los pasos 3 y 4, se puede asignar al usuario al grupo Usuarios COM distribuidos (Probado en Windows Server 2012 R2)
  • Si el usuario necesita acceso a todos los espacios de nombres, puede establecer la configuración en 2. en el Rootnivel y volver a emitir los permisos a los subespacios de nombres a través de la Advancedventana enSecurity
jpoh
fuente
1
He encontrado que los pasos 2 y 3 no son necesarios si agrega el usuario a Usuarios COM distribuidos.
Nexus
Al trabajar en WinXP y Win7, no pude agregar el grupo "Usuarios COM distribuidos". ¿Quizás este grupo solo sea accesible en los servidores? No se resolvería durante la búsqueda de nombres al intentar agregar a los permisos. Además, descubrí que tenía que establecer permisos para WMI en "Root", así como en "Root / CIMV2" y que tenía que ingresar a permisos avanzados y aplicar el permiso para los espacios de nombres y el espacio de nombres.
Shannon Wagner
¡Funciona también para Windows 8! Además, ¿alguien sabe cómo hacer lo mismo desde powershell o algún otro shell?
Bunyk
1
En el caso de que desee que un usuario pueda acceder a todo el espacio de nombres, puede otorgar el permiso a Root y a todos los subespacios de nombres seleccionando Root, abriendo Seguridad y luego Avanzado y configurando la recursividad. Por defecto, esta configuración se aplica solo al objeto seleccionado y no se conecta en cascada.
Thomas
eso no funciona para el espacio de nombres MSCluster
John
4

Todo lo que hice en Windows 8 fue agregar usuario al grupo "Usuarios de administración remota", y las solicitudes WQL remotas funcionaron.

Bunyk
fuente
1

De forma predeterminada, solo el grupo de administradores locales tiene permisos remotos para WMI. Deberá personalizar los permisos WMI "Remote Enable".

ThatGraemeGuy
fuente
1

También es posible que deba otorgar "permisos de acceso remoto DCOM" y / o "permisos de activación y lanzamiento remoto DCOM", según lo que esté tratando de hacer exactamente. Este artículo de MSDN proporciona los procedimientos paso a paso.

KevinH
fuente
0

Lo siguiente funcionó para mí en un entorno de dominio r2 2012, aunque solo logré hacerlo por servidor y no todo el dominio:

1) Agregar usuario al grupo de usuarios del registro de rendimiento. 2) Ejecute wmimgmt.msc, haga clic con el botón derecho en "Control WMI (LOCAL), vaya a la pestaña Seguridad y otorgue al usuario apropiado" Habilitar cuenta "y" Habilitación remota "en el espacio de nombres deseado (normalmente CIMV2).

Si me las arreglo para todo el dominio, volveré y actualizaré.

JustAGuy
fuente
0

Según la respuesta elegida, modifiqué el script de Microsoft para configurar la seguridad de WMI. Mi usuario de prueba era un usuario de dominio no administrativo que era miembro de los "Usuarios de administración remota" en el sistema local por razones no relacionadas con este problema. Después de otorgar a mi usuario los permisos EnableAccount, RemoteEnable y ExecuteMethods en el espacio de nombres de destino, pude acceder a WMI.

Por lo tanto, no agregué mi usuario a los grupos locales de Usuarios del Monitor de rendimiento o Usuarios COM distribuidos .

Un par de notas sobre el guión:

  1. Debe especificar la ruta completa del espacio de nombres. En mi caso, el espacio de nombres era Root / Microsoft / SqlServer
  2. La herencia estaba mal. Porque no hay objetos de hoja que no puedas usar$OBJECT_INHERIT_ACE_FLAG
  3. Eliminé la función incrustada porque era demasiado pequeña y solo se usaba una vez.

El guión está abajo. Lo llamé 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
fuente
-1

Hicimos esto para PRTG: creamos un nuevo usuario de dominio: creamos un DIT de GPO para poner a su usuario en el grupo "Usuarios del registro de rendimiento" y usamos un script de PowerShell para agregar a este usuario al Control WMI. gracias a:

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

Martijn van Dijck
fuente
Incluya información relevante directamente en sus respuestas. Las respuestas publicadas deben ser independientes y solo usar enlaces como referencia.
Cory Knutson