Поделиться через


Блокировка учетной записи (поставщик WinNT)

При превышении количества неудачных попыток входа учетная запись пользователя блокируется в течение нескольких минут, указанных атрибутом lockoutDuration . Свойство IADsUser.IsAccountLocked , как представляется, является свойством для чтения и изменения состояния блокировки учетной записи пользователя, но у поставщика WinNT ADSI есть ограничения, ограничивающие использование свойства IsAccountLocked .

Сброс состояния блокировки учетной записи

При использовании поставщика WinNT свойство IsAccountLocked может иметь значение FALSE, которое разблокирует учетную запись. Попытка задать для свойства IsAccountLocked значение TRUE завершится ошибкой. Только система может заблокировать учетную запись.

В следующем примере кода показано, как использовать Visual Basic с ADSI для разблокировки учетной записи пользователя.

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

В следующем примере кода показано, как использовать C++ с ADSI для разблокировки учетной записи пользователя.

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

Чтение состояния блокировки учетной записи

С помощью поставщика WinNT свойство IsAccountLocked можно использовать для определения блокировки учетной записи. Если учетная запись заблокирована, свойство IsAccountLocked будет содержать TRUE. Если учетная запись не заблокирована, свойство IsAccountLocked будет содержать FALSE.

В следующем примере кода показано, как использовать Visual Basic с ADSI, чтобы определить, заблокирована ли учетная запись.

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

В следующем примере кода показано, как использовать C++ с ADSI, чтобы определить, заблокирована ли учетная запись.

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