Compartilhar via


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;
}