2012-03-16 21 views
5

Tôi có đoạn sau (SomeName/SomeDomain chứa các giá trị thực sự trong mã của tôi)lỗi ActiveDirectory 0x8000500c khi đi qua thuộc tính

var entry = new DirectoryEntry("LDAP://CN=SomeName,OU=All Groups,dc=SomeDomain,dc=com"); 
foreach (object property in entry.Properties) 
{ 
    Console.WriteLine(property); 
} 

It in OK cho 21 khách đầu tiên, nhưng sau đó thất bại với:

COMException {"Unknown error (0x8000500c)"} 
    at System.DirectoryServices.PropertyValueCollection.PopulateList() 
    at System.DirectoryServices.PropertyValueCollection..ctor(DirectoryEntry entry, String propertyName) 
    at System.DirectoryServices.PropertyCollection.PropertyEnumerator.get_Entry() 
    at System.DirectoryServices.PropertyCollection.PropertyEnumerator.get_Current() 
    at ActiveDirectory.Tests.IntegrationTests.ObjectFactoryTests.TestMethod1() in MyTests.cs:line 22 

Tại sao? Làm thế nào tôi có thể ngăn chặn nó?

Cập nhật

Đó là một thuộc tính tùy chỉnh mà thất bại.

Tôi đã cố gắng sử dụng entry.RefreshCache()entry.RefreshCache(new[]{"theAttributeName"}) trước khi liệt kê các thuộc tính (không hữu ích).

Update2

entry.InvokeGet("theAttributeName") công trình (và không có RefreshCache).

Ai đó có thể giải thích lý do tại sao?

UPDATE3

Nó hoạt động nếu tôi cung cấp các FQDN đến mục: LDAP://srv00014.ssab.com/CN=SomeName,xxxx

Bounty

Tôi đang tìm kiếm một câu trả lời mà giải quyết như sau:

  • Tại sao entry.Properties["customAttributeName"] không thành công với ngoại lệ được đề cập
  • Tại sao entry.InvokeGet("customAttributeName") làm việc
  • Nguyên nhân của ngoại lệ
  • Làm thế nào để có được cả hai làm việc
+0

Đoán đầu tiên của tôi lúc _why_ sẽ là quyền. Bạn đang chạy theo ngữ cảnh nào? –

+0

@ Mr.Disappointment: Chỉ cần thử với một tài khoản cần có đủ đặc quyền. Không có sự khác biệt: ( – jgauffin

+0

Bạn có thể thử chỉ định thông tin xác thực 'Thiên Chúa' một cách rõ ràng thông qua hàm tạo không? Chỉ cần kiểm tra tính chính xác. –

Trả lời

3

Nếu ai muốn truy cập vào một thuộc tính tùy chỉnh từ một máy tính mà không phải là một phần của miền nơi cư trú (các chứng chỉ của người dùng đăng nhập không thành vấn đề) thuộc tính tùy chỉnh một cần p ass tên đầy trình độ của đối tượng đang cố gắng để truy cập nếu không thì bộ nhớ cache schema trên máy client không được làm mới đúng, nevermind tất cả các schema.refresh() gọi bạn thực hiện

Tìm thấy here. Điều này nghe có vẻ như vấn đề của bạn, với các cập nhật được đưa ra cho câu hỏi.

3

Sử dụng công cụ Err.exe đây

http://www.microsoft.com/download/en/details.aspx?id=985

Nó spits ra:
cho hex 0x8000500c/thập phân-2147463156:
E_ ADS_CANT_CONVERT_DATATYPE adserr.h
Các kiểu dữ liệu thư mục không thể được chuyển đổi sang/từ một người gốc
DS datatype
1 trận tìm thấy cho "0x8000500c"

google "Các kiểu dữ liệu thư mục không thể được chuyển đổi sang/từ một nguồn gốc" và thấy KB này: http://support.microsoft.com/kb/907462

+0

t giải thích lý do tại sao nó hoạt động với FQDN – jgauffin

+0

@jgauffin bạn có thể cho chúng tôi biết phiên bản hệ điều hành & SP cấp nào không? cũng là tài sản thứ 22 này? bạn có thể xem nó bằng cách sử dụng ADSIEDIT.MSC không? Tài sản thứ 22 là gì? MMC AD Snap-in sẽ làm gì khi bạn xem thuộc tính này? –

+0

woops tùy chỉnh thuộc tính quên bit MMC, xem đây có thể là một cá trích đỏ nhưng nó không phải là thuộc tính Không thiết lập? Http://stackoverflow.com/questions/7990505/net-code-to-set-an-active-directory-attribute-to-not-set –

1

Tôi có cùng lỗi. Tôi đọc và thấy rất nhiều câu hỏi về lỗi 0x8000500c bằng cách liệt kê thuộc tính từ một DirectoryEntry. Tôi có thể thấy, với Process Monitor (Sysinternals), rằng quá trình của tôi đã đọc một tệp lược đồ. Tệp lược đồ này được lưu dưới C: \ Users \ xxxx \ AppData \ Local \ Microsoft \ Windows \ SchCache \ xyz.sch.

Xoá tệp này và chương trình hoạt động tốt :)

0

Tôi chỉ gặp phải vấn đề này và tôi là với một ứng dụng web. Tôi đã có bit này mã mà kéo người dùng ra khỏi cửa sổ xác thực trong IIS và kéo thông tin của họ từ AD.

using (var context = new PrincipalContext(ContextType.Domain)) 
{ 
    var name = UserPrincipal.Current.DisplayName; 
    var principal = UserPrincipal.FindByIdentity(context, this.user.Identity.Name); 
    if (principal != null) 
    { 
     this.fullName = principal.GivenName + " " + principal.Surname; 
    } 
    else 
    { 
     this.fullName = string.Empty; 
    } 
} 

Điều này làm việc tốt trong các thử nghiệm của tôi, nhưng khi tôi xuất bản trang web, nó sẽ gặp lỗi này trong cuộc gọi FindByIdentity.

Tôi đã khắc phục sự cố bằng cách sử dụng đúng người dùng cho nhóm ứng dụng của trang web. Ngay sau khi tôi khắc phục điều đó, điều này bắt đầu hoạt động.

Các vấn đề liên quan