Risposte:
Quanto segue funziona su Windows 2003 R2 SP 2, Windows Server 2012 R2
wmimgmt.msc
). Nella scheda Sicurezza, evidenziare Root/CIMV2
, fare clic su Sicurezza; aggiungere gli utenti di Performance Monitor e abilitare le opzioni: Enable Account
eRemote Enable
dcomcnfg
. In Servizi componenti> Computer> Risorse del computer, nella scheda Protezione COM della finestra di dialogo Proprietà fare clic su "Modifica limiti" per entrambi Access Permissions
e Launch and Activation Permissions
. Aggiungi utenti Performance Monitor e consenti l'accesso remoto, l'avvio remoto e l'attivazione remota.Remote Launch
e Remote Activation
privilegi al gruppo utenti Performance Monitor .Gli appunti:
Root
livello e richiedere le autorizzazioni agli spazi dei nomi secondari tramite la Advanced
finestra inSecurity
Per impostazione predefinita, solo il gruppo Administrators locale dispone delle autorizzazioni remote per WMI. Dovrai personalizzare le autorizzazioni WMI "Abilitazione remota".
Potrebbe inoltre essere necessario concedere "Autorizzazioni di accesso remoto DCOM" e / o "Autorizzazioni di avvio e attivazione remote DCOM" a seconda di ciò che si sta tentando di fare. Questo articolo MSDN illustra le procedure dettagliate.
Quanto segue ha funzionato per me in un ambiente di dominio r2 2012 anche se sono riuscito a farlo solo per server e non per l'intero dominio:
1) Aggiungi utente al gruppo Utenti registro prestazioni. 2) Esegui wmimgmt.msc, fai clic con il pulsante destro del mouse su "Controllo WMI (LOCAL), vai alla scheda Sicurezza e concedi all'utente appropriato" Abilita account "e" Abilita remoto "sullo spazio dei nomi desiderato (di solito CIMV2).
Se riesco a farlo per l'intero dominio tornerò e aggiornerò.
Sulla base della risposta scelta, ho modificato lo script di Microsoft per impostare la sicurezza WMI. Il mio utente di prova era un utente di dominio non amministrativo che era un membro degli "Utenti di gestione remota" sul sistema locale per motivi non correlati a questo problema. Dopo aver concesso al mio utente le autorizzazioni EnableAccount, RemoteEnable ed ExecuteMethods sullo spazio dei nomi di destinazione, sono stato in grado di accedere a WMI.
Pertanto, non ho aggiunto il mio utente ai gruppi locali Utenti Performance Monitor o Distributed COM Users .
Un paio di note riguardanti la sceneggiatura:
$OBJECT_INHERIT_ACE_FLAG
Lo script è sotto. L'ho chiamato 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)" }
Lo abbiamo fatto per PRTG: abbiamo creato un nuovo utente di dominio: creato un oggetto Criteri di gruppo per inserire il suo utente nel gruppo "Performnce Log Users" e utilizzato uno script PowerShell per aggiungere questo utente al controllo WMI. grazie a: