سؤال

هناك بضعة أسئلة مشابهة لهذا السؤال حول تجاوز سعة المكدس ولكنها ليست متماثلة تمامًا.

أرغب في فتح أو إنشاء مجموعة محلية على جهاز كمبيوتر يعمل بنظام Win XP وإضافة أعضاء إليها ومجال وحسابات محلية ومعروفة.أريد أيضًا التحقق مما إذا كان المستخدم عضوًا بالفعل حتى لا أقوم بإضافة نفس الحساب مرتين، ومن المفترض أن أحصل على استثناء.

لقد بدأت حتى الآن في استخدام كائن DirectoryEntry مع الملف WinNT:// مزود.كل هذا يسير على ما يرام ولكنني عالق في كيفية الحصول على قائمة بأعضاء المجموعة؟

هل يعرف أحد كيف يفعل هذا؟أو تقديم حل أفضل من استخدام DirectoryEntry؟

هل كانت مفيدة؟

المحلول

حسنًا، لقد استغرق الأمر بعض الوقت، للعبث بحلول مختلفة ولكن الحل الذي يناسب سؤالي الأصلي هو موضح أدناه.لا يمكنني الحصول على كائن DirectoryEntry للوصول إلى أعضاء مجموعة محلية باستخدام الأساليب "القياسية"، والطريقة الوحيدة التي يمكنني من خلالها الحصول على تعداد الأعضاء كانت باستخدام طريقة الاستدعاء لاستدعاء طريقة أعضاء الكائنات الأصلية.

using(DirectoryEntry groupEntry = new DirectoryEntry("WinNT://./Administrators,group"))
{
    foreach(object member in (IEnumerable) groupEntry.Invoke("Members"))
    {
        using(DirectoryEntry memberEntry = new DirectoryEntry(member))
        {
            Console.WriteLine(memberEntry.Path);
        }
    }
}

لقد استخدمت أيضًا أسلوبًا مشابهًا لإضافة أعضاء وإزالتهم من المجموعة المحلية.

نأمل أن يساعد هذا شخصًا آخر أيضًا.كيث.

يحرر بواسطة تيم:تمت إضافة نسخة VB.Net

Public Function MembersOfGroup(ByVal GroupName As String) As List(Of DirectoryEntry)
    Dim members As New List(Of DirectoryEntry)
    Try
        Using search As New DirectoryEntry("WinNT://./" & GroupName & ",group")
            For Each member As Object In DirectCast(search.Invoke("Members"), IEnumerable)
                Dim memberEntry As New DirectoryEntry(member)
                members.Add(memberEntry)
            Next
        End Using
    Catch ex As Exception
        MessageBox.Show(ex.ToString)
    End Try
    Return members
End Function

نصائح أخرى

يوفر Microsoft .NET Framework مكتبة قياسية للعمل مع Active Directory: مساحة الاسم System.DirectoryServices في System.DirectoryServices.dll.

توصي Microsoft باستخدام فئتين رئيسيتين من مساحة الاسم System.DirectoryServices: إدخال الدليل و باحث الدليل.في معظم الحالات، يكفي استخدام فئة DirectorySearcher فقط.

تحديث:لقد اختبرت ذلك على الجهاز الخاص بي - وهو يعمل.لكن ربما أسيء فهم سؤالك.

هنا مثال من ممتاز مقالة مشروع الكود:

احصل على قائمة بالمستخدمين الذين ينتمون إلى مجموعة إعلانية معينة

using System.DirectoryServices;

ArrayList GetADGroupUsers(string groupName)
{    
   SearchResult result;
   DirectorySearcher search = new DirectorySearcher();
   search.Filter = String.Format("(cn={0})", groupName);
   search.PropertiesToLoad.Add("member");
   result = search.FindOne();

   ArrayList userNames = new ArrayList();
   if (result != null)
   {
       for (int counter = 0; counter < 
          result.Properties["member"].Count; counter++)
       {
           string user = (string)result.Properties["member"][counter];
               userNames.Add(user);
       }
   }
   return userNames;
}

ويجب أن تكون قادرة على العثور على هذه المعلومات داخل السمة "member" على DirectoryEntry التي تمثل المجموعة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top