从 .NET 中的桌面应用程序在 Active Directory 中读取和写入 "uid" 属性

Read and write "uid" property in Active Directory from a desktop application in .NET

我正在尝试操纵 AD 的 uid 属性 来存储一些额外的信息,但是在使用此代码时我得到了一个 UnauthorizedAccessException

DirectoryEntry de = new DirectoryEntry("LDAP://somedomain.net");
DirectorySearcher ds = new DirectorySearcher(de);

ds.Filter = "(&(objectClass=user)(|(cn=" + username + ")(sAMAccountName=" + username + ")))";
ds.PropertiesToLoad.Add("uid");

SearchResult? rs = ds.FindOne();

if (rs != null)
{
    DirectoryEntry de = rs.GetDirectoryEntry();

    if (rs.Properties.Contains("uid")) 
        de.Properties["uid"].Value = "123456";
    else 
        de.Properties["uid"].Add("123456");

    de.CommitChanges();
}

当我使用相同的代码操作 postalCode 属性 而不是 uid 时,我没有遇到任何问题,所以我真的迷路了。我在域上没有足够的权限来写入 uid 属性 吗?或者我必须以不同的方式访问它吗?

编辑:看来我无法访问除我以外的其他用户的postalCode 属性。我想我必须使用域管理员帐户登录或以某种方式模拟它,但我不知道该怎么做...

It seems I can't access "postalCode" property of another user other than mine. I supose that I have to login with a domain administrator account or impersonate it in some way, but I have no idea of how...

DirectoryEntry class 构造函数为这种情况采用显式凭据:

DirectoryEntry de = new DirectoryEntry("LDAP://somedomain.net/", "SOMEDOMAIN\Administrator", "sup3rs3cr3t");

我强烈建议不要使用域管理员帐户,而是将目标帐户所需的最低访问权限委托给服务帐户,然后您可以在程序中使用该服务帐户的凭据 - 这样您就可以限制潜在的窃取凭据的人的影响。