সক্রিয় ডিরেক্টরি থেকে আমি কীভাবে ব্যবহারকারীর একটি তালিকা পেতে পারি?


109

সক্রিয় ডিরেক্টরি থেকে আমি কীভাবে ব্যবহারকারীর একটি তালিকা পেতে পারি? ব্যবহারকারীর নাম, প্রথম নাম, পদবি রাখার উপায় আছে? আমি একটি অনুরূপ পোস্ট দেখেছি যেখানে এটি ব্যবহৃত হয়েছিল:

 PrincipalContext ctx = new PrincipalContext(ContextType.Domain, "YOURDOMAIN");

অ্যাক্টিভ ডিরেক্টরি সহ আমি কখনও কিছুই করি নি তাই আমি সম্পূর্ণ হারিয়ে গিয়েছি। কোন সাহায্যের ব্যাপকভাবে প্রশংসা হবে!


3
.NET 3.5
marc_s

দেখে মনে হচ্ছে @ মার্ক_স এর নিবন্ধ সংরক্ষণাগারভুক্ত হয়েছে, এখানে একটি আপডেট লিংক আছে
জেবি।

@মার্ক_স আমি স্যার পড়তে পছন্দ করব তবে লিঙ্কটি একটি মৃত। আমি এই ব্লগস.এমএসএনএন.এম.সাইক্রোসফট.কম / এমএসডিএনমাগাজাইন / ২০০৮/01/16/ … চেষ্টা করেছি কিন্তু এমনকি এই নিবন্ধটির লিঙ্কগুলি মাইক্রোসফট ম্যাগাজিনের জন্য একটি জিনগত পৃষ্ঠা বাড়ে
ম্যালকম সালভাদোর

1
@ মালকি.কিড আমি নিবন্ধটিতে আমার পথ খুঁজে পেয়েছি। এই প্রশ্নের প্রথম মন্তব্যের লিঙ্কটি ব্যবহার করুন এবং জানুয়ারী ২০০ 2008 সংখ্যাটি ডাউনলোড করুন । পড়ার আগে এক্সপ্লোরার বৈশিষ্ট্য পৃষ্ঠাতে chm-file অবরোধ মুক্ত করতে ভুলবেন না।
ওয়ানওয়ার্ল্ড

উত্তর:


229

আপনি যদি অ্যাক্টিভ ডিরেক্টরিতে নতুন হন, আমি পরামর্শ দিচ্ছি যে আপনার সক্রিয় ডিরেক্টরিটি কীভাবে প্রথমে ডেটা সঞ্চয় করে তা বোঝা উচিত।

অ্যাক্টিভ ডিরেক্টরি আসলে একটি এলডিএপি সার্ভার। এলডিএপি সার্ভারে সঞ্চিত বস্তুগুলি শ্রেণিবদ্ধভাবে সংরক্ষণ করা হয়। এটি আপনার ফাইল সিস্টেমে আপনার ফাইলগুলি সংরক্ষণ করার মতোই। এ কারণেই এটি নাম ডিরেক্টরি সার্ভার এবং অ্যাক্টিভ পেয়েছে ডিরেক্টরি

অ্যাক্টিভ ডিরেক্টরিতে থাকা পাত্রে এবং অবজেক্টগুলি একটি দ্বারা নির্দিষ্ট করা যেতে পারে distinguished name। বিশিষ্ট নামটি এরকম CN=SomeName,CN=SomeDirectory,DC=yourdomain,DC=com। একটি traditionalতিহ্যগত সম্পর্কযুক্ত ডাটাবেসের মতো, আপনি একটি এলডিএপি সার্ভারের বিরুদ্ধে কোয়েরি চালাতে পারেন। একে এলডিএপি কোয়েরি বলা হয়।

.NET এ LDAP ক্যোয়ারী চালানোর বেশ কয়েকটি উপায় রয়েছে। আপনি ব্যবহার করতে পারেন DirectorySearcher থেকে System.DirectoryServicesবা SearchRequest থেকে System.DirectoryServices.Protocol

আপনার প্রশ্নের জন্য, যেহেতু আপনি ব্যবহারকারীর প্রধান বস্তু বিশেষভাবে এটি জিজ্ঞাসা করা হয়, আমার মনে হয় সবচেয়ে স্বজ্ঞাত উপায় ব্যবহার করা PrincipalSearcher থেকে System.DirectoryServices.AccountManagement। গুগল থেকে আপনি সহজেই প্রচুর বিভিন্ন উদাহরণ খুঁজে পেতে পারেন। এখানে একটি নমুনা যা আপনি যা চাইছেন ঠিক তা করছে।

using (var context = new PrincipalContext(ContextType.Domain, "yourdomain.com"))
{
    using (var searcher = new PrincipalSearcher(new UserPrincipal(context)))
    {
        foreach (var result in searcher.FindAll())
        {
            DirectoryEntry de = result.GetUnderlyingObject() as DirectoryEntry;
            Console.WriteLine("First Name: " + de.Properties["givenName"].Value);
            Console.WriteLine("Last Name : " + de.Properties["sn"].Value);
            Console.WriteLine("SAM account name   : " + de.Properties["samAccountName"].Value);
            Console.WriteLine("User principal name: " + de.Properties["userPrincipalName"].Value);
            Console.WriteLine();
        }
    }
}
Console.ReadLine();

