পাওয়ার শেলের এই এডি ফিল্টারটি দিয়ে হ্যাক কী চলছে?


9

আমি সম্প্রতি এই উত্তরটি লিখেছি এবং আকর্ষণীয় কিছুতে হোঁচট খেয়েছি।

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

এবং

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

প্রথম কমান্ডের সাথে প্রত্যাশিত মানটি ফেরত দেওয়ার সাথে একই তথ্যের বিপরীতে চালানো হলে দুটি খুব আলাদা জিনিস ফেরত দিন। এটা প্রথম নজরে মনে হয় যে বর্ণনার ঘরে একটি নাল মান ব্যবহারকারী না দ্বিতীয় কমান্ড ম্যাচ হিসাবে ফিরে, যদিও শূন্য পরিষ্কারভাবে "অটো" সমান না।

আড্ডায় দু'জন লোক এটি দেখে এবং যাচাই করেছে যে আমি পাগল নই। এখানে কি হচ্ছে?


1
আকর্ষণীয় যে এটি কোথাও-অবজেক্টের মাধ্যমে পাইপ করা এবং ফিল্টার প্রয়োগ করে যা উপরে কাজ করে না। get-aduser -filter * -প্রাপ্তির বিবরণ | ? {$ _। বিবরণ -ne "অটো"} | পরিমাপ
মাইকে

@Mike হ্যাঁ, এই আচরণকে উপস্থিত হতে পারে -neতুলনা অপারেটর মধ্যে-Filter ব্লক শুধুমাত্র। বিশেষত, যখন তুলনার ইনপুট মান হয় $null
jscott

