ผู้ใช้ต้องการสิทธิ์ / สิทธิ์ใดในการเข้าถึง WMI บนเครื่องระยะไกล


33

ฉันกำลังเขียนบริการตรวจสอบที่ใช้ WMI เพื่อรับข้อมูลจากเครื่องระยะไกล การมีสิทธิ์ผู้ดูแลระบบในเครื่องเหล่านี้เป็นไปไม่ได้ด้วยเหตุผลทางการเมือง

เป็นไปได้ไหม ผู้ใช้ของฉันต้องการสิทธิ์ / สิทธิ์ใด

คำตอบ:


31

การทำงานต่อไปนี้ใน Window 2003 R2 SP 2, Windows Server 2012 R2

  1. เพิ่มผู้ใช้ที่สงสัยไปยังกลุ่มผู้ใช้การตรวจสอบประสิทธิภาพ
  2. ภายใต้บริการและแอปพลิเคชันให้เปิดกล่องโต้ตอบคุณสมบัติของ WMI Control (หรือเรียกใช้wmimgmt.msc) ในแท็บความปลอดภัยให้ไฮไลต์Root/CIMV2คลิกความปลอดภัย เพิ่ม ผู้ใช้การตรวจสอบประสิทธิภาพและเปิดใช้งานตัวเลือก: Enable AccountและRemote Enable
  3. dcomcnfgวิ่ง ที่ตัวแทนบริการ> คอมพิวเตอร์> My Computer ในการรักษาความปลอดภัย COM แท็บนี้คุณสมบัติโต้ตอบคลิก "แก้ไขขีด จำกัด" สำหรับทั้งสองและAccess Permissions Launch and Activation Permissionsเพิ่มผู้ใช้การตรวจสอบประสิทธิภาพและอนุญาตการเข้าถึงระยะไกลการเปิดใช้ระยะไกลและการเปิดใช้งานระยะไกล
  4. เลือกเครื่องมือการจัดการของ Windows ภายใต้บริการคอมโพเนนต์> คอมพิวเตอร์> คอมพิวเตอร์ของฉัน> การกำหนดค่า DCOM และมอบRemote LaunchและRemote Activationสิทธิพิเศษให้กับกลุ่มผู้ใช้การตรวจสอบประสิทธิภาพ

หมายเหตุ:

  • อีกทางเลือกหนึ่งสำหรับขั้นตอนที่ 3 และ 4 ผู้ใช้สามารถกำหนดผู้ใช้ให้กับกลุ่มผู้ใช้ COM แบบกระจาย (ทดสอบบน Windows Server 2012 R2)
  • หากผู้ใช้ต้องการเข้าถึงเนมสเปซทั้งหมดคุณสามารถตั้งค่าใน 2. ที่Rootระดับและเรียกคืนสิทธิ์ให้กับเนมสเปซย่อยผ่านAdvancedหน้าต่างในSecurity

1
ฉันพบขั้นตอนที่ 2 และ 3 ไม่จำเป็นถ้าคุณเพิ่มผู้ใช้ไปยังผู้ใช้ COM แบบกระจาย
Nexus

ทำงานกับ WinXP และ Win7 ฉันไม่สามารถเพิ่มกลุ่ม "ผู้ใช้ COM กระจาย" - บางทีกลุ่มนี้สามารถเข้าถึงได้บนเซิร์ฟเวอร์เท่านั้นหรือ มันจะไม่แก้ไขในระหว่างการค้นหาชื่อเมื่อพยายามเพิ่มสิทธิ์ นอกจากนี้ฉันพบว่าฉันต้องตั้งค่าการอนุญาตสำหรับ WMI ใน "Root" เช่นเดียวกับ "Root / CIMV2" และฉันต้องเข้าสู่การอนุญาตขั้นสูงและใช้สิทธิ์สำหรับ subnamespaces เช่นเดียวกับ namespace
แชนนอนแว็กเนอร์

ใช้งานได้กับ Windows 8! นอกจากนี้บางคนรู้วิธีการทำเช่นเดียวกันจาก PowerShell หรือเปลือกอื่น ๆ ?
Bunyk

1
ในกรณีที่คุณต้องการให้ผู้ใช้สามารถเข้าถึงเนมสเปซทั้งหมดคุณสามารถให้สิทธิ์ในการรูทและ sub-namespaces ทั้งหมดโดยการเลือกรูทเปิดการรักษาความปลอดภัยแล้วขั้นสูงและตั้งค่าการสอบถามซ้ำ โดยค่าเริ่มต้นการตั้งค่าเหล่านี้จะใช้กับวัตถุที่เลือกเท่านั้นและไม่เรียงซ้อน
โธมัส

