C# 以另一个用户身份访问 Active Directory

C# access Active Directory as another user

我想请你帮忙解决以下问题。我正在开发临时应用程序,只会由我使用一次。

其中一部分是为 AD 中的 3000 多个用户执行密码重置并向他们发送新凭据。

我可以以普通用户的身份从AD读取,但我必须使用特权帐户才能修改它。我怎样才能做到这一点?我知道,我可以使用 PowerShell 并在几秒钟内完成,但我想学习如何在 C# 中完成它。

我搜索用户的代码很简单

public class ADSecurity
{
    public static string getUserName(string sam)
    {
        PrincipalContext ctx = new PrincipalContext(ContextType.Domain);
        UserPrincipal user = UserPrincipal.FindByIdentity(ctx, IdentityType.SamAccountName, sam);
        return user.Name;
    }
}

我怎样才能做同样的事情,但作为不同的用户?

我看过一些指南,但其中 none 解释了 a-z ...只是关于如何模拟的建议,但没有关于如何使用它的建议。这里有一篇关于模拟的文章,但使用的是 LDAP 协议 (DirectoryEntry)。但据我了解,它真的很慢。

任何建议表示赞赏。我需要在 2 天后 运行 它,所以在最坏的情况下我会使用 PowerShell 来完成它。

谢谢。

有几种方法可以做到:

  1. 运行 您的应用程序在所需的凭据下(Shift+右键单击 .exe 文件并使用 'Run as a different user')。如果你只做一次,这是最简单的。
  2. 使用接受用户名和密码的PrincipalContext constructor
public class ADSecurity
{
    public static string getUserName(string sam)
    {
        PrincipalContext ctx = new PrincipalContext(ContextType.Domain, null, username, password);
        UserPrincipal user = UserPrincipal.FindByIdentity(ctx, IdentityType.SamAccountName, sam);
        return user.Name;
    }
}
  1. 使用接受用户名和密码的DirectoryEntry constructor

我不确定你说的是哪个例子 "slow",但根据我的经验,直接使用 DirectoryEntry 几乎总是更快,只要你正确使用它。 System.DirectoryServices.AccountManagement 命名空间(您在示例中使用的名称空间)无论如何都在幕后使用 DirectoryEntry

当然,选项 2 和 3 需要您知道密码。