Jawaban:
Berikut ini berfungsi pada Window 2003 R2 SP 2, Windows Server 2012 R2
wmimgmt.msc
). Di tab Keamanan, sorot Root/CIMV2
, klik Keamanan; tambahkan Pengguna Monitor Kinerja dan aktifkan opsi: Enable Account
danRemote Enable
dcomcnfg
. Di Layanan Komponen> Komputer> Komputer Saya, di tab keamanan COM pada dialog Properti, klik "Edit Batas" untuk keduanya Access Permissions
dan Launch and Activation Permissions
. Tambahkan Pengguna Monitor Kinerja dan izinkan akses jarak jauh, peluncuran jarak jauh, dan aktivasi jarak jauh.Remote Launch
dan Remote Activation
hak istimewa kepada Kelompok Pengguna Monitor Kinerja .Catatan:
Root
tingkat, dan mengulangi izin untuk ruang-ruang nama melalui Advanced
jendela diSecurity
Secara default, hanya grup Administrator lokal yang memiliki izin jarak jauh untuk WMI. Anda harus menyesuaikan izin WMI "Remote Enable".
Anda mungkin juga harus memberikan "izin akses jarak jauh DCOM" dan / atau "izin peluncuran dan aktivasi jarak jauh DCOM" tergantung pada apa yang sebenarnya Anda coba lakukan. Artikel MSDN ini memberikan prosedur langkah demi langkah.
Berikut ini berfungsi untuk saya di lingkungan domain r2 2012 meskipun saya hanya berhasil melakukannya per server dan bukan seluruh domain:
1) Tambahkan pengguna ke Grup Pengguna Log Kinerja. 2) Jalankan wmimgmt.msc, klik kanan "Kontrol WMI (LOCAL), buka tab Keamanan dan berikan pengguna yang sesuai" Aktifkan Akun "dan" Aktifkan Jarak Jauh "pada namespace yang diinginkan (biasanya CIMV2).
Jika saya berhasil menyelesaikannya untuk seluruh domain, saya akan kembali dan memperbarui.
Berdasarkan jawaban yang dipilih, saya memodifikasi skrip dari Microsoft untuk mengatur keamanan WMI. Pengguna pengujian saya adalah pengguna domain non-administratif yang merupakan anggota "Pengguna Manajemen Jarak Jauh" pada sistem lokal karena alasan yang tidak terkait dengan masalah ini. Setelah memberikan kepada pengguna saya izin EnableAccount, RemoteEnable, dan ExecuteMethods di namespace target, saya dapat mengakses WMI.
Jadi, saya tidak menambahkan pengguna saya ke grup lokal Performa Monitor Pengguna atau Pengguna COM Terdistribusi .
Beberapa catatan tentang skrip:
$OBJECT_INHERIT_ACE_FLAG
Script di bawah ini. Saya menamainya 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)" }
Kami melakukan ini untuk PRTG: Kami menciptakan pengguna domain baru: Membuat GPO Dit untuk menempatkan pengguna di grup "Performnce Log Users" dan menggunakan skrip PowerShell untuk menambahkan pengguna ini ke Kontrol WMI. terimakasih untuk: