Bir kullanıcının uzak makinelerde WMI erişimine sahip olması için hangi izinler / haklar gerekir?


33

Uzak makinelerden bilgi almak için WMI kullanan bir izleme hizmeti yazıyorum. Tüm bu makinelerde yerel yönetici haklarına sahip olmak politik nedenlerden dolayı mümkün değildir.

Mümkün mü? Kullanıcım bunun için hangi izinleri / hakları istiyor?

Yanıtlar:


31

Windows 2003 R2 SP 2, Windows Server 2012 R2'de aşağıdakiler çalışır

  1. Söz konusu kullanıcıları, Performans İzleyicisi Kullanıcıları grubuna ekleyin.
  2. Hizmetler ve Uygulamalar altında, WMI Denetimi (veya çalıştırma wmimgmt.msc) özellikleri iletişim kutusunu açın . Güvenlik sekmesinde, Güvenlik'i vurgulayın Root/CIMV2; Performans İzleyicisi Kullanıcıları ekleyin ve seçenekleri etkinleştirin: Enable AccountveRemote Enable
  3. Run dcomcnfg. Bileşen Hizmetleri> Bilgisayar> My Computer anda, Özellikleri COM güvenlik sekmesinde ikisi için "Edit Sınırları" tıklayarak iletişim Access Permissionsve Launch and Activation Permissions. Performans İzleyicisi Kullanıcıları ekleyin ve uzaktan erişim, uzaktan başlatma ve uzaktan etkinleştirmeye izin verin.
  4. Bileşen Hizmetleri> Bilgisayarlar> Bilgisayarım> DCOM Yapılandırması altında Windows Yönetim Araçları'nı seçin Remote Launchve Performans İzleyicisi Kullanıcıları Grubu'na Remote Activationayrıcalıklar verin .

Notlar:

  • Alternatif olarak adım 3 ve 4'e göre, kullanıcı Dağıtılmış COM Kullanıcıları grubuna atanabilir (Windows Server 2012 R2'de test edilmiştir)
  • Kullanıcının tüm ad alanlarına erişmesi gerekiyorsa, ayarları 2. Rootseviyeye ayarlayabilir ve Advancedpenceredeki alt ad alanlarına izinleri yeniden alabilirsiniz .Security

1
Kullanıcıyı Dağıtılmış COM Kullanıcılarına eklerseniz, 2. ve 3. adımları gerekli değildir.
Nexus

WinXP ve Win7 üzerinde çalışırken, "Dağıtılmış COM Kullanıcıları" grubunu ekleyemedim - belki de bu gruba sadece sunucularda erişilebiliyor mu? İzinleri eklemeye çalışırken ad araması sırasında çözülmez. Ayrıca, WMI için "Root" ve "Root / CIMV2" de izinler ayarlamam gerektiğini ve gelişmiş izinlere girmem ve alt alanların yanı sıra ad alanı için de izin vermem gerektiğini öğrendim.
Shannon Wagner

Windows 8 için de çalışıyor! Ayrıca, birisi powershell'den veya başka bir kabuğundan nasıl yapılacağını biliyor mu?
Bunyk

1
Bir kullanıcının tüm ad alanına erişebilmesini istiyorsanız, Kök ve tüm alt ad alanlarına Kök, Güvenlik ve ardından Gelişmiş seçeneklerini seçip özyinelemeyi ayarlayarak izin verebilirsiniz . Varsayılan olarak bu ayarlar yalnızca seçilen nesneye uygulanır ve basamaklama yapmaz .
Thomas

Bu MSCluster ad alanı için işe yaramaz
John

4

Windows 8'de yaptığım tek şey "Uzaktan Yönetim Kullanıcıları" grubuna kullanıcı eklendi ve uzak WQL istekleri işe yaradı.


1

Varsayılan olarak, yalnızca yerel Administrators grubunun WMI'ye uzaktan izinleri vardır. WMI "Uzaktan Etkinleştir" izinlerini özelleştirmeniz gerekir.


1

Tam olarak ne yapmaya çalıştığınıza bağlı olarak, "DCOM uzaktan erişim izinleri" ve / veya "DCOM uzaktan başlatma ve etkinleştirme izinleri" vermeniz de gerekebilir. Bu MSDN makalesi , adım adım yordamlar verir.


0

Aşağıdakiler benim için 2012 r2 alan adı altında çalıştı, ancak alan adı başına sadece sunucu başına yapmayı başardım:

1) Performans Günlüğü Kullanıcıları Grubu'na kullanıcı ekleyin. 2) wmimgmt.msc'yi çalıştırın, sağa "WMI Control (LOCAL), Güvenlik sekmesine gidin ve istediğiniz kullanıcı adında (her zamanki CIMV2) uygun kullanıcı" Enable Account "ve" Remote Enable "tuşlarını verin.

Eğer tüm alan için yapmayı başarırsam geri döneceğim ve güncelleyeceğim.


0

Seçilen cevaba göre, WMI güvenliğini ayarlamak için betiği Microsoft'tan değiştirdim. Test kullanıcım, bu sorunla ilgili olmayan nedenlerle yerel sistemde "Uzaktan Yönetim Kullanıcıları" nın bir üyesi olan yönetici olmayan bir etki alanı kullanıcısıydı . Kullanıcıma hedef ad alanındaki EnableAccount, RemoteEnable ve ExecuteMethods izinlerini verdikten sonra, WMI'ya erişebildim.

Yani, did not benim kullanıcı eklemek performans izleyicisi kullanıcıları veya dağıtılmış COM Users yerel grupları.

Senaryo ile ilgili birkaç not:

  1. Ad alanının tam yolunu belirtmelisiniz. Benim durumumda, ad alanı Root / Microsoft / SqlServer idi.
  2. Kalıtım yanlıştı. Çünkü kullanamayacağınız yaprak nesnesi yok$OBJECT_INHERIT_ACE_FLAG
  3. Gömülü işlevden kurtuldum çünkü çok küçüktü ve sadece bir kez kullanıldı.

Senaryo aşağıda. Set-WMINamespaceSsecurity.ps1 adını verdim

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

Bunu PRTG için yaptık: Yeni bir etki alanı kullanıcısı oluşturduk: Kullanıcısını "Performnce Log Users" grubuna koymak için bir GPO Dit oluşturduk ve bu kullanıcıyı WMI Control'e eklemek için bir powershell betiği kullandık. sayesinde:

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


Lütfen doğrudan ilgili cevaplarınızı cevaplarınıza ekleyin. Gönderilen cevaplar tek başına durabilmeli ve referans için sadece bağlantıları kullanmalıdır.
Cory Knutson
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.