将Oracle用户帐户状态从EXPIRE(GRACE)更改为OPEN

1dkrff03  于 2022-12-26  发布在  Oracle
关注(0)|答案(7)|浏览(324)

收到Your password will be expired with in 7 days消息后,我将default配置文件中的密码过期天数更改为UNLIMITED,但部分用户的帐户状态仍为EXPIRE(GRACE)
有没有办法在不重置密码的情况下将Oracle用户帐户状态从EXPIRE(GRACE)更改为OPEN

clj7thdc

clj7thdc1#

不能,您不能在不重置密码的情况下 * 直接 * 将帐户状态从EXPIRE(GRACE)更改为OPEN。
文档中写道:
如果使用PASSWORD EXPIRE使数据库用户的口令过期,则用户(或DBA)必须更改口令,然后才能在口令过期后尝试登录数据库。
但是,您可以通过将用户的密码哈希重置为现有值来将状态"间接"更改为OPEN。不幸的是,将密码哈希设置为自身会带来以下问题,几乎所有其他解决方案都会忽略其中至少一个问题:
1.不同版本的Oracle使用不同类型的哈希。
1.用户的配置文件可能会阻止重复使用密码。
1.轮廓限制可以更改,但我们必须在最后更改回值。
1.概要文件的值并不是微不足道的,因为如果值是DEFAULT,它就是指向DEFAULT概要文件值的指针,我们可能需要递归地检查概要文件。
下面这个大得离谱的PL/SQL块应该可以处理所有这些情况。它应该使用相同的口令哈希将任何帐户重置为OPEN,而不管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;
/
u5rb5r59

u5rb5r592#

根据jonearles的回答编译,http://kishantha.blogspot.com/2010/03/oracle-enterprise-manager-console.htmlhttp://blog.flimatech.com/2011/07/17/changing-oracle-password-in-11g-using-alter-user-identified-by-values/(Oracle 11 g):
要在将来阻止这种情况发生,请执行以下操作。

  • 以sysdba身份登录到sqlplus-〉sqlplus“/as sysdba”
  • 执行-〉x1月1x

要重置用户状态,请运行查询:

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;

并执行结果集中的一些或全部。

carvr3hs

carvr3hs3#

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

只需使用alter user的第一部分即可:

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

这将使帐户回到OPEN状态,而不更改密码(只要您从DBMS_METADATA.GET_DDL的输出中正确地剪切和粘贴散列值),您甚至不需要知道密码是什么。

vnjpjtjt

vnjpjtjt4#

如果您知道该用户的密码,或者您想猜一猜,请执行以下操作:

  • 第一个月

如果这个命令成功连接,你会看到消息“connected”,否则你会看到一个错误消息。如果你成功登录,那意味着你知道密码。在这种情况下,只要做:

  • alter user NAME_OF_THE_USER identified by OLD_PASSWORD;

这会将密码重置为与之前相同的密码,并重置该用户的account_status。

jckbn6z7

jckbn6z75#

步骤-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
o4hqfura

o4hqfura6#

第I部分(查找用户是否存在)

--可以使用系统类型帐户(例如SYS)进行检查

  1. SQL〉select username, account_status from dba_users where username='BOB';
  2. SQL〉select username, account_status from dba_users where username like 'BOB%';
  3. SQL〉select username, account_status from dba_users where like '%BOB%';

PART II更改帐户属性

SQL〉ALTER user [username] account UNLOCK;--解除锁定帐户
SQL〉Alter user [username] IDENTIFIED BY "password";--将更改用户的密码

edqdpe6u

edqdpe6u7#

SQL〉ALTER用户[用户名]帐户UNLOCK;--如果帐户已锁定,则将其解锁
SQL〉修改用户[用户名]标识为“密码”;--将更改用户的密码
这个对我有用。

相关问题