2010-01-18 2 views
2

Я пытаюсь создать Principal вроде этого:Inexplainable InvalidOperationException с GroupPrincipal и SAM PrincipalContext

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

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

group.Save(); 

Однако, когда код выполняется, я получаю следующее сообщение об исключении:

системы .DirectoryServices.AccountManagement: Неверное изображение для данного магазина .

Если я не установить Description свойства, приведенный выше код работает прекрасно, просто не имеет описания для группы.

Я что-то не так?

Заранее спасибо.

EDIT: Я считаю, что для этого я нашел работу (для тех, кто может быть заинтересован). группа может быть создана таким же образом, как описано выше:

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(); 

И что должны это сделать.

+0

Я предполагаю, что у вас есть googled this и нашел эту ветку? http://directoryprogramming.net/forums/thread/2163.aspx. Он говорит что-то об этом, работая с контроллерами домена, но не с SAM, но не предоставляет решения для последнего. – Abel

+0

Да, единственная аналогичная проблема там, но, к сожалению, без решения. – AlexR

+0

PS: это помогает убедить Microsoft решить проблему, нажав кнопку «Важная» и ссылку «Я могу воспроизвести эту ссылку»: https://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=525688 – Abel

ответ

7

Ответ переписано

Я получил ответ на свой вопрос, но вы не можете на самом деле нравится. Информация в Интернете не хватает, но в коде, это объяснимо:

  • При создании GroupPrincipal, Context добавляется к нему. Этот контекст является внутренне скрытого типа: SAMStoreCtx, который наследуется от абстрактного типа StoreCtx;
  • Каждое свойство в GroupPrincipal, которое вы вызываете, вызовет IsValidProperty, внутренний член SamStoreCtx;
  • Однако это не относится к свойству Name;
  • Внутри 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 с использованием оператора and, всегда приведет к ObjectMask.None. Второй if-statement для него всегда верно.
  • Вызывающий код (Property Settor of Description) генерирует исключение, когда этот метод возвращает false.

Я считаю, что это ошибка в библиотеке Microsoft. Это происходит только с SAMStoreCtx. Возможно, это специально, но поскольку код есть, но всегда возвращает false, я полагаю, что программисты использовали вместо этого использование or-operator. Проверка моих результатов с другими свойствами, такими как DisplayName, вызывает то же исключение, что и ожидалось.

Вы можете связаться с Microsoft об этом и показать им эту тему. Я не проверял новые бета-версии .NET 4.0, которые могут отображаться по-разному. Вы можете проверить это самостоятельно, загрузив Reflector и загрузив соответствующую сборку .NET.

EDIT: Я связался с Microsoft для вас и сообщил об ошибке через connect.microsoft.com here. Вы можете следить за этой проблемой, если хотите.

+1

Thats The problem. Когда я НЕ устанавливаю описание, код работает нормально, группа создается и т. Д. У него нет описания, просто потому, что он не был установлен. Но теперь я хочу установить описание для группы, и я не могу этого сделать, потому что я получаю эту ошибку -> «System.DirectoryServices.AccountManagement: свойство недопустимо для этого типа хранилища». Я смущаюсь? – AlexR

+0

@GertArnold, похоже, что страница была удалена совсем недавно, так как она по-прежнему доступна в Поиске Google и в файле Sitemap (http://connect.microsoft.com/Sitemap0.aspx, предупреждение, очень большая страница!). Я не получил никаких предупреждений об этом, и он, похоже, не тронут ... Это было не разрешено, насколько я знаю. – Abel

+0

Спасибо, Абел, выглядит как проблема авторизации. Я не могу получить доступ к карте сайта, хотя я вошел в систему. Ну, а не ваш кусок пирога. –

2

Вы можете использовать GetUnderlyingObject, чтобы получить DirectoryEntry для группы, а не искать ее.

var newGroup = new GroupPrincipal(context, groupName); 

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

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

entry.Properties["description"].Add(description); 
entry.CommitChanges(); 
Смежные вопросы