it-swarm.asia

Bir kullanıcının uzak makinelerde WMI erişimine sahip olması gereken izinler / haklar nelerdir?

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

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

34
jpoh

Windows 2003 R2'de şu çalışır SP 2, Windows Server 2012 R2

  1. Söz konusu kullanıcıları Performans İzleyicisi Kullanıcıları grubuna ekleyin
  2. Hizmetler ve Uygulamalar altında, WMI Denetimi'nin özellikler iletişim kutusunu açın (veya wmimgmt.msc Komutunu çalıştırın). Güvenlik sekmesinde Root/CIMV2 Öğesini vurgulayın, Güvenlik'i tıklayın; Performans İzleyicisi Kullanıcıları ekleyin ve seçenekleri etkinleştirin: Enable Account ve Remote Enable
  3. dcomcnfg dosyasını çalıştırın. Bileşen Hizmetleri> Bilgisayarlar> Bilgisayarım'da, Özellikler iletişim kutusunun COM güvenlik sekmesinde hem Access Permissions Hem de Launch and Activation Permissions İçin "Sınırları Düzenle" yi tıklayın. Performans İzleyicisi Kullanıcıları ekleyin ve uzaktan erişime, uzaktan başlatmaya 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 ve Performans İzleyicisi Kullanıcıları Grup'a Remote Launch Ve Remote Activation Ayrıcalıkları verin.

Notlar:

  • Adım 3 ve 4'e alternatif olarak kullanıcıyı gruba atayabilirsiniz Dağıtılmış COM Kullanıcıları (Windows Server 2012 R2'de test edilmiştir)
  • Kullanıcının tüm ad alanlarına erişmesi gerekiyorsa, ayarları Root düzeyinde 2. olarak ayarlayabilir ve Advanced'deki Security penceresinden alt ad alanlarına izinleri geri alabilirsiniz.
32
jpoh

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

4
Bunyk

Varsayılan olarak, yalnızca yerel Administrators grubu WMI için uzaktan izinlere sahiptir. WMI "Uzaktan Etkinleştirme" izinlerini özelleştirmeniz gerekir.

1
ThatGraemeGuy

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 prosedürleri verir.

1
KevinH

Tüm etki alanı için değil, yalnızca sunucu başına yapmayı başarabildim, ancak 2012 r2 etki alanı ortamında benim için çalıştı:

1) Performans Günlüğü Kullanıcıları Grubuna kullanıcı ekleyin. 2) wmimgmt.msc komutunu çalıştırın, "WMI Denetimi (LOCAL) 'a sağ tıklayın, Güvenlik sekmesine gidin ve istediğiniz kullanıcı alanında (normalde CIMV2)" Kullanıcıyı Etkinleştir "ve" Uzaktan Etkinleştir "kullanıcılarına verin.

Tüm etki alanı için bunu başarabilirsem geri gelip güncelleyeceğim.

0
JustAGuy

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

Bu yüzden, kullanıcımı Performans İzleyicisi Kullanıcıları veya Dağıtılmış COM Kullanıcıları local'a eklemedim grupları.

Senaryo ile ilgili birkaç not:

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

Komut dosyası aşağıda. Ben Set-WMINamespaceSsecurity.ps1 adını

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"

[email protected]{Namespace=$Namespace;Path="[email protected]";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"
  [email protected]{}
  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
}

[email protected]{Name="SetSecurityDescriptor"; ArgumentList=$ACL}+$InvokeParams

$output = Invoke-WmiMethod @SetParams
if ($output.ReturnValue -ne 0) { throw "SetSecurityDescriptor failed: $($output.ReturnValue)" }