2010-05-25 8 views
6

Tôi đang cố gắng xác định xem người dùng có phải là thành viên của một nhóm nhất định sử dụng System.DirectoryServices.AccountManagment hay không.DirectoryServicesCOMException khi làm việc với System.DirectoryServices.AccountManagement

  • Tôi đang thực hiện việc này bên trong SharePoint WebPart trong SharePoint 2007 trên hệ thống 64 bit.
  • Mục tiêu dự án .NET 3.5
  • Mạo danh được bật trong web.config.
  • Trang web IIS đang được đề cập đang sử dụng Hồ bơi ứng dụng IIS với người dùng tên miền được định cấu hình làm nhận dạng.

tôi có thể để nhanh chóng một PrincipalContext như vậy:

PrincipalContext pc = new PrincipalContext(ContextType.Domain)

Tiếp theo, tôi cố gắng để lấy một hiệu trưởng:

using (PrincipalContext pc = new PrincipalContext(ContextType.Domain)) 
{ 
    GroupPrincipal group = GroupPrincipal.FindByIdentity(pc, "MYDOMAIN\somegroup"); 
    // snip: exception thrown by line above. 
} 

Cả trên và UserPrincipal.FindByIdentity với một người dùng SAM ném DirectoryServicesCOMException: "Lỗi đăng nhập: Tên người dùng không xác định hoặc mật khẩu không hợp lệ"

Tôi đã thử chuyển qua một SAMAccountName hoàn chỉnh tới FindByIdentity (dưới dạng MYDOMAIN \ username) hoặc chỉ tên người dùng không có thay đổi về hành vi. Tôi đã thử thực thi mã với các thông tin đăng nhập khác bằng cách sử dụng cả phương pháp HostingEnvironment.ImpersonateSPSecurity.RunWithElevatedPrivileges và cũng có thể trải nghiệm cùng một kết quả.

Tôi cũng đã thử instantiating bối cảnh của tôi với tên miền tại chỗ:

Principal Context pc = new PrincipalContext(ContextType.Domain, "MYDOMAIN");

này ném một PrincipalServerDownException: "Các máy chủ có thể không được liên lạc"

Tôi đang làm việc trên một máy chủ được bảo mật hợp lý. Tôi đã không khóa hệ thống xuống vì vậy tôi không chắc chắn chính xác những gì đã được thực hiện cho nó. Nếu có thông tin đăng nhập tôi cần phân bổ cho người dùng nhận dạng hồ bơi của tôi hoặc trong chính sách bảo mật tên miền để chúng hoạt động, tôi có thể định cấu hình miền cho phù hợp. Có bất kỳ cài đặt nào có thể ngăn mã của tôi chạy không? Tôi có thiếu cái gì đó trong chính mã đó không? Đây có phải là không thể trong một web SharePoint?

EDIT: Để thử nghiệm thêm, mã của tôi hoạt động chính xác khi được kiểm tra trong ứng dụng Console nhắm mục tiêu .NET 4.0. Tôi nhắm mục tiêu một khung công tác khác vì tôi không có AccountManagement có sẵn cho tôi trong ứng dụng bảng điều khiển khi nhắm mục tiêu .NET 3.5 vì một lý do nào đó.

using (PrincipalContext pc = new PrincipalContext(ContextType.Domain)) 
using (UserPrincipal adUser = UserPrincipal.FindByIdentity(pc, "MYDOMAIN\joe.user")) 
using (GroupPrincipal adGroup = GroupPrincipal.FindByIdentity(pc, "MYDOMAIN\user group")) 
{ 
    if (adUser.IsMemberOf(adGroup)) 
    { 
     Console.WriteLine("User is a member!"); 
    } 
    else 
    { 
     Console.WriteLine("User is NOT a member."); 
    } 
} 

Điều gì khác trong môi trường SharePoint có thể ngăn chức năng này thực thi?

Trả lời

1

Tôi đã thêm tài khoản được IIS Application Pool sử dụng vào nhóm Quản trị viên và sự cố này đã được giải quyết.

+3

Có lẽ bạn nên lưu ý rằng đây là phương pháp "Nắm tay sắt công lý", chứ không phải là giải pháp được khuyến nghị cho hệ thống sản xuất hoặc kết nối internet. –

+2

@ Rất tiếc - Tốt. Điều này làm việc trong môi trường của tôi: một hệ thống nội bộ trên một mạng bị ngắt kết nối. Nó không phải là một giải pháp tôi hài lòng với nhưng nó là một giải pháp vì vậy nó sẽ phải làm cho bây giờ.Tôi thực sự hy vọng cho một số hướng dẫn một trong những đặc quyền quản trị viên có cho phép mã để thực thi mà không có lỗi. Tôi rất muốn loại bỏ đặc quyền quản trị từ người dùng đó và cấp điều gì đó an toàn hơn trong khi tiếp tục hoạt động như tôi yêu cầu. – antik

+0

@antik Bạn cuối cùng đã xóa đặc quyền quản trị và có thể thực thi điều này mà không có Ngoại lệ? – FMFF