PowerShell'deki bu AD filtresi ile ilgili neler oluyor?


9

Ben son zamanlarda bu cevabı yazdım ve bir şey ilginç üzerinde tökezledi.

get-aduser -filter {-not (description -eq "auto")} | measure-object

ve

get-aduser -filter {description -ne "auto"} | measure-object

aynı verilere karşı çalıştırıldığında iki farklı şey döndürür, ilk komut beklenen değeri döndürür. Açıklama alanına Boş değere sahip kullanıcılar olduğunu ilk bakışta göründüğü değil NULL açıkça "auto" eşit olmasa bile, ikinci komuta maçların olarak döndü.

Sohbet eden birkaç kişi buna baktı ve deli olmadığımı doğruladı. Burada neler oluyor?


1
İlginçtir ki burada-Object ile borulama ve yukarıdaki işe yaramayan filtre uygulamak çalışır. get-aduser -filter * -Özellikler açıklaması | ? {$ _. açıklama -ne "Otomatik"} | ölçü
Mike

@ Mike Evet, bu davranışı gibi görünen -nekarşılaştırma operatörü içinde-Filter bloğun sadece. Özellikle, karşılaştırmanın giriş değeri olduğunda $null.
jscott

1
Beğenmek ve beğenmemek benzer şekilde çalışıyor gibi görünüyor. {description -notlike "bir şey"} çalışmıyor, ancak {-not (açıklama-benzeri "bir şey")} çalışıyor. Ayrıca çalışanın değerlendirilmesi oldukça uzun sürer. Kırık olan gibi tüm nesneleri değerlendirmiyor gibi.
Mike

@Mike Doğru. Aslında bunu -notlikeorijinal olarak kullanarak tökezledim , ama -neistediğimi elde edemediğimi fark ettikten sonra geçtim. TBH, siz bahsedene kadar denediğimi bile unuttum - ama ben de çoğaltabilirim.
MDMarra

2
Sadece bir düşünce ama belki PoSH -eq/ -necümle bir SQL =/ gibi davranmaya çalışır <>? SQL'de foo = NULLve foo <> NULLher zaman yanlış döndürür, çünkü NULL 'karşılaştırılamaz' - yalnızca foo IS NULLve foo IS NOT NULLözel işleçler çalışır. Senin nerede davranış Posh, benzer olmalıdır -not (foo -eq "bar")filtre için her şeyi dönecekti (foo -eq "bar")döndü $false, foo -eq $nullyapardı. Bunun yerine, nasıl if (!foo -or foo -ne "bar")(eşdeğer SQL foo IS NULL OR foo <> 'bar')?
jimbobmcgee

Yanıtlar:


4

