PowerShell में इस AD फ़िल्टर के साथ क्या बिल्ली चल रही है?


9

मैंने हाल ही में इस उत्तर को लिखा और कुछ दिलचस्प पर ठोकर खाई।

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

तथा

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

एक ही डेटा के खिलाफ चलने पर दो बहुत अलग चीजें लौटाएं, पहला कमांड अपेक्षित मूल्य लौटाए। यह पहली नज़र में प्रतीत होता है कि विवरण फ़ील्ड में एक शून्य मान वाले उपयोगकर्ता दूसरी कमांड में मैचों के रूप में वापस नहीं आते हैं , भले ही NULL स्पष्ट रूप से "ऑटो" के बराबर नहीं है।

चैट में कुछ लोगों ने इसे देखा और सत्यापित किया कि मैं पागल नहीं हूं। यहाँ क्या चल रहा है?


1
दिलचस्प है कि जहां-जहां वस्तु है, उसके माध्यम से पाइपिंग करना और ऊपर काम नहीं करने वाले फिल्टर को लागू करना। get-aduser -filter * -प्रवण विवरण | ; {$ _। विवरण-एक "ऑटो"} | उपाय
माइक

@Mike हाँ, यह के व्यवहार प्रतीत होता -neतुलना ऑपरेटर के भीतर-Filter ब्लॉक केवल। विशेष रूप से, जब तुलना का इनपुट मूल्य है $null
jscott

1
जैसा और जैसा लगता है वैसा ही काम करने लगता है। {description -notlike "कुछ"} काम नहीं करता है, लेकिन {-not (विवरण-जैसा "कुछ")} करता है। इसके अलावा, जो काम करता है वह मूल्यांकन करने में काफी लंबा समय लेता है। टूटी हुई की तरह सभी वस्तुओं का मूल्यांकन नहीं करना चाहिए।
माइक

@ मायके यही सही है। मैं वास्तव में -notlikeमूल रूप से इस का उपयोग कर ठोकर खाई , लेकिन -neबाद में मुझे एहसास हुआ कि मुझे वह नहीं मिल रहा है जो मैं चाहता था। टीबीएच, मैं भूल गया था मैंने भी कोशिश की थी कि जब तक आपने इसका उल्लेख नहीं किया - लेकिन मैं इसे भी पुन: पेश कर सकता हूं।
एमडीमैरा

2
बस एक विचार है, लेकिन शायद PoSH -eq/ -neखंड एक SQL =/ की तरह व्यवहार करने की कोशिश करता है <>? SQL में, foo = NULLऔर foo <> NULLहमेशा झूठा वापस आएगा, क्योंकि NULL 'अतुलनीय' है - केवल foo IS NULLऔर foo IS NOT NULLविशेष ऑपरेटर ही काम करेंगे। पॉश में व्यवहार समान होना चाहिए, जहां आपका -not (foo -eq "bar")फ़िल्टर वह सब कुछ लौटाएगा जिसके लिए (foo -eq "bar")वह लौटा $false, जो foo -eq $nullकरेगा। इसके बजाय, कैसे if (!foo -or foo -ne "bar")(बराबर SQL foo IS NULL OR foo <> 'bar') के बारे में ?
जिंबोबामेगी

जवाबों:


4

दोनों के बीच महत्वपूर्ण अंतर यह है कि पहला कमांड सभी परिणामों को प्राप्त करने के लिए मूल्यों की प्रत्यक्ष तुलना शामिल नहीं करता है, और दूसरा कमांड करता है। पहले आदेश में NULL परिणाम और दूसरा शामिल नहीं है (जैसा कि MDMarra ने पहले ही खोज लिया था)। दोनों कमांड इस cmdlet से शुरू होते हैं:

get-aduser

नीचे से गुजरते समय, याद रखें कि इस cmdlet के परिणाम में सभी AD उपयोगकर्ता शामिल हैं, -filterइसके बाद पैरामीटर में किसी भी चीज़ की परवाह किए बिना ।

अब दो हिस्सों को अलग करते हैं जो अलग हैं। पहले वाला:

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

