c# اقرأ مجموعات تفويض المستخدم من أكتيف ديركتوري




.net active-directory (2)

في نظامنا نحن قراءة مجموعات أمان المستخدم من "أكتيف ديركتوري" بطريقتين مختلفتين قليلا. في إحدى الحالات تفتقد قائمة المجموعات التي يتم إرجاعها بواسطة أد المجموعات المحلية للنطاق. الاستجابة من جيتاوثوريزدروسس () تعتمد على برينسيبالكونتيكست المستخدمة. في السيناريوهات الفاشلة سوف جيتأوثوريزاتيونروبس () عودة المجموعات العالمية فقط. النتيجة مفقودة جميع المجموعات المحلية المجال من أد. يمكن لأي شخص يرجى شرح لماذا؟

فشل الحل:

PrincipalContext ctx = new PrincipalContext(ContextType.Domain, "our.domain.net");

var userPrincipal = UserPrincipal.FindByIdentity(ctx, IdentityType.UserPrincipalName, "userB");

PrincipalSearchResult<Principal> groups = userPrincipal.GetAuthorizationGroups();

في هذه الحالة يتم تنفيذ العملية من قبل "وسيرا". "وسيرا" عضو في المجال "our.domain.net". "وسيرا" هو المستخدم نفسه المستخدم المحدد تحديدا في حل العمل. يجب أن يكون برينسيبالكونتيكست بسبب أن تكون مطابقة ل برينسيبالكونتيكست في حل العمل. استجابة من جيتوثوريزدروسغروبس () في هذا المجال تفوت المجموعات المحلية من أد.

حل العمل:

PrincipalContext ctx = new PrincipalContext(ContextType.Domain, "our.domain.net", "UserA", "PasswordA");

var userPrincipal = UserPrincipal.FindByIdentity(ctx, IdentityType.UserPrincipalName, "userB");

PrincipalSearchResult<Principal> groups = userPrincipal.GetAuthorizationGroups();

في هذه الحالة يتم تعريف المستخدم المتصل تحديدا باستخدام اسم المستخدم وكلمة المرور عند إنشاء السياق الرئيسي. في هذه الحالة يقوم أد بإرجاع كافة المجموعات التي يكون المستخدم عضوا فيها. هذا هو السلوك الذي أود أن أراه من الحل الفاشل كذلك. في بعض الحالات ليس لدي كلمة مرور المستخدم من وسيرا ولهذا السبب الحل العمل ليس خيارا.

الرجاء مساعدتي على فهم سبب فشل الحل الفاشل في إعادة جميع المجموعات التي يكون المستخدم عضوا فيها.


"يفتقد المجال المجموعات المحلية من أد" لأنك ربما يتم تكرار groups الناتجة مع حلقة NoMatchingPrincipalException وكنت تحصل على استثناء NoMatchingPrincipalException واحدة من المجموعات التي لا يملك المستخدم الوصول للقراءة وعند هذه النقطة أنه يتوقف عن التكرار، فشل الحصول على بقية المجموعات.

كحل يمكنك استخدام المكرر التالي (رمز وراء هيكل foreach ) للحصول على كل ما تبقى من المجموعات:

var enumerator = groups.GetEnumerator();                
while (enumerator.MoveNext())
{
    try
    {
        var e = enumerator.Current;
        listView1.Items.Add(e.Name);
    }
    catch (NoMatchingPrincipalException)
    {
    }
}

لقد وجدنا في النهاية المشكلة. اتضح نوي بيينغ مشكلة الترميز على الإطلاق. كان السبب في سلوك غريب من مستوى المجال مجنون في "أكتيف ديركتوري".

كان يجب تعيين مستوى النطاق على "المستوى الوظيفي لعام 2003"

الآن كل شيء يعمل كما هو متوقع.





active-directory