1
পছন্দ এবং অপছন্দ একই কাজ করে বলে মনে হচ্ছে। {বিবরণ -নাট "" কিছু "work কাজ করে না, তবে {-নাট (বিবরণ-পছন্দ" কিছু ")} করে। এছাড়াও যেটি কাজ করে তা মূল্যায়নের জন্য যথেষ্ট সময় নেয়। ভাঙা মতো এটি যেমন হওয়া উচিত সমস্ত বস্তুর মূল্যায়ন করে না।
মাইক 17

@ মাইক ঠিক আছে আমি প্রকৃতপক্ষে এটি ব্যবহার করে হোঁচট -notlikeখেয়েছি তবে -neআমি যা বুঝতে চাইছিলাম তা পাচ্ছি না তা বুঝতে পেরে স্যুইচ করেছিলাম। টিবিএইচ, আমি ভুলে গিয়েছিলাম এমনকি আপনি এটি উল্লেখ না করা পর্যন্ত চেষ্টা করেছি - তবে আমি এটি পুনরুত্পাদনও করতে পারি।
MDMarra

2
কেবল একটি চিন্তাভাবনা কিন্তু সম্ভবত পিওএসএইচ -eq/ ক্লজটি -neএসকিউএল =/ এর মতো আচরণ করার চেষ্টা করে <>? এসকিউএল-এ, foo = NULLএবং foo <> NULLসর্বদা মিথ্যা ফিরিয়ে দেবে, কারণ NULL 'অতুলনীয়' - কেবলমাত্র foo IS NULLএবং foo IS NOT NULLবিশেষ অপারেটররা কাজ করবে। আচরণটি অবশ্যই PoSH- তে সমান হতে হবে, যেখানে আপনার -not (foo -eq "bar")ফিল্টারটি তার জন্য ফিরে আসা সমস্ত কিছু (foo -eq "bar")ফিরিয়ে দেবে $false, যা foo -eq $nullকরবে। পরিবর্তে, কীভাবে if (!foo -or foo -ne "bar")(সমতুল্য এসকিউএল foo IS NULL OR foo <> 'bar')?
jimbobmcgee

উত্তর:


4

উভয়ের মধ্যে মূল পার্থক্যটি হ'ল প্রথম আদেশটি সমস্ত ফলাফল পেতে মানের সাথে সরাসরি তুলনা জড়িত না এবং দ্বিতীয় কমান্ডটি করে। প্রথম কমান্ডে ন্যূনএলএল ফলাফল অন্তর্ভুক্ত রয়েছে এবং দ্বিতীয়টি নয় (এমডিমারা ইতিমধ্যে আবিষ্কার করেছেন)। উভয় কমান্ড এই সেন্টিমলেট দিয়ে শুরু:

get-aduser

নীচের দিক দিয়ে যাওয়ার সময়, মনে রাখবেন যে এই সেমিডলেটের ফলাফলগুলিতে -filterপ্যারামিটারের পরে অন্য কোনও কিছু নির্বিশেষে সমস্ত এডি ব্যবহারকারীদের অন্তর্ভুক্ত করা হবে।

এখন আসুন দুটি পৃথক পৃথক অংশ ভাঙ্গা যাক। প্রথমটি:

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

... মানে

  1. "চিহ্নিত করুন যেখানে বর্ণনা বৈশিষ্ট্যটি পাঠ্য স্ট্রিং" অটো "এর সমান হয় work কাজের তুলনা করার জন্য -eqঅপারেটরটিকে এটি" স্বয়ং "এর সাথে তুলনা করতে সক্ষম হওয়ার জন্য বর্ণনা ক্ষেত্রে একটি স্ট্রিং থাকা প্রয়োজন N নূন্য মানগুলি এ থেকে বাদ পড়েছে তুলনা যেহেতু এটি কোনও নুলকে একটি স্ট্রিংয়ের সাথে তুলনা করতে পারে না।
  2. স্বাধীনভাবে -eqফিল্টার প্যারামিটার আমাকে এমন সমস্ত কিছু দেয় (description -eq "auto")যা ফলাফল হয় না , যার মধ্যে NULL অন্তর্ভুক্ত থাকে, কারণ মূল সেমিডলেট, get-aduserসমস্ত AD ব্যবহারকারীকে অন্তর্ভুক্ত করে। -notঅপারেটরের সাথে এটি অন্য কোনও কিছুর সাথে তুলনা করার দরকার নেই । এটি আপনাকে (description -eq "auto")ফিল্টারটির ফলাফল কী ছিল তা সবেমাত্র আপনাকে সবকিছু দিয়েছে ।

আপনার উদাহরণ হিসাবে ধরা যাক আপনার 1 এডি ব্যবহারকারী রয়েছে যার বর্ণনা "অটো" এর সমান, "অটো" ব্যতীত অন্য কিছু সহ কয়েকশ এবং নুল বর্ণনার সাথে কয়েক শ ' কমান্ড যুক্তি দিয়ে পদক্ষেপটি এটি করবে:

  1. আমাকে সমস্ত এডি ব্যবহারকারী (গেট-অ্যাডুসার) দিন যেখানে বিবরণটি "অটো" এর সমান হয় - ফলাফল 1 জন ব্যবহারকারী
  2. সমস্ত এডি ব্যবহারকারীদের আমাকে দিন যা আপনি কেবল আমাকে দিয়েছেন - ফলাফলটি হ'ল কয়েকশত কিছু এবং কয়েকশত শূন্য রয়েছে UL

যেহেতু -notঅপারেটরটি ব্যবহার করে এটি অন্য কোনও কিছুর সাথে তুলনা করার দরকার নেই , get-aduserফলাফলটিতে মূল সিএমডিলেটে বন্দী নুল বর্ণনার ব্যবহারকারীদের অন্তর্ভুক্ত ছিল ।

দ্বিতীয় আদেশ:

{description -ne "auto"}

... মানে

  1. "চিহ্নিত করুন যেখানে বর্ণন বৈশিষ্ট্যটি সঠিক স্ট্রিং" অটো "এর সাথে সমান হয় না , আবার, কাজের তুলনা করার জন্য -neঅপারেটরটিকে এটি" স্বয়ং "এর সাথে তুলনা করতে সক্ষম হওয়ার জন্য বিবরণ ক্ষেত্রে একটি স্ট্রিং থাকা প্রয়োজন N নূন্য মানগুলি এই তুলনা থেকে বাদ দেওয়া হয়েছে কারণ এটি কোনও NUL কে স্ট্রিংয়ের সাথে তুলনা করতে পারে না।

আপনার উদাহরণে আবার ধরুন আপনার 1 এডি ব্যবহারকারী রয়েছে যার বর্ণনাকে "অটো" এর সমান, "অটো" ব্যতীত অন্য কিছু সহ কয়েক শত এবং নুআল বর্ণনার সাথে কয়েক শ 'কিছু রয়েছে। কমান্ড যুক্তি দিয়ে পদক্ষেপটি এটি করবে:

  1. আমাকে সমস্ত এডি ব্যবহারকারী দিন যেখানে বিবরণটি "অটো" এর সমান নয় - কয়েক শ'জন ব্যবহারকারী তাদের বিবরণে "অটো" ব্যতীত অন্য কিছু দিয়ে ফলাফল পান। এটি ব্যবহারকারীদের নুল বর্ণনার সাথে টানতে পারে না কারণ এটি কোনও পাঠ্য স্ট্রিংয়ের সাথে কোনও NULL তুলনা করতে পারে না।

দুটি কমান্ডের মধ্যে যে কোনওভাবেই পুরো পার্থক্যটি অবশ্যই স্বজ্ঞাত নয়।

এই কমান্ডটি ব্যবহার করে আপনি এখানে "- এবং" এর মতো NUL গুলি ধরতে সক্ষম হবেন:

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

আমি সিনট্যাক্সে 100% নই যেহেতু আমি এখনই এটি পরীক্ষা করতে পারছি না, এবং এটির চেয়ে আরও ভাল উপায় সম্ভবত আছে। যখন এটি ভেঙে গেছে তখন এটি মোটামুটি বিরোধী জলবায়ু এবং ব্যাখ্যা করার জন্য প্রচুর টাইপিং নিয়েছিল, তবে আমি বিভিন্ন অপারেটর ব্যবহার করার আগে এই জাতীয় অদ্ভুত জিনিস এবং প্রচুর ট্রায়াল এবং ত্রুটি চালিয়েছি যেহেতু আমি কখনই সমস্ত সাবধানবাণী মনে করতে পারি না যে প্রতিটি ব্যবহার করে বরাবর যেতে।

তথ্যসূত্র: http://technet.microsoft.com/en-us/library/hh847732.aspx :

তুলনা অপারেটর

মান এবং পরীক্ষার অবস্থার তুলনা করতে তুলনামূলক অপারেটরগুলি (-eq, -ne, -gt, -lt, -le, -ge) ব্যবহার করুন। উদাহরণস্বরূপ, আপনি দুটি স্ট্রিং মানগুলি সমান কিনা তা নির্ধারণ করতে তুলনা করতে পারেন।

তুলনা অপারেটরগুলির মধ্যে ম্যাচ অপারেটরগুলি (-ম্যাচ,-ননমেচ) অন্তর্ভুক্ত থাকে, যা নিয়মিত প্রকাশের সাহায্যে নিদর্শনগুলি খুঁজে পায়; প্রতিস্থাপন অপারেটর (-প্লেস), যা ইনপুট মান পরিবর্তন করতে নিয়মিত এক্সপ্রেশন ব্যবহার করে; পছন্দসই অপারেটরগুলি (-Like, -notlike), যা ওয়াইল্ডকার্ড অক্ষর (*) ব্যবহার করে নিদর্শনগুলি খুঁজে পায়; এবং কন্টেন্ট অপারেটরগুলি (ইন, -নোটিন, -কন্টেন্টস, -নোটকন্টেনস) যা কোনও নির্ধারিত সেটে পরীক্ষার মান উপস্থিত হয় কিনা তা নির্ধারণ করে।

তারা মানগুলিতে বিট নিদর্শনগুলি পরিচালনা করতে বিটওয়াইস অপারেটরগুলি (-bAND, -bOR, -bXOR, -bNOT) অন্তর্ভুক্ত করে।

আরও তথ্যের জন্য, সম্পর্কে_পরিষ্কার_ অপারেটর দেখুন

লজিক্যাল অপারেটর

একক জটিল শর্তসাপেক্ষে শর্তাধীন বিবৃতি সংযোগ করতে লজিকাল অপারেটরগুলি (-আর, -অর, -অক্সর, -নট,!) ব্যবহার করুন । উদাহরণস্বরূপ, আপনি দুটি ভিন্ন শর্ত সহ একটি অবজেক্ট ফিল্টার তৈরি করতে লজিক্যাল-এবং অপারেটর ব্যবহার করতে পারেন।

আরও তথ্যের জন্য, প্রায়_ লজিক্যাল_ অপারেটর দেখুন।


নিশ্চিতরূপে ভাল ওভারভিউ, তবে কেন নন মানগুলি এক এবং-নয় অপারেটরগুলি থেকে বাদ দেওয়া হয়েছে? এটাই আসল মাথা স্ক্র্যাচার। আমি ভাবছি যে এটির ডিজাইনটির কোনও কিছু রহস্যজনক আছে। নেট স্পেস ব্যাখ্যা বা এটি যদি কোনও বাগ বা অপ্রত্যাশিত আচরণ হয়?
MDMarra

অপেক্ষা করুন, আরও নিবিড়ভাবে পড়ুন। দেখে মনে হচ্ছে তারা কেবল স্ট্রিংগুলির তুলনা করে এবং নাল বৈশিষ্ট্যগুলি আসলে নাল এবং খালি স্ট্রিং নয়। আকর্ষণীয় যদি অনিশ্চিত হয়।
MDMarra

0

অনুসন্ধান করার সময় এই পুরানো প্রশ্নের সাথে যুক্ত হওয়া:

নেতিবাচক ম্যাচ যেমন -ne বা -নাটকের সাথে ফিল্টার ব্যবহার করে খালি নাল মান সহ ফলাফলগুলি বাদ দেয়। তাদের অন্তর্ভুক্ত করার জন্য আপনাকে অবশ্যই স্পষ্টভাবে মেলানো দরকার - ' Like' হিসাবে -Eq '' হিসাবে ব্যবহার না করে এবং -eq $ NULL বৈধ ফিল্টার নয়। সরাসরি -LdapFilter খালি মানগুলি নেতিবাচক ম্যাচটি ব্যবহার করে এটি-ফিল্টার সহ একটি স্পর্শকাহিনী Note

Negativeণাত্মক সহ একাধিক ম্যাচের একটি ফিল্টার এবং এলডিপ ফিল্টার উদাহরণ:

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

Get-ADUser -LdapFilter '(&(mail=*example*)(!description=example))'
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.