Bloqueio de conta (provedor WinNT)
Quando o número de tentativas de logon com falha é excedido, a conta de usuário fica bloqueada pelo número de minutos especificado pelo atributo lockoutDuration . A propriedade IADsUser.IsAccountLocked parece ser a propriedade a ser usada para ler e modificar o estado de bloqueio de uma conta de usuário, mas o provedor ADSI do WinNT tem restrições que limitam o uso da propriedade IsAccountLocked.
Redefinindo o status de bloqueio da conta
Ao usar o provedor WinNT, a propriedade IsAccountLocked só pode ser definida como FALSE, que desbloqueia a conta. A tentativa de definir a propriedade IsAccountLocked como TRUE falhará. Somente o sistema pode bloquear uma conta.
O exemplo de código a seguir demonstra como usar o Visual Basic com ADSI para desbloquear uma conta de usuário.
Public Sub UnlockAccount(AccountDN As String)
Dim usr As IADsUser
' Bind to the user account.
Set usr = GetObject("WinNT://" + AccountDN)
' Set the IsAccountLocked property to False
usr.IsAccountLocked = False
' Flush the cached attributes to the server.
usr.SetInfo
End Sub
O exemplo de código a seguir demonstra como usar C++ com ADSI para desbloquear uma conta de usuário.
HRESULT UnlockAccount(LPCWSTR pwszUserDN)
{
if(!pwszUserDN)
{
return E_INVALIDARG;
}
// Build the ADsPath.
CComBSTR sbstr = "WinNT://";
sbstr += pwszUserDN;
HRESULT hr;
CComPtr<IADsUser> spADsUser;
// Bind to the object.
hr = ADsOpenObject(sbstr,
NULL,
NULL,
ADS_SECURE_AUTHENTICATION,
IID_IADsUser,
(void**)&spADsUser);
if(S_OK != hr)
{
return hr;
}
// Set the IsAccountLocked property to FALSE;
hr = spADsUser->put_IsAccountLocked(VARIANT_FALSE);
// Commit the changes to the server.
hr = spADsUser->SetInfo();
return hr;
}
Lendo o status de bloqueio da conta
Com o provedor WinNT, a propriedade IsAccountLocked pode ser usada para determinar se uma conta está bloqueada. Se uma conta estiver bloqueada, a propriedade IsAccountLocked conterá TRUE. Se uma conta não estiver bloqueada, a propriedade IsAccountLocked conterá FALSE.
O exemplo de código a seguir demonstra como usar o Visual Basic com ADSI para determinar se uma conta está bloqueada.
Public Function IsAccountLocked(AccountDN As String) As Boolean
Dim oUser As IADsUser
' Bind to the object.
Set oUser = GetObject("WinNT://" + AccountDN)
' Get the IsAccountLocked property.
IsAccountLocked = oUser.IsAccountLocked
End Function
O exemplo de código a seguir demonstra como usar C++ com ADSI para determinar se uma conta está bloqueada.
HRESULT IsAccountLocked(LPCWSTR pwszUserDN, BOOL *pfLocked)
{
if(!pwszUserDN || !pfLocked)
{
return E_INVALIDARG;
}
*pfLocked = FALSE;
// Build the ADsPath.
CComBSTR sbstr = "WinNT://";
sbstr += pwszUserDN;
HRESULT hr;
CComPtr<IADsUser> spADsUser;
// Bind to the object.
hr = ADsOpenObject(sbstr,
NULL,
NULL,
ADS_SECURE_AUTHENTICATION,
IID_IADsUser,
(void**)&spADsUser);
if(S_OK != hr)
{
return hr;
}
VARIANT_BOOL vfLocked;
hr = spADsUser>get_IsAccountLocked(&vfLocked);
if(S_OK != hr)
{
return hr;
}
*pfLocked = (vfLocked != 0);
return hr;
}