...माध्यम

  1. "यह पता लगाएं कि विवरण विशेषता टेक्स्ट स्ट्रिंग" ऑटो "के बराबर कहाँ है । काम की तुलना के लिए, -eqऑपरेटर को" ऑटो "से तुलना करने में सक्षम होने के लिए एक स्ट्रिंग को वर्णन फ़ील्ड में मौजूद होने की आवश्यकता है । पूर्ण मानों को इससे हटा दिया जाता है। तुलना क्योंकि यह एक NULL को स्ट्रिंग मान से तुलना नहीं कर सकता है।
  2. की स्वतंत्र रूप से -eqफ़िल्टर पैरामीटर मुझे हर कोई देता है जो इसका परिणाम नहीं है (description -eq "auto"), जिसमें NULLs शामिल होगा, क्योंकि मूल cmdlet get-aduser, में सभी AD उपयोगकर्ता शामिल हैं। इसे -notऑपरेटर के साथ किसी भी चीज़ की तुलना करने की ज़रूरत नहीं थी । इसने आपको इसके अलावा सब कुछ दिया कि (description -eq "auto")फ़िल्टर के परिणाम क्या थे।

अपने उदाहरण में मान लें कि आपके पास 1 AD उपयोगकर्ता है, जिसका विवरण "ऑटो" के बराबर है, कुछ "ऑटो" के अलावा कुछ और NULL विवरण के साथ कुछ सौ हैं। कमांड लॉजिक के माध्यम से यह करना होगा:

  1. मुझे सभी AD उपयोगकर्ता (get-aduser) दें जहां विवरण "ऑटो" के बराबर है - 1 उपयोगकर्ता में परिणाम
  2. मुझे वे सभी AD उपयोगकर्ता दें जो आपने अभी मुझे नहीं दिए हैं - परिणाम कुछ और के साथ कुछ सौ हैं और कुछ सौ जो NULL हैं।

चूंकि इसे -notऑपरेटर के उपयोग से किसी भी चीज़ की तुलना करने की आवश्यकता नहीं थी , इसलिए परिणाम में NULL विवरण उपयोगकर्ता शामिल थे जिन्हें मूल get-adusercmdlet में कैप्चर किया गया था ।

दूसरी आज्ञा:

{description -ne "auto"}

...माध्यम

  1. "यह पता लगाएं कि विवरण विशेषता सटीक स्ट्रिंग" ऑटो "के बराबर नहीं है । फिर, काम की तुलना के लिए, एक स्ट्रिंग को -neऑपरेटर के लिए विवरण फ़ील्ड में मौजूद होने की आवश्यकता है ताकि वह" ऑटो "से तुलना कर सके। इसे इस तुलना से हटा दिया जाता है क्योंकि यह NULL की स्ट्रिंग मान से तुलना नहीं कर सकता है।

अपने उदाहरण में फिर से मान लें कि आपके पास 1 AD उपयोगकर्ता है, जिसका विवरण "ऑटो" के बराबर है, कुछ "ऑटो" के अलावा कुछ और NULL विवरण के साथ कुछ सौ हैं। कमांड लॉजिक के माध्यम से यह करना होगा:

  1. मुझे सभी AD उपयोगकर्ता दें, जहां विवरण "ऑटो" के बराबर नहीं है - उनके विवरण में "ऑटो" के अलावा कुछ और के साथ कुछ सौ उपयोगकर्ताओं में परिणाम। यह उपयोगकर्ताओं को NULL विवरण के साथ नहीं खींचता है क्योंकि यह NULL की किसी पाठ स्ट्रिंग से तुलना नहीं कर सकता है।

किसी भी तरह से दोनों आज्ञाओं के बीच का पूरा अंतर निश्चित रूप से गैर-सहज है।

इस आदेश का उपयोग करके आप NULL को "-और" के साथ इस तरह से भी पकड़ सकते हैं:

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

