दूरस्थ मशीनों पर WMI का उपयोग करने के लिए उपयोगकर्ता को किन अनुमतियों / अधिकारों की आवश्यकता होती है?


33

मैं एक निगरानी सेवा लिख ​​रहा हूँ जो दूरस्थ मशीनों से जानकारी प्राप्त करने के लिए WMI का उपयोग करती है। इन सभी मशीनों पर स्थानीय प्रशासन का अधिकार होना राजनीतिक कारणों से संभव नहीं है।

क्या यह संभव है? मेरे उपयोगकर्ता को इसके लिए क्या अनुमति / अधिकार चाहिए?

जवाबों:


31

विंडो 2003 R2 SP 2, Windows Server 2012 R2 पर निम्न कार्य करता है

  1. प्रदर्शन मॉनीटर उपयोगकर्ता समूह में उपयोगकर्ता को जोड़ें
  2. सेवाओं और अनुप्रयोगों के तहत, WMI नियंत्रण (या रन wmimgmt.msc) के गुण संवाद को लाएं । सुरक्षा टैब में, हाइलाइट Root/CIMV2करें, सुरक्षा पर क्लिक करें; प्रदर्शन मॉनिटर उपयोगकर्ता जोड़ें और विकल्पों को सक्षम करें: Enable AccountऔरRemote Enable
  3. भागो dcomcnfg। घटक सेवाओं पर> कंप्यूटर> मेरा कंप्यूटर, गुण संवाद के COM सुरक्षा टैब में Access Permissionsऔर दोनों के लिए "सीमाएं संपादित करें" पर क्लिक करें Launch and Activation Permissions। प्रदर्शन मॉनिटर उपयोगकर्ता जोड़ें और रिमोट एक्सेस, रिमोट लॉन्च और रिमोट सक्रियण की अनुमति दें।
  4. घटक सेवाओं> कंप्यूटर> मेरा कंप्यूटर> डीसीओएम कॉन्फ़िगरेशन के तहत विंडोज प्रबंधन इंस्ट्रूमेंटेशन का चयन करें Remote Launchऔर प्रदर्शन मॉनिटर उपयोगकर्ता समूह Remote Activationको विशेषाधिकार और विशेषाधिकार दें ।

टिप्पणियाँ:

  • वैकल्पिक रूप से चरण 3 और 4 के लिए, कोई उपयोगकर्ता को वितरित COM उपयोगकर्ताओं को वितरित कर सकता है (Windows Server 2012 R2 पर परीक्षण किया गया)
  • यदि उपयोगकर्ता को सभी नामस्थानों तक पहुंच की आवश्यकता है, तो आप सेटिंग्स को 2 में सेट कर सकते हैं। Rootस्तर पर, और Advancedविंडो के माध्यम से उप-नामस्थानों के लिए अनुमतियों की पुनरावृत्ति करेंSecurity

1
यदि आपने उपयोगकर्ता को वितरित COM उपयोगकर्ता में जोड़ा है तो मुझे चरण 2 और 3 आवश्यक नहीं हैं।
नेक्सस

WinXP और Win7 पर काम करते हुए, मैं "वितरित COM उपयोगकर्ता" समूह को जोड़ने में सक्षम नहीं था - शायद यह समूह केवल सर्वरों पर ही सुलभ है? अनुमतियों में जोड़ने का प्रयास करते समय यह नाम खोज के दौरान हल नहीं होगा। इसके अलावा, मैंने पाया कि मुझे "रूट" के साथ-साथ "रूट / CIMV2" पर WMI के लिए अनुमतियां सेट करनी थीं और मुझे उन्नत अनुमतियों में जाना था और उप-नाम के साथ-साथ नामस्थान की अनुमति भी लागू करनी थी।
शैनन वैग्नर

विंडोज 8 के लिए भी काम करता है! इसके अलावा, क्या किसी को पता है कि इसे पॉवरशेल या किसी अन्य शेल से कैसे किया जाए?
बनीक

1
उस स्थिति में जब आप चाहते हैं कि कोई उपयोगकर्ता सभी नामस्थानों तक पहुंचने में सक्षम हो, तो आप रूट और सभी उप-नामस्थानों को अनुमति दे सकते हैं रूट का चयन करके, फिर सुरक्षा खोलकर उन्नत और पुनरावृत्ति सेट करें। डिफ़ॉल्ट रूप से ये सेटिंग्स केवल चयनित ऑब्जेक्ट पर लागू होती हैं और कैस्केड नहीं होती हैं
थॉमस