İkisi arasındaki anahtar fark, ilk komutun tüm sonuçları almak için değerlerin doğrudan karşılaştırılmasını içermemesi ve ikinci komutun olmasıdır. İlk komut NULL sonuçları içerir ve ikincisi içermez (MDMarra'nın zaten keşfettiği gibi). Her iki komut da bu cmdlet ile başlar:

get-aduser

Aşağıdakilerden geçerken, bu cmdlet'in sonuçlarının, -filterparametredeki herhangi bir şeyden bağımsız olarak tüm AD kullanıcılarını içerdiğini unutmayın.

Şimdi farklı olan iki parçayı parçalayalım. İlki:

{-not (description -eq "auto")}

...anlamına geliyor

  1. "description özelliğinin " auto "metin dizesine eşit olduğunu anlayın . Bu karşılaştırmanın çalışması için, -eqoperatörün bunu" auto "ile karşılaştırabilmesi için açıklama alanında bir dize bulunması gerekir . NULL değerler bundan düşüyor NULL değerini dize değeriyle karşılaştıramadığı için karşılaştırma.
  2. bağımsız olarak -eqfilter parametresi , sonuçta OLMAYAN HERŞEYİ verir (description -eq "auto"), bu da NULL'leri içerecektir, çünkü orijinal cmdlet, get-adusertüm AD kullanıcılarını içerir. -notOperatör ile başka hiçbir şeyi karşılaştırmak zorunda değildi . Sadece (description -eq "auto")filtrenin sonuçlarının yanı sıra size her şeyi verdi .

Örneğinizde, açıklamalarının "otomatik" e eşit olan 1 AD kullanıcısı, birkaç "otomatik" dışında bir şeyle ve birkaç yüz NULL açıklamalarla eşleştiğini varsayalım. Komut mantığında adım adım yapacaktır:

  1. Bana açıklamanın "otomatik" e eşit olduğu tüm AD kullanıcılarını (get-aduser) ver - 1 kullanıcıyla sonuçlanır
  2. Bana verdiğiniz tüm AD kullanıcılarını ver - sonuç başka bir şeyle birkaç yüz VE NULL olan birkaç yüz.

-notOperatörü kullanarak başka bir şeyle karşılaştırmak zorunda olmadığından , sonuç, orijinal get-adusercmdlet'te yakalanan NULL açıklama kullanıcılarını içeriyordu .

İkinci komut:

{description -ne "auto"}

...anlamına geliyor

  1. msgstr "" "açıklama özelliğinin tam olarak" auto "dizesine eşit olmadığını anlayın . Yine, bu karşılaştırmanın çalışması için, -neoperatörün" auto "ile karşılaştırabilmesi için açıklama alanında bir dize bulunması gerekir . NULL değerler NULL değeri bir dize değeriyle karşılaştırılamadığından bu karşılaştırmadan çıkarılır.

Örneğinizde, açıklamaları "otomatik" e eşit olan 1 AD kullanıcısı, birkaç "otomatik" dışında bir şeyle ve birkaç yüz NULL açıklama ile sahip olduğunu varsayalım. Komut mantığında adım adım yapacaktır:

  1. Bana tüm AD kullanıcılarına açıklamanın "otomatik" değerine eşit olmadığı bir yer verin - birkaç yüz kullanıcının açıklamasında "otomatik" dışında bir şeyle sonuçlanır. Kullanıcıları NULL açıklamalarla çekmez çünkü NULL ile bir metin dizesini karşılaştıramaz.

Her iki durumda da iki komut arasındaki tüm fark kesinlikle sezgisel değildir.

Bu komutu kullanarak, NULL'ları bir "-ve" ile şu şekilde yakalayabilmelisiniz:

{description -ne "auto" -and description -ne $NULL}

Şu anda test edemediğim için sözdiziminde% 100 değilim ve muhtemelen bunu yapmanın daha iyi bir yolu var. Her şey bozulduğunda, oldukça anti-iklimsel ve açıklamak için çok fazla yazım yaptı, ancak çeşitli operatörleri ve çok sayıda deneme yanılma kullanmadan önce böyle garip şeylerle karşılaştım, çünkü tüm uyarıları asla hatırlayamıyorum her birini kullanmaya devam ediyor.

Referans: http://technet.microsoft.com/en-us/library/hh847732.aspx :

Karşılaştırma Operatörleri

Değerleri ve test koşullarını karşılaştırmak için karşılaştırma işleçlerini (-eq, -ne, -gt, -lt, -le, -ge) kullanın. Örneğin, eşit olup olmadığını belirlemek için iki dize değerini karşılaştırabilirsiniz.

Karşılaştırma işleçleri, düzenli ifadeler kullanarak kalıpları bulan eşleme işleçlerini (-match, -notmatch); giriş değerlerini değiştirmek için düzenli ifadeler kullanan değiştir operatörü (-replace); joker karakterler (*) kullanarak kalıplar bulan benzer işleçler (-like, -notlike); ve bir test değerinin referans kümesinde görünüp görünmeyeceğini belirleyen sınırlama işleçleri (in, -notin, -contains, -notcontains).

Ayrıca değerlerde bit kalıplarını işlemek için bitsel operatörler (-bAND, -bOR, -bXOR, -bNOT) içerir.

Daha fazla bilgi için, bkz. About_Comparison_Operators

Mantıksal operatörler

Koşullu ifadeleri tek bir karmaşık koşullu duruma bağlamak için mantıksal işleçler (-ve, -veya, -xor, -not,!) Kullanın . Örneğin, iki farklı koşullu bir nesne filtresi oluşturmak için mantıksal -ve işleci kullanabilirsiniz.

Daha fazla bilgi için bkz. About_Logical_Operators.


Kesinlikle iyi bir genel bakış, ancak null değerleri neden -ne ve -notlike işleçlerinin dışında bırakılıyor? Bu gerçek kafa kaşıyıcı. Ben onun tasarımı ile bir bazı ezoterik .net spec açıklama ya da onun bir hata veya beklenmedik bir davranış olup olmadığını merak ediyorum?
MDMarra

Bekle, sadece daha yakından oku. Görünüşe göre sadece dizeleri karşılaştırıyorlar ve boş nitelikler aslında boş ve boş bir dizgi değil. Sezgisel değilse ilginç.
MDMarra

0

Bu eski soruyu arama yaparken göründüğü gibi eklemek:

-Ne veya -notlike gibi negatif eşleşmeli -Filter kullanımı, boş null değerlere sahip sonuçları içermez. Bunların dahil edilmesi için de -not benzeri '*' olarak -eq '' ve -eq $ NULL kullanarak açıkça eşleştirmeniz gerekir . Bu, doğrudan bir -LdapFilter negatif eşleşme boş değerleri DOES kullanarak -Filter ile bir tuhaflık olduğunu unutmayın.

Negatif ile çoklu eşleşmenin bir Filtre ve LdapFilter örneği:

Get-ADUser -Filter { mail -like '*example*' -and (description -ne 'example' -or description -notlike '*') }

Get-ADUser -LdapFilter '(&(mail=*example*)(!description=example))'
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.