изменить статус учетной записи пользователя Oracle с EXPIRE (GRACE) на OPEN - PullRequest
20 голосов
/ 02 апреля 2011

Получив сообщение Your password will be expired with in 7 days, я изменил срок действия пароля профиля default на UNLIMITED.Но статус учетной записи некоторых пользователей все еще остается в EXPIRE(GRACE).

Можно ли изменить статус учетной записи пользователя Oracle с EXPIRE(GRACE) на OPEN без сброса пароля?

Ответы [ 5 ]

24 голосов
/ 03 апреля 2011

Нет, вы не можете изменить статус учетной записи с EXPIRE (GRACE) на OPEN без сброса пароля.

Документация гласит:

Если срок действия пароля пользователя базы данных истекает из-за ПАРОЛЯ EXPIRE, то пользователь (или администратор базы данных) должен изменить пароль до попытка войти в базу данных после истечения срока действия.


Однако вы можете изменить статус на ОТКРЫТО, сбросив хэш пароля пользователя к существующему значению. К сожалению, установка хэша пароля для себя имеет следующие сложности, и почти в каждом другом решении пропущена хотя бы одна из этих проблем:

  1. Различные версии Oracle используют разные типы хэшей.
  2. Профиль пользователя может препятствовать повторному использованию паролей.
  3. Пределы профиля могут быть изменены, но мы должны изменить значения обратно в конце.
  4. Значения профиля не являются тривиальными, поскольку, если значение равно DEFAULT, это указатель на значение профиля DEFAULT. Возможно, нам потребуется рекурсивно проверить профиль.

Следующий, смехотворно большой блок PL / SQL, должен обрабатывать все эти случаи. Он должен сбросить любую учетную запись на ОТКРЫТУЮ с тем же хешем пароля, независимо от версии Oracle или настроек профиля И профиль будет изменен обратно на исходные пределы.

--Purpose: Change a user from EXPIRED to OPEN by setting a user's password to the same value.
--This PL/SQL block requires elevated privileges and should be run as SYS.
--This task is difficult because we need to temporarily change profiles to avoid
--  errors like "ORA-28007: the password cannot be reused".
--
--How to use: Run as SYS in SQL*Plus and enter the username when prompted.
--  If using another IDE, manually replace the variable two lines below.
declare
    v_username varchar2(128) := trim(upper('&USERNAME'));
    --Do not change anything below this line.
    v_profile                 varchar2(128);
    v_old_password_reuse_time varchar2(128);
    v_uses_default_for_time   varchar2(3);
    v_old_password_reuse_max  varchar2(128);
    v_uses_default_for_max    varchar2(3);
    v_alter_user_sql          varchar2(4000);