নোট করুন যে AD ব্যবহারকারী অবজেক্টে, অনেকগুলি বৈশিষ্ট্য রয়েছে। বিশেষত, givenNameআপনাকে দিবে First Nameএবং snআপনাকে দেবে Last Name। ব্যবহারকারীর নাম সম্পর্কে। আমি মনে করি আপনি ব্যবহারকারী লগনের নাম বোঝাতে চেয়েছিলেন। নোট করুন যে AD ব্যবহারকারী অবজেক্টে দুটি লগন নাম রয়েছে। একটি samAccountName, যা প্রাক উইন্ডোজ 2000 ব্যবহারকারী লগন নাম হিসাবেও পরিচিত। userPrincipalNameউইন্ডোজ 2000 এর পরে সাধারণত ব্যবহৃত হয়।


2
সার্ভারে ডোমেন না থাকলে কী হবে

এডি গ্রুপ থেকে ব্যবহারকারীদের তালিকা তৈরি করতে আপনি একই কোডটি কীভাবে ব্যবহার করবেন?
n জোশি

এই ডিরেক্টরিটি কেবলমাত্র সেই ডিরেক্টরিতে যাদের ইমেল ঠিকানা বরাদ্দ করা হয়েছে তাদের সংকীর্ণ করার জন্য এই পদ্ধতিটি ব্যবহার করার কোনও উপায় আছে?
এরিড্ডার 101

কিছু মনে করবেন না, আমি এটি বুঝতে পেরেছি। if (((UserPrincipal)result).EmailAddress != null)আমার তালিকায় ফলাফল যুক্ত করার আগে আমাকে কেবল যুক্ত করতে হয়েছিল।
এরিডিডার 101

2
এবং যদি বর্তমান কম্পিউটারটি ডোমেনের সাথে না থাকে?
মার্কাস

23

আপনি যদি y সক্রিয় অ্যাকাউন্টগুলি ফিল্টার করতে চান তবে এটি হার্ভির কোডে যুক্ত করুন:

 UserPrincipal userPrin = new UserPrincipal(context);
 userPrin.Enabled = true;

প্রথম ব্যবহারের পরে। তারপর যোগ

  searcher.QueryFilter = userPrin;

সব খুঁজে আগে। এবং এটি আপনার সক্রিয় হওয়া উচিত।


আমি মনে করি না যে searcher.QueryFilter = userPrin;আমরা ইতিমধ্যে আরম্ভের সময় প্রধান সন্ধানকারীর কাছে ব্যবহারকারীর অধ্যক্ষটি প্রেরণ করেছি, তবে অন্যথায় কেবল সক্রিয় ব্যবহারকারীদের ফিল্টারিংয়ের পরামর্শের জন্য ধন্যবাদ!
অ্যান্ড্রে

1
হ্যাঁ, আন্দ্রে ঠিক বলেছেন তাই মূলত বিবৃতিটি ব্যবহার করে দ্বিতীয়টি এই সম্পত্তি যুক্ত করে প্রতিস্থাপন করা যেতে পারে:using (var searcher = new PrincipalSearcher(new UserPrincipal(context){ Enabled = true }))
মার্কো জোভানভ

তবে আমি ভেবেছিলাম Enabledপ্রথমে কোনও মান থাকলে আপনাকে পরীক্ষা করতে হবে :if (userPrincipal.Enabled.HasValue)
জনবি

4

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

আপনার যা প্রয়োজন তার উপর নির্ভর করে আপনাকে ডিরেক্টরীএন্ট্রিতে কাস্ট করার প্রয়োজন নাও হতে পারে তবে কিছু বৈশিষ্ট্য ইউজারপ্রিন্সিপাল থেকে পাওয়া যায় না।

using (var searcher = new PrincipalSearcher(new UserPrincipal(new PrincipalContext(ContextType.Domain, Environment.UserDomainName))))
{
    List<UserPrincipal> users = searcher.FindAll().Select(u => (UserPrincipal)u).ToList();
    foreach(var u in users)
        {
            DirectoryEntry d = (DirectoryEntry)u.GetUnderlyingObject();
            Console.WriteLine(d.Properties["GivenName"]?.Value?.ToString() + d.Properties["sn"]?.Value?.ToString());
        }
}

'ই' দয়া করে কি?
Fandango68

1
ধন্যবাদ, এটি কখনই লক্ষ্য করেনি। আমি এটি পরিবর্তন করেছি, "ইউ" হওয়ার কথা ছিল। সম্পত্তিটি অনুপস্থিত থাকলে নাল মানগুলি হ্যান্ডেল করতে আমিও যুক্ত করেছি?
জর্দান

1

সিস্টেমটি অন্তর্ভুক্ত করুন irectডাইরেক্টরি সার্ভিস.ডিল, তারপরে নীচের কোডটি ব্যবহার করুন:

DirectoryEntry directoryEntry = new DirectoryEntry("WinNT://" + Environment.MachineName);
string userNames="Users: ";

foreach (DirectoryEntry child in directoryEntry.Children)
{
    if (child.SchemaClassName == "User")
    {
        userNames += child.Name + Environment.NewLine   ;         
    }

}
MessageBox.Show(userNames);

1
@ ফানডাঙ্গো 68: এলওএল, হ্যাঁ এটি !!! System.Windows. Forms.MessageBox.Show (ex.Message + ex.StackTrace);
ঝোলম্যান
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.