我正在使用自定义类在 Active Directory 中公开一些自定义架构。我正在存储一个二进制 blob,根据项目要求,此数据必须存储在 AD 中,我不能使用外部存储(如果可以的话,我会这样做)。
当我创建用户时,它会很好地存储 blob。我也可以很好地检索 blob 并获取我的所有数据。问题是我是否需要更新值并且出现错误
小示例程序:
using System;
using System.DirectoryServices.AccountManagement;
namespace SandboxConsole40
{
class Program
{
static void Main(string[] args)
{
using(var context = new PrincipalContext(ContextType.Domain))
{
using (var clear = ExamplePrincipal.FindByIdentity(context, "example"))
{
if (clear != null)
clear.Delete();
}
using (var create = new ExamplePrincipal(context, "example", "Password1", false))
{
create.Save();
}
using (var set = ExamplePrincipal.FindByIdentity(context, "example"))
{
set.BlobData = new byte[] { 0xDE, 0xAD, 0xBE, 0xEF }; //This fails with method 2.
set.Save();
}
using (var lookup = ExamplePrincipal.FindByIdentity(context, "example"))
{
Console.WriteLine(BitConverter.ToString(lookup.BlobData));
}
using (var update = ExamplePrincipal.FindByIdentity(context, "example"))
{
update.BlobData = new byte[] { 0x12, 0x34, 0x56, 0x67 };
update.Save(); //This save fails with method 1.
}
}
Console.WriteLine("Done");
Console.ReadLine();
}
[DirectoryObjectClass("user")]
[DirectoryRdnPrefix("CN")]
class ExamplePrincipal : UserPrincipal
{
public ExamplePrincipal(PrincipalContext context) : base(context) { }
public ExamplePrincipal(PrincipalContext context, string samAccountName, string password, bool enabled)
: base(context, samAccountName, password, enabled) { }
public static new ExamplePrincipal FindByIdentity(PrincipalContext context, string identityValue)
{
return (ExamplePrincipal)FindByIdentityWithType(context, typeof(ExamplePrincipal), identityValue);
}
[DirectoryProperty("vwBlobData")]
public byte[] BlobData
{
get
{
if (ExtensionGet("vwBlobData").Length != 1)
return null;
return (byte[])ExtensionGet("vwBlobData")[0];
}
set
{
//method 1
this.ExtensionSet("vwBlobData", value );
//method 2
//this.ExtensionSet("vwBlobData", new object[] { value});
}
}
}
}
}
如果我使用方法 1,我会在update.Save()
操作中遇到以下异常
System.DirectoryServices.AccountManagement.PrincipalOperationException 未处理 H结果=-2146233087 Message=指定的目录服务属性或值已经存在。 源=System.DirectoryServices.AccountManagement 错误代码=-2147016691 堆栈跟踪: //截图 内部异常:System.DirectoryServices.DirectoryServicesCOMException H结果=-2147016691 Message=指定的目录服务属性或值已经存在。 源 = System.DirectoryServices 错误代码=-2147016691 扩展错误=8321 ExtendedErrorMessage=00002081:AtrErr:DSID-030F154F,#1: 0:00002081:DSID-030F154F,问题 1006 (ATT_OR_VALUE_EXISTS),数据 0,Att 82818fec (vwBlobData) 堆栈跟踪: //截图 内部异常:
如果我使用方法 2,我会从this.ExtensionSet
调用中得到异常set.BlobData
。
System.ArgumentException 未处理 H结果=-2147024809 Message=ExtensionClasses 不能设置元素是另一个集合的集合。 源=System.DirectoryServices.AccountManagement 堆栈跟踪: //截图 内部异常:
总结:如果当前未设置该值,我可以设置该值,但如果我想覆盖现有值,则会出现错误。