我正在 Windows 2012 虚拟机上安装 Active Directory 轻型目录服务 (AD LDS,又名 ADAM)。在最终完成目录配置和同步处理后,我现在遇到了一个有趣的问题。我已经在网上研究了几个小时,我需要一些专家的建议。
当我使用“网络服务”帐户作为我的 LDS 实例的服务帐户时,我根本无法在 SSL 端口(我将其保留为默认值 636)上发起连接。我们可以连接到非 SSL 端口 389。域服务帐户“ADLDSSRVC”也会出现同样的情况。
当我使用我的个人域凭据作为服务帐户时,我们可以在非 SSL 端口上使用非 SSL 连接,在 SSL 端口上使用 SSL 连接。在 SSL 连接上,我们可以通过代理绑定重定向使用 AD DS 帐户绑定到 LDS。我的域帐户在主机上具有本地管理员权限。
我是否需要将域服务帐户“ADLDSSRVC”设为本地管理员?如果我无法为其提供所需的权限,我的老板只会将此作为最后的手段。更具体地说,如果可能的话,我想知道服务帐户需要哪些权限,以便我可以与我的 AD LDS 实例建立 SSL ldap 连接。Technet 文章表示 ADLDS 服务帐户需要创建、读取和修改对 %ProgramFiles%\Microsoft ADAM\instancename\data 的访问权限,但这似乎对开放端口 636 没有影响。
博客.uvm.edu告诉您执行以下操作:打开 AD 用户和计算机工具,找到安装了实例的计算机对象。将 LDS 服务帐户“创建所有子对象”赋予计算机对象。我不是域管理员,所以我不能这样做。这基本上与将服务帐户设为本地管理员相同吗?
答案1
在我看来,当您将 AD LDS 设置为使用没有权限使用本地计算机\个人证书存储的服务帐户时,这听起来像是 AD LDS 服务无法访问设置 LDAPS 所需证书的情况。
对于 AD LDS,将证书放入与 AD LDS 实例相对应的服务(而不是 NTDS 服务)的个人证书存储中。
因此,使用 MMC 并添加证书管理单元。选择“服务帐户”作为证书存储区以查看并选择安装在该计算机上的 AD LDS 服务。您的 SSL 证书需要安装在那里。
答案2
根据 Ryan Ries 的回答,下面是我在不将“domain\adldssrvc”设为管理员帐户的情况下解决问题的方法:
授予服务帐户对本地计算机证书的权限
mmc
通过运行并添加本地计算机的证书管理单元来打开证书存储。
右键单击证书Certificates (Local Computer)\Personal\Certificates\
并选择All Tasks\Manage Private Keys
。
这将弹出一个看起来很正常的权限屏幕。只需添加适当的用户并授予其对这些私钥的完全控制权即可。
请记住在进行此更改后重置 LDS 服务!(services.msc)
答案3
请参考此帖子
我首先配置了 Enterprise CA,然后使用本页上的指导
按以下顺序
发布支持服务器身份验证的证书
在这一步的第 5 点
“5. 在“复制模板”对话框中,保留默认选择的 Windows Server 2003 Enterprise,然后单击“确定”。
仔细选择相关的操作系统,教程说保留默认设置,但我使用的是 Windows Server 2012 r2,所以我选择了我正在使用的那个。选择相关的操作系统。
导出 LDAPS 证书并导入以用于 AD DS
- 验证 LDAPS 连接
为什么我需要通过 SSL 建立 ADLDS 连接?
因为我希望用户更改其 ADLDS 密码,使用 PrincipalContext 的非 SSL 连接不允许我这样做。所以现在我使用以下代码,在全能真主 Allhumdullilah 的帮助和恩典下,它运行得非常好。
PrincipalContext pc = new PrincipalContext(
ContextType.ApplicationDirectory,
"YourServerUrl:YourSSLPort",
"CN=YourPartitionName,DC=partition,DC=com",
ContextOptions.SimpleBind | ContextOptions.SecureSocketLayer,
"FullDistinguisedNameOfUser",
"PasswordOfUser");
bool IsUserValidated = pc.ValidateCredentials(
"FullDistinguisedNameOfUser",
"PasswordOfUser",
ContextOptions.SimpleBind | ContextOptions.SecureSocketLayer);
if (IsUserValidated)
{
UserPrincipal up = UserPrincipal.FindByIdentity(
"FullDistinguisedNameOfUser",
"PasswordOfUser");
up.ChangePassword("UserOldPassword", "UserNewPassword");
}