¿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?

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

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.


1

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


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.


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é.


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)" }

-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


Incluya información relevante directamente en sus respuestas. Las respuestas publicadas deben ser independientes y solo usar enlaces como referencia.
Cory Knutson
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.