मैं सिंटैक्स पर 100% नहीं हूं क्योंकि मैं अभी इसका परीक्षण नहीं कर सकता हूं, और शायद इससे बेहतर तरीका भी है। जब यह सब टूट जाता है तो यह काफी हद तक एंटी-क्लाइमैटिक होता है और समझाने के लिए बहुत सारे टाइपिंग लेता है, लेकिन मैं विभिन्न ऑपरेटरों और बहुत सारे परीक्षण और त्रुटि का उपयोग करने से पहले इस तरह से अजीब सामान में चला गया हूं क्योंकि मैं सभी कैविटी को कभी याद नहीं कर सकता। कि हर एक का उपयोग करने के साथ जाना।

संदर्भ: http://technet.microsoft.com/en-us/library/hh847732.aspx :

तुलना संचालक

मूल्यों और परीक्षण स्थितियों की तुलना करने के लिए तुलना ऑपरेटरों (-eq, -ne, -gt, -lt, -le -ge) का उपयोग करें। उदाहरण के लिए, आप यह निर्धारित करने के लिए दो स्ट्रिंग मानों की तुलना कर सकते हैं कि क्या वे समान हैं।

तुलना ऑपरेटरों में मैच ऑपरेटर (-मैच, -नोटमैच) शामिल हैं, जो नियमित अभिव्यक्ति का उपयोग करके पैटर्न ढूंढते हैं; प्रतिस्थापित ऑपरेटर (-replace), जो इनपुट मानों को बदलने के लिए नियमित अभिव्यक्ति का उपयोग करता है; जैसे ऑपरेटरों (जैसे, -नोटल), जो वाइल्डकार्ड वर्णों (*) का उपयोग करके पैटर्न ढूंढते हैं; और संचालक ऑपरेटरों (में -notin, -contains, -notcontains), जो निर्धारित करते हैं कि एक संदर्भ सेट में एक परीक्षण मान दिखाई देता है या नहीं।

वे बिटवाइज़ ऑपरेटरों (-bAND, -bOR, -bXOR, -bNOT) को भी मानों में बिट पैटर्न में हेरफेर करने के लिए शामिल करते हैं।

अधिक जानकारी के लिए, about_Comparison_Operators देखें

लॉजिकल ऑपरेटर्स

सशर्त बयानों को एकल जटिल स्थिति से जोड़ने के लिए तार्किक ऑपरेटरों (-और, -or, -xor, -not;) का उपयोग करें । उदाहरण के लिए, आप दो अलग-अलग स्थितियों के साथ ऑब्जेक्ट फ़िल्टर बनाने के लिए एक तार्किक-और ऑपरेटर का उपयोग कर सकते हैं।

अधिक जानकारी के लिए, लगभग_Logical_Operators देखें।


सुनिश्चित करने के लिए अच्छा अवलोकन, लेकिन -n और -ऑनलाइन ऑपरेटरों की तरह शून्य मानों को बाहर क्यों रखा गया है? यह असली सिर खरोंच है। मैं सोच रहा था कि क्या इसके डिजाइन से कुछ गूढ़ है। शुद्ध कल्पना या यदि यह एक बग या अप्रत्याशित व्यवहार है?
एमडीएमरा

रुको, बस और अधिक बारीकी से पढ़ें। ऐसा लगता है कि वे केवल तार की तुलना करते हैं और अशक्त विशेषताएँ वास्तव में अशक्त हैं और खाली स्ट्रिंग नहीं हैं। दिलचस्प अगर अनपेक्षित है।
एमडीएमरा

0

खोजते समय इस पुराने प्रश्न को जोड़ना

नकारात्मक मिलान जैसे -ne या -notlike के साथ -Filter का उपयोग रिक्त नल मानों को छोड़कर करता है। उन्हें शामिल किए जाने के लिए आप भी स्पष्ट रूप से उपयोग करते हुए मैच के लिए की जरूरत है '*' -notlike रूप -eq '' और -eq $ शून्य वैध फिल्टर नहीं हैं। ध्यान दें कि यह एक क्विक है -फिल्टर के साथ, डायरेक्ट -LdapFilter का उपयोग करते हुए नेगेटिव मैच को खाली मान देता है।

नकारात्मक के साथ मल्टी मैच का फ़िल्टर और LdapFilter उदाहरण यहां दिया गया है:

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

Get-ADUser -LdapFilter '(&(mail=*example*)(!description=example))'
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.