Respuestas:
Lo siguiente funciona en Windows 2003 R2 SP 2, Windows Server 2012 R2
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 Account
yRemote Enable
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 Permissions
y Launch and Activation Permissions
. Agregue usuarios de Monitor de rendimiento y permita el acceso remoto, el inicio remoto y la activación remota.Remote Launch
y Remote Activation
privilegios a los usuarios del Monitor de rendimiento del grupo.Notas:
Root
nivel y volver a emitir los permisos a los subespacios de nombres a través de la Advanced
ventana enSecurity
De forma predeterminada, solo el grupo de administradores locales tiene permisos remotos para WMI. Deberá personalizar los permisos WMI "Remote Enable".
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.
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é.
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:
$OBJECT_INHERIT_ACE_FLAG
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)" }
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: