如何在Powershell中安全地验证AD用户(加密凭据)

时间:2014-03-05 16:46:12

标签: .net windows powershell active-directory

我的应用程序要求用户针对Active Directory进行身份验证。我们正在考虑使用System.DirectoryServices.DirectoryEntry执行PowerShell脚本,我们将用户名和密码传递给它。

我看到它在一个不同的答案中提到了System.DirectoryServices.DirectoryEntry使用LDAP来读取AD信息的事实。 LDAP协议本身未加密。您可以使用LDAPS,但这需要设置CA.我想知道这个命令产生的网络流量是否在默认情况下是安全的 - 即密码是否可以通过网络嗅探?

EDIT 我发现您可以将其他选项传递给DirectoryEntry实例。这是示例代码:

$username = $args[0]
$password = $args[1]

Function Test-ADAuthentication {
    param($username,$password)
    (new-object directoryservices.directoryentry "",$username,$password,Secure -bor Sealing).psbase.name -ne $null
}

Test-ADAuthentication $username $password

第四个参数是枚举AuthenticationTypes http://msdn.microsoft.com/en-us/library/system.directoryservices.authenticationtypes(v=vs.90).aspx

值得关注的值是:安全&密封组合将加密凭证

非常感谢您阅读。

2 个答案:

答案 0 :(得分:2)

这是我在Powershell脚本中向AD用户进行身份验证的最佳解决方案。根据MS文档,协商和密封标志将一起加密数据:http://msdn.microsoft.com/en-us/library/system.directoryservices.accountmanagement.contextoptions(v=vs.110).aspx

$username = $args[0]
$password = $args[1]

$pc = New-Object -TypeName System.DirectoryServices.AccountManagement.PrincipalContext 'Domain', $system.Domain

return $pc.ValidateCredentials($username, $password, [DirectoryServices.AccountManagement.ContextOptions]::Negotiate -bor [DirectoryServices.AccountManagement.ContextOptions]::Sealing)

答案 1 :(得分:0)

如果我没记错的话,就无法以未加密的方式对Active Directory进行身份验证。每个域控制器在接受凭据之前都会与客户端建立某种加密连接。

Powershell使用与其他客户端使用的相同方法对DC进行身份验证。也就是说,无论您是在Windows 8登录屏幕,Sharepoint页面,自定义程序还是Powershell提示符下输入凭据,DC都将以相同方式进行身份验证。您可以通过组策略修改AD的身份验证机制,但每种机制都会对数据进行加密。

我在谷歌搜索的几分钟内没有找到太多文档,但是华盛顿大学的这篇文章对LDAP的总体概况和与AD相关的LDAP有很好的概述。跳到阅读“Active Directory支持四种SASL身份验证机制”的行

http://www.netid.washington.edu/documentation/ldapAuth.aspx

此外,GPO的两个链接与登录安全性相关。 Tangientially与你的问题有关,但它们可能很方便: http://technet.microsoft.com/en-us/library/dn169021%28v=ws.10%29.aspx http://technet.microsoft.com/en-us/library/jj852258%28v=ws.10%29.aspx