begin
    --Get user's profile information.
    --(This is tricky because there could be an indirection to the DEFAULT profile.
    select
        profile,
        case when user_password_reuse_time = 'DEFAULT' then default_password_reuse_time else user_password_reuse_time end password_reuse_time,
        case when user_password_reuse_time = 'DEFAULT' then 'Yes' else 'No' end uses_default_for_time,
        case when user_password_reuse_max  = 'DEFAULT' then default_password_reuse_max  else user_password_reuse_max  end password_reuse_max,
        case when user_password_reuse_max  = 'DEFAULT' then 'Yes' else 'No' end uses_default_for_max
    into v_profile, v_old_password_reuse_time, v_uses_default_for_time, v_old_password_reuse_max, v_uses_default_for_max
    from
    (
        --User's profile information.
        select
            dba_profiles.profile,
            max(case when resource_name = 'PASSWORD_REUSE_TIME' then limit else null end) user_password_reuse_time,
            max(case when resource_name = 'PASSWORD_REUSE_MAX' then limit else null end) user_password_reuse_max
        from dba_profiles
        join dba_users
            on dba_profiles.profile = dba_users.profile
        where username = v_username
        group by dba_profiles.profile
    ) users_profile
    cross join
    (
        --Default profile information.
        select
            max(case when resource_name = 'PASSWORD_REUSE_TIME' then limit else null end) default_password_reuse_time,
            max(case when resource_name = 'PASSWORD_REUSE_MAX' then limit else null end) default_password_reuse_max
        from dba_profiles
        where profile = 'DEFAULT'
    ) default_profile;

    --Get user's password information.
    select
        'alter user '||name||' identified by values '''||
        spare4 || case when password is not null then ';' else null end || password ||
        ''''
    into v_alter_user_sql
    from sys.user$
    where name = v_username;

    --Change profile limits, if necessary.
    if v_old_password_reuse_time <> 'UNLIMITED' then
        execute immediate 'alter profile '||v_profile||' limit password_reuse_time unlimited';
    end if;

    if v_old_password_reuse_max <> 'UNLIMITED' then
        execute immediate 'alter profile '||v_profile||' limit password_reuse_max unlimited';
    end if;

    --Change the user's password.
    execute immediate v_alter_user_sql;

    --Change the profile limits back, if necessary.
    if v_old_password_reuse_time <> 'UNLIMITED' then
        if v_uses_default_for_time = 'Yes' then
            execute immediate 'alter profile '||v_profile||' limit password_reuse_time default';
        else
            execute immediate 'alter profile '||v_profile||' limit password_reuse_time '||v_old_password_reuse_time;
        end if;
    end if;

    if v_old_password_reuse_max <> 'UNLIMITED' then
        if v_uses_default_for_max = 'Yes' then
            execute immediate 'alter profile '||v_profile||' limit password_reuse_max default';
        else
            execute immediate 'alter profile '||v_profile||' limit password_reuse_max '||v_old_password_reuse_max;
        end if;
    end if;
end;
/
20 голосов
/ 25 июля 2013

Компиляция из ответа Джонаирла, http://kishantha.blogspot.com/2010/03/oracle-enterprise-manager-console.html и http://blog.flimatech.com/2011/07/17/changing-oracle-password-in-11g-using-alter-user-identified-by-values/ (Oracle 11g):

Чтобы остановить это в будущем, сделайте следующее.

  • Войдите в sqlplus как sysdba -> sqlplus "/ as sysdba"
  • Выполните -> ALTER PROFILE DEFAULT LIMIT FAILED_LOGIN_ATTEMPTS UNLIMITED PASSWORD_LIFE_TIME UNLIMITED;

Чтобы сбросить статус пользователей, выполните запрос:

select
'alter user ' || su.name || ' identified by values'
   || ' ''' || spare4 || ';'    || su.password || ''';'
from sys.user$ su 
join dba_users du on ACCOUNT_STATUS like 'EXPIRED%' and su.name = du.username;

и выполнить часть или весь набор результатов.

9 голосов
/ 09 мая 2016
set long 9999999
set lin 400
select DBMS_METADATA.GET_DDL('USER','YOUR_USER_NAME') from dual;

Это выведет что-то вроде этого:

SQL> select DBMS_METADATA.GET_DDL('USER','WILIAM') from dual;

DBMS_METADATA.GET_DDL('USER','WILIAM')
--------------------------------------------------------------------------------

   CREATE USER "WILIAM" IDENTIFIED BY VALUES 'S:6680C1468F5F3B36B726CE7620F
FD9657F0E0E49AE56AAACE847BA368CEB;120F24A4C2554B4F'
      DEFAULT TABLESPACE "USER"
      TEMPORARY TABLESPACE "TEMP"
      PASSWORD EXPIRE
SQL>

Просто используйте вместо этого первую часть этого с alter user:

ALTER USER "WILIAM" IDENTIFIED BY VALUES 'S:6680C1468F5F3B36B726CE7620F
FD9657F0E0E49AE56AAACE847BA368CEB;120F24A4C2554B4F';

Это вернет учетную запись вОТКРЫТЬ состояние без изменения пароля (при условии, что вы правильно вырезали и вставили хеш-значение из вывода DBMS_METADATA.GET_DDL), и вам даже не нужно знать, какой пароль.

4 голосов
/ 05 ноября 2013

Если вы знаете пароль этого пользователя или хотите его угадать, выполните следующие действия:

  • connect user/password

Если эта команда подключаетсяПосле этого вы увидите сообщение «подключен», в противном случае вы увидите сообщение об ошибке.Если вы успешно ведете журнал, это означает, что вы знаете пароль.В этом случае просто выполните:

  • alter user NAME_OF_THE_USER identified by OLD_PASSWORD;

, и это сбросит пароль к тому же паролю, что и раньше, а также сбросит account_status для этого пользователя.

1 голос
/ 07 мая 2019

Шаг-1 Нужно найти информацию о пользователе, используя запрос ниже

SQL> select username, account_status from dba_users where username='BOB';

USERNAME                       ACCOUNT_STATUS
------------------------------ --------------------------------
BOB                            EXPIRED

Шаг-2 Получить пароль пользователя, используя запрос ниже.

SQL>SELECT 'ALTER USER '|| name ||' IDENTIFIED BY VALUES '''|| spare4 ||';'|| password ||''';' FROM sys.user$ WHERE name='BOB';

ALTER USER BOB IDENTIFIED BY VALUES 'S:9BDD17811E21EFEDFB1403AAB1DD86AB481E;T:602E36430C0D8DF7E1E453;2F9933095143F432';

Шаг -3 Выполнить над изменением запроса

SQL> ALTER USER BOB IDENTIFIED BY VALUES 'S:9BDD17811E21EFEDFB1403AAB1DD86AB481E;T:602E36430C0D8DF7E1E453;2F9933095143F432';
User altered.

Шаг 4: проверка статуса учетной записи пользователя

SQL> select username, account_status from dba_users where username='BOB';
USERNAME                       ACCOUNT_STATUS
------------------------------ --------------------------------
BOB                            OPEN
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...