Hak / hak apa yang dibutuhkan pengguna untuk memiliki akses WMI pada mesin jarak jauh?


33

Saya sedang menulis layanan pemantauan yang menggunakan WMI untuk mendapatkan informasi dari mesin jarak jauh. Memiliki hak admin lokal pada semua mesin ini tidak dimungkinkan karena alasan politik.

Apakah ini mungkin? Izin / hak apa yang dibutuhkan pengguna saya untuk ini?

Jawaban:


31

Berikut ini berfungsi pada Window 2003 R2 SP 2, Windows Server 2012 R2

  1. Tambahkan pengguna yang dipermasalahkan ke grup Pengguna Monitor Kinerja
  2. Di bawah Layanan dan Aplikasi, buka dialog properti Kontrol WMI (atau jalankan wmimgmt.msc). Di tab Keamanan, sorot Root/CIMV2, klik Keamanan; tambahkan Pengguna Monitor Kinerja dan aktifkan opsi: Enable AccountdanRemote Enable
  3. Lari dcomcnfg. Di Layanan Komponen> Komputer> Komputer Saya, di tab keamanan COM pada dialog Properti, klik "Edit Batas" untuk keduanya Access Permissionsdan Launch and Activation Permissions. Tambahkan Pengguna Monitor Kinerja dan izinkan akses jarak jauh, peluncuran jarak jauh, dan aktivasi jarak jauh.
  4. Pilih Instrumentasi Manajemen Windows di bawah Layanan Komponen> Komputer> Komputer Saya> Konfigurasi DCOM dan berikan Remote Launchdan Remote Activationhak istimewa kepada Kelompok Pengguna Monitor Kinerja .

Catatan:

  • Sebagai alternatif untuk langkah 3 dan 4, seseorang dapat menetapkan pengguna ke grup Pengguna COM Terdistribusi (Diuji pada Windows Server 2012 R2)
  • Jika pengguna membutuhkan akses ke semua ruang nama, Anda dapat mengatur pengaturan di 2. di Roottingkat, dan mengulangi izin untuk ruang-ruang nama melalui Advancedjendela diSecurity

1
Saya menemukan langkah 2 dan 3 tidak diperlukan jika Anda menambahkan pengguna ke Pengguna COM Terdistribusi.
Nexus

Bekerja pada WinXP dan Win7, saya tidak dapat menambahkan grup "Distributed COM Users" - mungkin grup ini hanya dapat diakses di server? Itu tidak akan menyelesaikan selama pencarian nama ketika mencoba untuk menambah izin. Juga, saya menemukan bahwa saya harus menetapkan izin untuk WMI pada "Root" serta "Root / CIMV2" dan bahwa saya harus pergi ke izin lanjutan dan menerapkan izin untuk ruang-ruang subnames serta ruang nama.
Shannon Wagner

Juga berfungsi untuk Windows 8! Juga, apakah ada yang tahu cara melakukan hal yang sama dari PowerShell atau shell lain?
Bunyk

1
Jika Anda ingin pengguna dapat mengakses semua namespace, Anda dapat memberikan izin kepada Root dan semua sub-namespaces dengan memilih Root, membuka Security lalu Advanced dan mengatur rekursi. Secara default, pengaturan ini hanya berlaku untuk objek yang dipilih dan tidak mengalir.
Thomas

itu tidak bekerja untuk namespace MSCluster
John

4

Semua yang saya lakukan pada Windows 8 ditambahkan pengguna ke grup "Pengguna Manajemen Jarak Jauh", dan permintaan WQL jarak jauh berfungsi.


1

Secara default, hanya grup Administrator lokal yang memiliki izin jarak jauh untuk WMI. Anda harus menyesuaikan izin WMI "Remote Enable".


1

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.


0

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.


0

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:

  1. Anda harus menentukan path lengkap namespace. Dalam kasus saya, namespace adalah Root / Microsoft / SqlServer
  2. Warisan salah. Karena tidak ada objek daun yang tidak dapat Anda gunakan$OBJECT_INHERIT_ACE_FLAG
  3. Saya menyingkirkan fungsi tertanam karena terlalu kecil dan hanya digunakan sekali.

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

-1

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:

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


Harap sertakan informasi yang relevan secara langsung dalam jawaban Anda. Jawaban yang diposting harus dapat berdiri sendiri, dan cukup gunakan tautan untuk referensi.
Cory Knutson
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.