問題描述
開始使用 System.DirectoryServices.AccountManagement
命名空間,對活動目錄 (AD) 中的用戶執行查找.我還需要用戶的管理器,但我似乎在使用這個命名空間時遇到了障礙.獲取一個人的當前代碼:
Started using the System.DirectoryServices.AccountManagement
namespace, to perform the lookup on a user in active directory (AD). I also need the user's manager, but I seem to have hit a bump in the road using this namespace. Current code to get a person:
class Person {
// Fields
public string GivenName = null;
public string Surname = null;
public string DistinguishedName = null;
public string Email = null;
public string MangerDistinguishedName = null; // Unable to set this
// Constructor
public Person(string userName) {
UserPrincipal user = null;
try {
user = GetUser(userName);
if (user != null) {
this.GivenName = user.GivenName;
this.Surname = user.Surname;
this.DistinguishedName = user.DistinguishedName;
this.Email = user.EmailAddress;
this.MangerDistinguishedName = user.<NO SUCH PROPERTY TO FIND A MANAGER'S DISTINGUISHED NAME>
}
else {
throw new MissingPersonException("Person not found");
}
}
catch (MissingPersonException ex) {
MessageBox.Show(
ex.Message
, ex.reason
, MessageBoxButtons.OK
, MessageBoxIcon.Error
);
}
catch (Exception ex) {
MessageBox.Show(
ex.Message
, "Error: Possible connection failure, or permissions failure to search for the username provided."
, MessageBoxButtons.OK
, MessageBoxIcon.Error
);
}
finally {
user.Dispose();
}
}
執行人物搜索
private UserPrincipal GetUser(string userName) {
PrincipalContext ctx = new PrincipalContext(ContextType.Domain);
UserPrincipal user = UserPrincipal.FindByIdentity(ctx, userName);
return user;
}
還有什么方法可以直接訪問特定用戶的經理的專有名稱?
- 可能的部分答案此處VB,但我不認為提及經理.
- 另一個可能的部分問題這里,同樣,與經理無關.
- Possible partial answer here in VB, but I see nothing about referring to managers.
- Another possible partial one here, again, nothing about managers.
推薦答案
如果您使用 .NET 3.5 及更高版本并使用 System.DirectoryServices.AccountManagement
(S.DS.AM) 命名空間,您可以輕松擴展現有的 UserPrincipal
類以獲得更高級的屬性,例如 Manager
等.
If you're on .NET 3.5 and up and using the System.DirectoryServices.AccountManagement
(S.DS.AM) namespace, you can easily extend the existing UserPrincipal
class to get at more advanced properties, like Manager
etc.
在此處閱讀所有相關信息:
Read all about it here:
- 在 .NET Framework 3.5 中管理目錄安全主體莉>
- 有關 System.DirectoryServices.AccountManagement 的 MSDN 文檔
基本上,您只需定義一個基于 UserPrincipal
的派生類,然后定義您想要的其他屬性:
Basically, you just define a derived class based on UserPrincipal
, and then you define your additional properties you want:
[DirectoryRdnPrefix("CN")]
[DirectoryObjectClass("Person")]
public class UserPrincipalEx : UserPrincipal
{
// Inplement the constructor using the base class constructor.
public UserPrincipalEx(PrincipalContext context) : base(context)
{ }
// Implement the constructor with initialization parameters.
public UserPrincipalEx(PrincipalContext context,
string samAccountName,
string password,
bool enabled) : base(context, samAccountName, password, enabled)
{}
// Create the "Department" property.
[DirectoryProperty("department")]
public string Department
{
get
{
if (ExtensionGet("department").Length != 1)
return string.Empty;
return (string)ExtensionGet("department")[0];
}
set { ExtensionSet("department", value); }
}
// Create the "Manager" property.
[DirectoryProperty("manager")]
public string Manager
{
get
{
if (ExtensionGet("manager").Length != 1)
return string.Empty;
return (string)ExtensionGet("manager")[0];
}
set { ExtensionSet("manager", value); }
}
// Implement the overloaded search method FindByIdentity.
public static new UserPrincipalEx FindByIdentity(PrincipalContext context, string identityValue)
{
return (UserPrincipalEx)FindByIdentityWithType(context, typeof(UserPrincipalEx), identityValue);
}
// Implement the overloaded search method FindByIdentity.
public static new UserPrincipalEx FindByIdentity(PrincipalContext context, IdentityType identityType, string identityValue)
{
return (UserPrincipalEx)FindByIdentityWithType(context, typeof(UserPrincipalEx), identityType, identityValue);
}
}
現在,您可以在代碼中使用 UserPrincipalEx
的擴展"版本:
Now, you can use the "extended" version of the UserPrincipalEx
in your code:
using (PrincipalContext ctx = new PrincipalContext(ContextType.Domain))
{
// Search the directory for the new object.
UserPrincipalEx inetPerson = UserPrincipalEx.FindByIdentity(ctx, IdentityType.SamAccountName, "someuser");
// you can easily access the Manager or Department now
string department = inetPerson.Department;
string manager = inetPerson.Manager;
}
這篇關于C# - 在活動目錄中查找用戶管理器的文章就介紹到這了,希望我們推薦的答案對大家有所幫助,也希望大家多多支持html5模板網!