غير قابل للرسالة غير قابل للرسالة مع Groupprincipal و SAM PrincipalContext

StackOverflow https://stackoverflow.com/questions/2086806

  •  21-09-2019
  •  | 
  •  

سؤال

أحاول إنشاء مدير مثل هذا:

PrincipalContext pc = new PrincipalContext(ContextType.Machine);
GroupPrincipal group = new GroupPrincipal(pc);

group.Name = "Some Group Name";
group.Description = "Some Group Name Description";

group.Save();

ومع ذلك ، عند تنفيذ الرمز ، أحصل على رسالة الاستثناء التالية:

System.DirectoryServices.AccountManagement: الخاصية غير صالحة لهذا النوع من المتجر.

اذا انا لاتفعل تعيين Description الخاصية ، الرمز أعلاه يعمل بشكل جيد تمامًا ، فقط ليس لديه وصف لمجموعة.

أفعل شيئا خاطئا؟

شكرا لك مقدما.

تعديل:أعتقد أنني وجدت عملية عمل لهذا (لأي شخص ربما يهتم). يمكن إنشاء مجموعة بنفس الطريقة المذكورة أعلاه:

PrincipalContext pc = new PrincipalContext(ContextType.Machine);
GroupPrincipal group = new GroupPrincipal(pc);
group.Save();

الآن يمكنك إنشاء ملف DirectoryEntry وربطها بالمجموعة التي تم إنشاؤها حديثًا مثل هذا:

string path = "WinNT://" + machineName + "/" + group.SamAccountName;
DirectoryEntry dEntry = new DirectoryEntry(path);

يتيح ذلك الوصول إلى خصائص تلك المجموعة ، لكن المجموعة التي كنت مهتمًا بها هي الوصف ، لذلك:

dEntry.Properties["description"].Add("Some Decription");
dEntry.CommitChanges();

وينبغي أن تفعل ذلك.

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

المحلول

الجواب إعادة كتابة

لقد حصلت على إجابتك ، لكنك قد لا تحبها حقًا. المعلومات الموجودة على الإنترنت نادرة ، ولكن في الكود ، يمكن شرحها:

  • عند إنشاء الخاص بك Groupprincipal, ، أ سياق يضاف إليه. هذا السياق داخليًا من النوع المخفي: SamstorectX ، والذي يرث من نوع مجردة من نوع storectx ؛
  • كل خاصية على groupprincipal التي تتصل بها ستتصل بـ ISValidProperty ، وهو عضو داخلي في SamstorectX ؛
  • ومع ذلك ، فإنه لا يفعل ذلك لخاصية الاسم ؛
  • داخل SamstorectX ، هناك قطعة من الكود تبدو على النحو التالي (إخراج عاكس):

    internal override bool IsValidProperty(Principal p, string propertyName)
    {
        ObjectMask none = ObjectMask.None;
        if (!ValidPropertyMap.TryGetValue(propertyName, out none))
        {
            return false;
        }
        if ((MaskMap[p.GetType()] & none) <= ObjectMask.None)
        {
            return false;
        }
        return true;
    }
    
  • انظر عن كثب إلى هذا الرمز (استغرق الأمر مني لحظة) وستكتشف الخطأ. الخط يقارن العلم قليلا none سيؤدي استخدام ومربلي دائمًا إلى أن يؤدي إلى ObjectMASK.NONE. الثاني إذا كان هناك إحالة دائما صحيح او صادق.
  • رمز الاتصال (تسوية الخاصية الوصف) يلقي استثناء عندما تُرجع هذه الطريقة خطأ.

أعتقد أن هذا خطأ في مكتبة Microsoft. يحدث فقط مع Samstorectx. ربما يكون ذلك عن قصد ، ولكن نظرًا لأن الكود موجود ولكنه يعود دائمًا يجعلني أعتقد أن المبرمجين يعتزمون استخدام OR-Operator بدلاً من ذلك. التحقق من النتائج التي توصلت إليها مع خصائص أخرى مثل DisplayName يرمي نفس الاستثناء كما هو متوقع.

يمكنك الاتصال بـ Microsoft حول هذا الأمر وإظهار هذا الموضوع. لم أتحقق من Betas of .NET 4.0 والتي قد تظهر بشكل مختلف. يمكنك التحقق من ذلك بنفسك عن طريق تنزيل Reflector وتحميل مجموعة .NET ذات الصلة.

تحرير: لقد اتصلت بـ Microsoft من أجلك وأبلغت الخطأ من خلال connect.microsoft.com هنا. يمكنك متابعة المشكلة هناك إذا أردت.

نصائح أخرى

يمكنك استخدام getUnderyingObject للحصول على الدليل للمجموعة بدلاً من البحث عنها.

var newGroup = new GroupPrincipal(context, groupName);

// You must save first           
newGroup.Save();

var entry = (DirectoryEntry) newGroup.GetUnderlyingObject();

entry.Properties["description"].Add(description);
entry.CommitChanges(); 
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top