通过 UserPrincipal 获取 Active Directory ExtensionAttribute
Get Active Directory ExtensionAttribute via UserPrincipal
我正在尝试获取用户 ExtensionAttribute4
的值。
这是我 class 到 UserPrincipal
的扩展:
[DirectoryRdnPrefix("CN")]
[DirectoryObjectClass("Person")]
public class UserPrincipalEx : UserPrincipal
{
// Implement 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 "extensionAttribute4" property.
[DirectoryProperty("extensionAttribute4")]
public string ExtensionAttribute4
{
get
{
if (ExtensionGet("extensionAttribute4").Length != 1)
return string.Empty;
return (string)ExtensionGet("extensionAttribute4")[0];
}
set { ExtensionSet("extensionAttribute4", value); }
}
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 user = UserPrincipalEx.FindByIdentity(ctx, IdentityType.SamAccountName, "someuser");
我在调试中看到 user 确实是 Classes.UserPrincipalEx.FindByIdentity
的结果,但 extensionAttribute4
未在此处列出。完全没有。还有其他属性。
我尝试对 Manager 执行相同的操作,结果相同。错误是:
Object reference not set to an instance of an object
我是新手,所以如果我遗漏了一些明显的东西,请原谅。
documentation for ExtensionGet()
表示它 return 是“null
如果不存在具有该名称的属性”。如果该属性为空,则视为不存在,将returnnull
。所以你必须检查一下。
[DirectoryProperty("extensionAttribute4")]
public string ExtensionAttribute4
{
get
{
var extensionAttribute4 = ExtensionGet("extensionAttribute4");
if (extensionAttribute4 == null || extensionAttribute4.Length != 1)
return string.Empty;
return (string)extensionAttribute4[0];
}
set { ExtensionSet("extensionAttribute4", value); }
}
请注意,您可以在不扩展 UserPrincipal
的情况下使用 GetUnderlyingObject()
并使用底层 DirectoryEntry
对象来做同样的事情:
UserPrincipal user = UserPrincipal.FindByIdentity(ctx, IdentityType.SamAccountName, "someuser");
var extensionAttribute4 = ((DirectoryEntry) user.GetUnderlyingObject())
.Properties["extensionAttribute4"]?.Value as string;
我正在尝试获取用户 ExtensionAttribute4
的值。
这是我 class 到 UserPrincipal
的扩展:
[DirectoryRdnPrefix("CN")]
[DirectoryObjectClass("Person")]
public class UserPrincipalEx : UserPrincipal
{
// Implement 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 "extensionAttribute4" property.
[DirectoryProperty("extensionAttribute4")]
public string ExtensionAttribute4
{
get
{
if (ExtensionGet("extensionAttribute4").Length != 1)
return string.Empty;
return (string)ExtensionGet("extensionAttribute4")[0];
}
set { ExtensionSet("extensionAttribute4", value); }
}
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 user = UserPrincipalEx.FindByIdentity(ctx, IdentityType.SamAccountName, "someuser");
我在调试中看到 user 确实是 Classes.UserPrincipalEx.FindByIdentity
的结果,但 extensionAttribute4
未在此处列出。完全没有。还有其他属性。
我尝试对 Manager 执行相同的操作,结果相同。错误是:
Object reference not set to an instance of an object
我是新手,所以如果我遗漏了一些明显的东西,请原谅。
documentation for ExtensionGet()
表示它 return 是“null
如果不存在具有该名称的属性”。如果该属性为空,则视为不存在,将returnnull
。所以你必须检查一下。
[DirectoryProperty("extensionAttribute4")]
public string ExtensionAttribute4
{
get
{
var extensionAttribute4 = ExtensionGet("extensionAttribute4");
if (extensionAttribute4 == null || extensionAttribute4.Length != 1)
return string.Empty;
return (string)extensionAttribute4[0];
}
set { ExtensionSet("extensionAttribute4", value); }
}
请注意,您可以在不扩展 UserPrincipal
的情况下使用 GetUnderlyingObject()
并使用底层 DirectoryEntry
对象来做同样的事情:
UserPrincipal user = UserPrincipal.FindByIdentity(ctx, IdentityType.SamAccountName, "someuser");
var extensionAttribute4 = ((DirectoryEntry) user.GetUnderlyingObject())
.Properties["extensionAttribute4"]?.Value as string;