MSCluster नाम स्थान के लिए काम नहीं करता है
जॉन

4

मैंने विंडोज 8 पर सभी को समूह "रिमोट मैनेजमेंट यूजर्स" में जोड़ा, और रिमोट डब्ल्यूक्यूएल अनुरोधों पर काम किया।


1

डिफ़ॉल्ट रूप से, केवल स्थानीय व्यवस्थापक समूह के पास WMI के लिए दूरस्थ अनुमति है। आपको WMI "दूरस्थ सक्षम" अनुमतियों को अनुकूलित करना होगा।


1

आपको "DCOM रिमोट एक्सेस परमिशन" और / या "DCOM रिमोट लॉन्च ऐंड ऐक्टिवेशन परमिशन" भी देना होगा, जो इस बात पर निर्भर करता है कि आप क्या करने की कोशिश कर रहे हैं। यह MSDN आलेख चरण-दर-चरण प्रक्रियाएँ देता है।


0

निम्नलिखित ने मेरे लिए 2012 r2 डोमेन वातावरण में काम किया, हालांकि मैं इसे केवल सर्वर के अनुसार करने में कामयाब रहा और पूरे डोमेन पर नहीं:

1) प्रदर्शन लॉग उपयोगकर्ता समूह में उपयोगकर्ता जोड़ें। 2) wmimgmt.msc चलाएं, राइट क्लिक करें "WMI नियंत्रण (LOCAL), गोटो सुरक्षा टैब और वांछित उपयोगकर्ता नाम (सामान्य CIMV2) पर उपयुक्त उपयोगकर्ता" सक्षम खाता "और" रिमोट सक्षम "को अनुदान दें।

अगर मैं इसे पूरे डोमेन के लिए प्राप्त करने का प्रबंधन करता हूं तो मैं वापस आऊंगा और अपडेट करूंगा।


0

चुने हुए उत्तर के आधार पर, मैंने WMI सुरक्षा सेट करने के लिए Microsoft से स्क्रिप्ट को संशोधित किया। मेरा परीक्षण उपयोगकर्ता एक गैर-प्रशासनिक डोमेन उपयोगकर्ता था जो इस मुद्दे से संबंधित कारणों के लिए स्थानीय प्रणाली पर "दूरस्थ प्रबंधन उपयोगकर्ता" का सदस्य था । अपने उपयोगकर्ता को EnableAccount, RemoteEnable, और ExecuteMethods को लक्ष्य नाम स्थान पर अनुमति देने के बाद, मैं WMI तक पहुँचने में सक्षम था।

इसलिए, मैंने अपने उपयोगकर्ता को प्रदर्शन मॉनिटर उपयोगकर्ताओं या वितरित COM उपयोगकर्ता स्थानीय समूहों में नहीं जोड़ा ।

स्क्रिप्ट के बारे में नोट्स की एक जोड़ी:

  1. आपको नामस्थान का पूर्ण पथ निर्दिष्ट करना होगा। मेरे मामले में, नाम रूट / Microsoft / SqlServer था
  2. वंशानुक्रम गलत था। क्योंकि आप उपयोग नहीं कर सकते हैं कोई पत्ती वस्तु नहीं हैं$OBJECT_INHERIT_ACE_FLAG
  3. मुझे एम्बेडेड फ़ंक्शन से छुटकारा मिला क्योंकि यह बहुत छोटा था और इसे केवल एक बार उपयोग किया गया था।

स्क्रिप्ट नीचे है। मैंने इसे सेट-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 बनाया और WMI नियंत्रण में इस उपयोगकर्ता को जोड़ने के लिए एक पॉवरशेल स्क्रिप्ट का उपयोग किया। करने के लिए धन्यवाद:

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


कृपया प्रासंगिक जानकारी सीधे अपने उत्तरों में शामिल करें। पोस्ट किए गए उत्तर अकेले खड़े होने में सक्षम होने चाहिए, और केवल संदर्भ के लिए लिंक का उपयोग करें।
कोरी नॉटसन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.