根据您的Active Directory策略,可能需要交互式登录尝试来锁定帐户。 您可以使用advapi32.dll的
LogonUser
方法进行模拟。 在我的测试中,运行此循环100次不能保证在域控制器上有100个错误密码尝试,因此如果需要,应
检查用户是否被锁定并进行更多尝试。
总之,您应该禁用帐户而不是尝试锁定它。 锁定和禁用帐户之间
没有功能上的区别。 下面的代码是一个hack。
using System;
using System.Runtime.InteropServices;
namespace Test
{
class Program
{
static void Main(string[] args)
{
IntPtr token = IntPtr.Zero;
string userPrincipalName = "userID@domain.com";
string authority = null;
string badPassword = "bad";
int maxTries = 100;
bool res = false;
for (var i = 0; i < maxTries; i++)
{
res = LogonUser(userPrincipalName, authority, badPassword, LogonSessionType.Interactive, LogonProvider.Default, out token);
CloseHandle(token);
}
}
[DllImport("advapi32.dll", SetLastError = true)]
static extern bool LogonUser(
string principal,
string authority,
string password,
LogonSessionType logonType,
LogonProvider logonProvider,
out IntPtr token);
[DllImport("kernel32.dll", SetLastError = true)]
static extern bool CloseHandle(IntPtr handle);
enum LogonSessionType : uint
{
Interactive = 2,
Network,
Batch,
Service,
NetworkCleartext = 8,
NewCredentials
}
enum LogonProvider : uint
{
Default = 0,
WinNT35,
WinNT40,
WinNT50
}
}
}
GetUser(userName)
,但我结合使用了pc = PrincipalContext(ContextType.Domain)
,UserPrincipal.FindByIdentity(pc, userName)
和在结果对象上使用.GetUnderlyingObject()
(强制转换为DirectoryInfo
)。别忘了进行空值检查;-)
。 - Gertsen