ไม่สามารถใช้งานกับ MSCluster namespace ได้
John

4

สิ่งที่ฉันทำบน Windows 8 ถูกเพิ่มผู้ใช้ไปยังกลุ่ม "ผู้ใช้การจัดการระยะไกล" และคำขอ WQL ระยะไกลทำงานได้


1

โดยค่าเริ่มต้นเฉพาะกลุ่มผู้ดูแลระบบท้องถิ่นเท่านั้นที่มีสิทธิ์ระยะไกลเป็น WMI คุณจะต้องกำหนดสิทธิ์ "เปิดใช้งานระยะไกล" ของ WMI เอง


1

คุณอาจต้องให้ "สิทธิ์การเข้าถึงระยะไกล DCOM" และ / หรือ "การเปิดใช้งานระยะไกล DCOM และสิทธิ์การเปิดใช้งาน" ทั้งนี้ขึ้นอยู่กับสิ่งที่คุณพยายามทำ บทความ MSDN นี้ให้ขั้นตอนทีละขั้นตอน


0

ต่อไปนี้ใช้ได้กับฉันในสภาพแวดล้อมโดเมน 2012 r2 แม้ว่าฉันจะจัดการต่อเซิร์ฟเวอร์ได้เท่านั้นและไม่ใช่ทั้งโดเมน:

1) เพิ่มผู้ใช้ไปยังกลุ่มผู้ใช้บันทึกประสิทธิภาพ 2) เรียกใช้ wmimgmt.msc คลิกขวาที่ "WMI Control (LOCAL) แท็บความปลอดภัยของ goto และให้สิทธิ์ผู้ใช้ที่เหมาะสม" เปิดใช้งานบัญชี "และ" เปิดใช้งานระยะไกล "บนเนมสเปซที่ต้องการ (ปกติ CIMV2)

หากฉันจัดการเพื่อให้เสร็จสมบูรณ์สำหรับทั้งโดเมนฉันจะกลับมาและอัปเดต


0

ตามคำตอบที่เลือกฉันแก้ไขสคริปต์จาก Microsoft เพื่อตั้งค่าความปลอดภัย WMI ผู้ใช้ทดสอบของฉันเป็นผู้ใช้โดเมนที่ไม่ใช่ผู้ดูแลระบบซึ่งเป็นสมาชิกของ "ผู้ใช้การจัดการระยะไกล" ในระบบท้องถิ่นด้วยเหตุผลที่ไม่เกี่ยวข้องกับปัญหานี้ หลังจากให้สิทธิ์ผู้ใช้ของฉันกับ EnableAccount, RemoteEnable และ ExecuteMethods บนเนมสเปซเป้าหมายฉันก็สามารถเข้าถึง WMI ได้

ดังนั้นผมไม่ได้เพิ่มผู้ใช้ของฉันไปที่ผู้ตรวจสอบประสิทธิภาพหรือแจกจ่ายผู้ใช้ COMกลุ่มท้องถิ่น

หมายเหตุบางประการเกี่ยวกับสคริปต์:

  1. คุณต้องระบุพา ธ เต็มของเนมสเปซ ในกรณีของฉันเนมสเปซคือรูท / Microsoft / SqlServer
  2. การสืบทอดนั้นผิด เนื่องจากไม่มีวัตถุใบไม้คุณไม่สามารถใช้งานได้$OBJECT_INHERIT_ACE_FLAG
  3. ฉันกำจัดฟังก์ชันฝังตัวเนื่องจากมีขนาดเล็กเกินไปและใช้เพียงครั้งเดียวเท่านั้น

สคริปต์อยู่ด้านล่าง ฉันตั้งชื่อมันว่า 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

เราทำสิ่งนี้เพื่อ PRTG: เราสร้างผู้ใช้โดเมนใหม่: สร้าง GPO Dit เพื่อให้ผู้ใช้ของเขาอยู่ในกลุ่ม "Performnce Log Users" และใช้สคริปต์ PowerShell เพื่อเพิ่มผู้ใช้นี้ใน WMI Control ขอบคุณที่:

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


กรุณาใส่ข้อมูลที่เกี่ยวข้องโดยตรงในคำตอบของคุณ คำตอบที่โพสต์ควรจะอยู่คนเดียวและใช้ลิงก์เพื่อการอ้างอิง
คอรี Knutson
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.