2011년 12월 7일 수요일

Forms에서 멀티 라인 입력하기


The idea for this sample form came to me from the Oracle Technology Network (OTN) user forums.  The question was asked: Is there a way to count the number of characters a user has typed into a multi-line Text-Item and display the number of characters remaining?  I knew this could be done with a timer, but had never seen it done nor had I done it myself.  So, I decided it was time to figure out how to do it. 

I hope you find the following sample Form useful.  The code included is not specific to any version of Oracle Forms, however, I have only tested the code with Oracle Forms 10g R2 (10.1.2.0.2).  The supplied sample form is written using this version, but you should be able to use the supplied code in Forms 6i or higher.

The following sample will walk you through creating a non-base table form that employs a timer to count the number of characters that have been entered in a multi-line Text-Item and display how many characters are left.  It is assumed that you have a basic working knowledge of Oracle Forms

If you find bugs with the supplied form or code, please let me know.

1.      Open Forms Builder and log into any database.
2.      Open Create a new forms module.
3.      Create a new Canvas and set the following properties in the Property Palette:
a.       Name:  MLINE_COUNTER or leave at default name
b.      Width:   380
c.       Height:  250
4.      Create a new “Non-Base table” data block (do not use the Data Block Wizard to create the block) and change the following block properties in the Property Palette:
a.       Name:   MLINE_COUNTER or leave at default name
b.      Database Data Block:   No
c.       Query Data Source Type:  None
5.      Add three Text-Items to the MLINE_COUNTER block and change the following item properties:
a.       ITEM1
i.       Name:  MLINE_TEXT
ii.      Multi-line:  Yes
iii.     Maximum Length:  500
iv.    Database Item:   No
v.     Visible:  Yes
vi.    Canvas:  MLINE_COUNTER
vii.   X Position:  35
viii.  Y Position:  19
ix.     Width:  310
x.      Height:  127
xi.     Show Vertical Scroll Bar:  Yes
b.      ITEM2
i.       Name:  DSP_TEXT_COUNT
ii.      Item Type:  Display Item
iii.     Maximum Length:  100
iv.     Database Item:  No
v.      Visible:  Yes
vi.     Canvas:  MLINE_COUNTER
vii.    X Position:  96
viii.   Y Position:  150
ix.     Width:  188
x.      Height:  14
xi.     Bevel:  None
c.       ITEM3  (This item is not required, but was used during development to prove the concept.  You can skip this step if you want.)
i.        Name:  BTN_COUNT_TEXT
ii.       Item Type:  Push Button
iii.      Label:  Count
iv.     Canvas:  MLINE_COUNTER
v.      X Position:  156
vi.     Y Position:  174
vii.    Width:  68
viii.   Height:  16
6.      Now we will add three Program Units to encapsulate the code for the counting process.  Again, it is assumed that you familiar enough with Oracle Forms to add a program unit to the Program Units node in the Object Navigator.
a.       GET_ITEM_COUNT_F (Function)
i.      Program Unit Text:

FUNCTION get_item_count_f (p_block_item VARCHAR2) RETURN VARCHAR2 IS
      nCount      NUMBER := 0;     
      nItmSize    NUMBER := 0;
      nRemaining  NUMBER := 0;
      vRetVal     VARCHAR2(100);
     
BEGIN
      nItmSize := Get_Item_Property(p_block_item, MAX_LENGTH);
      nCount := length(NAME_IN(p_block_item));
      nRemaining := nItmSize - nvl(nCount,0);
      vRetVal := 'Remaining: '||nRemaining||' of '||nItmSize;
      RETURN vRetVal;
END;

b.      MYTIMER (Package Specification)
i.      Program Unit Text:

PACKAGE MyTimer IS
      tID               TIMER;     
      v_block_item      VARCHAR2(61);

  PROCEDURE SET_TIMER (p_item  VARCHAR2);
  PROCEDURE DEL_TIMER (p_item VARCHAR2);
END;

c.       MYTIMER (Package Body)
i.      Program Unit Text:

PACKAGE BODY MyTimer IS
  -- The value passed to this procedure should be the value of
  -- :SYSTEM.CURSOR_ITEM (if Forms version 6i, use
  -- :SYSTEM.CURRENT_ITEM)
  PROCEDURE SET_TIMER (p_item  VARCHAR2) AS
  BEGIN
      IF ( p_item = v_block_item ) THEN 
            -- tID is a Package level Variable
            tID := Create_Timer('MLINE_TEXT',1000,REPEAT);

      -- These ELSIF statements are here only to demonstrate
      -- how you can extend this procedure to support multiple items
      -- in a Form that you use this method on.  They can be excluded
      -- if you do not want to include them.
      ELSIF ( p_item = 'BLOCK2.Item2' ) THEN
            tID := Create_Timer('ITEM2',1000,REPEAT);
      ELSIF ( p_item = 'BLOCK2.Item3' ) THEN
            tID := Create_Timer('ITEM3',1000,REPEAT);            
      END IF;
  END SET_TIMER;

  PROCEDURE DEL_TIMER (p_item VARCHAR2) AS
  BEGIN
      IF ( p_item = v_block_item ) THEN 
            -- tID is a Package level Variable
            Delete_Timer('MLINE_TEXT');
      ELSIF ( p_item = 'BLOCK2.Item2' ) THEN
            Delete_Timer('ITEM2');
      ELSIF ( p_item = 'BLOCK2.Item3' ) THEN
            Delete_Timer('ITEM3');             
      END IF;
  END DEL_TIMER;
END;


7.      Create a Form level When-Timer-Expired trigger and add the following Trigger Text:

DECLARE
   vTimer   VARCHAR2(30) := Get_Application_Property(TIMER_NAME);
BEGIN
   IF ( vTimer = 'COUNTER' ) THEN
      :MLINE_COUNTER.DSP_TEXT_COUNT :=
             get_item_count_f(:SYSTEM.CURSOR_ITEM);        
   END IF
END;


At this point, your form should look similar to the following:


 
You are now ready to compile and run your form.  It is assumed that you are familiar enough with Oracle Forms to configure your installation to allow running Form locally.  For Forms 6i, this is quite simple as the form will run in Client/Server mode Forms Runtime.  If you are using Oracle Forms 9i or higher then you will need to configure your Forms installation to enable running a form from your developer installation of Oracle Forms.  How to configure forms to run locally is covered in a separate document.  You could also deploy this form to a Development environment to test.

Run the form and as you type, your form should look similar to the following:


Attachments (2)

2011년 11월 19일 토요일

3G 인증 없이 Olleh wifi call 쓰기



아이폰에서 Olleh wifi call 많이 이용하시죠?

근데 이게 3g망에서 인증이 되야 정상 로그인이됩니다.

이것을 wifi에서 로그인하는 방법을 알려드리겠습니다.

우선 최소 한번은 Olleh wifi call에 유심을 삽입한 상태로 로그인합니다.

성공적으로 로그인이 됐다면

다이얼 패드에서 다음 키를 입력합니다.

*1472356*1475369*

엔지니어링 모드로 들어가게 되는데요

이때 IMS설정을 누르고 보시면 상단에 자동개통 부분이 1로 되있습니다.

이것을 0으로 수정하신뒤에 저장하시면됩니다.

아래 정보는 로그인 정보임으로 수정하지 마세요

수동 개통모드로 바뀌면 3g인증없이 wifi로만 정상적 로그인이 됩니다.

당연 usim이 없어도 와이파이만 연결되면 통화가 가능합니다.

2011년 11월 16일 수요일

최대 절전 모드 해제/설정하기

[출처:http://windowsforum.kr/]

윈도우에서 최대 절전 모드를 사용하지 않을시 꺼주면 이에
하드디스크 공간도 어느정도 절약 가능하다.

※ 최대 절전 모드
해제 : powercfg /hibernate off
설정 : powercfg /hibernate on

2011년 11월 14일 월요일

Oracle Lock Check 스크립터

* 락걸린 프로세서 조회 <--반드시 시스템 계정으로 조회
Select /*+ rule */
       s.username Ora_User,  osuser OS_User,  s.sid sid ,  s.serial# Serial#,
       p.spid, l.type Type,  decode(lmode,1,'NONE',2,'RS',3,'RX',4,'S',5,'RSX',6,'X') Held,
       o.name Object_Name,  id1 Object_Id,  s.status Status,
       decode(request,1,'NONE',2,'RS',3,'RX',4,'S',5,'RSX',6,'X') Req,
       s.terminal
From   v$lock l, v$session s, sys.obj$ o , v$process p
Where  l.sid = s.sid and s.paddr=p.addr
  and  l.id1 = o.obj#(+)
  and  s.username is not null
Order  by sid

* 프로세서 죽이기
alter system kill session 'SID,SERIAL';

----------------------  추가  ----------------------------------------------------------------
[출처 : http://pangate.com/ ]

프로젝트에서 LOCK 이 자주 걸리는 문제가 발생하여 연구하던 중에 아래의 sql 문을 이용하여 lock 세션을 찾아서 관리할 수 있다는 것을 알았다. 그러나 이 SQL 은 System 유저만이 사용할 수 있다는  제약이 있다.

LOCK 이 발생하게 되면 프로그램이 동작하다가 멈추고 기다리게 된다. 원인을 파악하는데 시간이 허비하게 되는데 알고 보니 테이블에 LOCK이 걸린 것이었다면 허탈함을 금할 수 없다.  자주 LOCK 이 걸리는 테이블이라면 SELECT 할 때 WAIT 타임을 1 정도로 주면 1초동안 LOCK 이 풀리기를 대기하다가 오류 처리되므로 개발자가 쉽게 LOCK 걸린 상황을 인지할 수 있다.

-- 락걸린 테이블 확인
SELECT  DO.OBJECT_NAME, DO.OWNER, DO.OBJECT_TYPE, DO.OWNER,
        VO.XIDUSN, VO.SESSION_ID, VO.LOCKED_MODE
FROM    V$LOCKED_OBJECT VO, DBA_OBJECTS DO
WHERE   VO.OBJECT_ID = DO.OBJECT_ID;

-- 해당 테이블에 LOCK 이 걸렸는지.
SELECT A.SID, A.SERIAL#, B.TYPE, C.OBJECT_NAME
FROM V$SESSION A, V$LOCK B, DBA_OBJECTS C
WHERE A.SID = B.SID AND B.ID1 = C.OBJECT_ID
AND B.TYPE='TM' AND C.OBJECT_NAME IN ('TB_CO_GENO');

-- 락발생 사용자와 SQL, OBJECT 조회
SELECT DISTINCT X.SESSION_ID, A.SERIAL#, D.OBJECT_NAME, A.MACHINE, A.TERMINAL,
                A.PROGRAM, B.ADDRESS, B.PIECE, B.SQL_TEXT
FROM V$LOCKED_OBJECT X, V$SESSION A, V$SQLTEXT B, DBA_OBJECTS D
WHERE X.SESSION_ID = A.SID AND
X.OBJECT_ID = D.OBJECT_ID AND A.SQL_ADDRESS = B.ADDRESS
ORDER BY B.ADDRESS, B.PIECE;

-- 현재 접속자의 SQL 분석
SELECT DISTINCT A.SID, A.SERIAL#,
       A.MACHINE, A.TERMINAL, A.PROGRAM,
       B.ADDRESS, B.PIECE, B.SQL_TEXT
FROM  V$SESSION A, V$SQLTEXT B
WHERE A.SQL_ADDRESS = B.ADDRESS
ORDER BY A.SID, A.SERIAL#, B.ADDRESS, B.PIECE

-- 락 세션 죽이기
  SELECT A.SID,   A.SERIAL#
  FROM V$SESSION A,  V$LOCK B,
       DBA_OBJECTS C
 WHERE A.SID = B.SID
   AND B.ID1 = C.OBJECT_ID
   AND B.TYPE = 'TM'
   AND C.OBJECT_NAME = 'TB_CO_GENO'
 
SID SERIAL#
--- -------
5   1
6   1

2. 다음 명령으로 SESSION들을 KILL한다.  ALTER SYSTEM KILL SESSION 'SESSION_ID, SERIAL#';
SQL> alter system kill session '5, 1';
SQL> alter system kill session '6, 1';


-- 락 세션 죽이는 sql 문
SELECT DISTINCT X.SESSION_ID, A.SERIAL#, D.OBJECT_NAME, A.MACHINE, A.TERMINAL,
       A.PROGRAM, A.LOGON_TIME, 'ALTER SYSTEM KILL SESSION'''||A.SID||', '||A.SERIAL#||''';'
FROM GV$LOCKED_OBJECT X, GV$SESSION A, DBA_OBJECTS D
WHERE  X.SESSION_ID = A.SID AND X.OBJECT_ID = D.OBJECT_ID
ORDER BY LOGON_TIME;



자주 발생하는 LOCK 문제들
-------------------------
1. Parent-Child 관계로 묶인 테이블에서 Child 테이블에 Index가 없는 상황에서 Child 테이블을 수정하게 되면 Parent테이블에 TABLE LEVEL SHARE LOCK이 걸리게 되어서 Parent 테이블에 대한 모든 Update가 금지된다.
2. 블럭의 PCTFREE가 매우 작다면 한 블럭에 여러개의 레코드가 들어 있기 때문에 한 블럭에 과도한 트랜잭션이 들어와서 블럭의 Transaction Layer가 Release 되기를 기다리게 되는 경우도 있다.
3. Transaction을 직접 처리하는 경우 (@Transaction을 사용하지 않고 @Override 를 사용) commit 이나 rollback 하지 않고 바로 빠져 나가는 경우에도 lock 이 발생될 수 있다. 거래가 바로 빠져 나가는 경우는 exception 이 발생했으나 catch 를 제대로 하지 못 한 경우가 흔하다.


다음은 <http://www.medianart.com/288> 에서 퍼온 글입니다. 내가 궁금하던 것을 잘 정리해 놓으셨군요~
LOCK의 유형
   데이타의 concurrency를 보장하기 위해 오라클은 lock과 transaction을 사용한다.
   Lock은 같은 자원을 access하는 사용자들 사이에 상호간에 해를 끼치는 것을 예방하기 
   위해서 사용되는 메카니즘이다.
   Lock의 종류
      - Exclusive : lock이 걸린 자원의 공유를 허용하지 않는다.
      - Share : 자원에 대해 수행되는 명령의 유형에 따라 lock된 자원의 공유되는 것을  허용한다.
   오라클에서의 Lock의 일반적인 범주
      - Data or DML (row locks TX and table locks TM) : 동시에 다중의 사용자에 의해
        access되는 테이블 데이타의 보호를 위해 사용된다.
      - Dictionary or DDL(TD) : 트랜잭션에서 access되는 테이블과 같은 Object의 정의를
        보호하기 위해서 사용한다.
      - Internal and Latches (RT, MR) : SGA 영역에서의 내부적인 데이타베이스와 메모리
        구조를 보호하기 위해 사용한다.
   1. TABLE LOCKS
      테이블의 특정한 row를 수정하는 문장은 항상 그러한 row에 대해 exclusive row lock
      을 획득하고 테이블 lock을 전유한다.
      (1) Row Share Table Locks (RS)
          - row를 lock 시키고 lock된 테이블을 UPDATE 할 목적이다.
          - 모든 row를 SELECT 하려는 다른 트랜잭션을 허용한다.
          - 동일 테이블에서 lock 되지 않은 row를 INSERT, UPDATE, DELETE 하는 다른  트랜잭션을 허용한다.
          - 테이블에 대한 ROW SHARE, ROW EXCLUSIVE, SHARE, SHARE ROW EXCLUSIVE lock
            을 획득하려는 다른 트랜잭션을 허용한다.
          - EXCLUSIVE 모드에서의 테이블 locking으로부터 다른 트랜잭션을 예방한다.
      (2) Row Exclusive Table Locks (RX)
          - row를 lock 시키고 테이블에서 row를 변화시킨다.
          - 모든 row를 SELECT 하려는 다른 트랜잭션을 허용한다.
          - 동일 테이블에서 lock 되지 않은 row를 INSERT, UPDATE, DELETE 하는 다른
            트랜잭션을 허용한다.
          - 테이블에 대한 ROW SHARE, ROW EXCLUSIVE lock을 획득하려는 다른 트랜잭션을
            허용한다.
          - SHARE, EXCLUSIVE, SHARE ROW EXCLUSIVE 모드에서의 테이블 locking으로부터
            다른 트랜잭션을 예방한다.
      (3) Share Table Locks (S)
          - 다른 트랜잭션을 제공하지 않는 테이블에서 row를 INSERT, UPDATE, DELETE
            하는 것이 SHARE lock을 홀딩한다.
          - 동일 테이블에서 지정된 row를 QUERY 또는 LOCK 하려는 다른 트랜잭션을  허용한다.
          - 테이블에 대해 더 나아가 SHARE lock을 얻으려는 다른 트랜잭션을 허용한다.
          - EXCLUSIVE 또는 SHARE ROW EXCLUSIVE 모드로 테이블을 locking 하는 것으로
            부터 다른 트랜잭션을 보호한다.
      (4) Share Row Exclusive Table Locks (SRX)
          - 테이블에 row를 INSERT, UPDATE, DELETE 한다.
          - 동일 테이블에서 지정된 row를 QUERY 또는 LOCK 하려는 다른 트랜잭션을   허용한다.
          - SHARE, EXCLUSIVE 또는 SHARE ROW EXCLUSIVE 모드로 테이블을 locking 하는 것으로
            부터 다른 트랜잭션을 보호한다.
      (5) Exclusive Table Locks (S)
          - 테이블에 row를 INSERT, UPDATE, DELETE 한다.
          - 동일 테이블에서 지정된 row를 QUERY하는 것에 대해서만 다른 트랜잭션을
            허용한다.
          - 어떠한 lock 문장을 내리는 것으로부터 다른 트랜잭션을 보호한다.
   2. DICTIONARY LOCKS
      Dictionary lock은 Object에 대한 DDL 명령이 수행되는 동안 Object의 정의를  보호한다.
   3. INTERNAL LOCKS 과 LATCHES
      Latches 와 Internal lock은 메모리 구조를 보호하기 위한 메카니즘이다.
      - Latches 는 SGA 영역에 있는 shared data structure를 보호하기 위한 low-level    연속 메카니즘이다.
      - Internallock은 data dictionary entry를 보호하고 database file, tablespace,  rollback segment를 lock한다.
      Latches 와 Internal locks는 데이타베이스 사용자에 의해 컨트롤 될 수 없다.

LOCK에 대한 모니터
   lock contention 과 병목현상은 시스템의 효능을 저하시킨다.
   1. 모니터 방법
      (1) SQL*DBA 모니터 lock display
      (2) V$LOCK view
      (3) utllockt.sql 이라는 스크립트 화일의 내용을 확인
          (lock이 된 자원을 기다리는 사용자가 있는지를 보여줌)
   2. SQL*DBA lock monitor 를 사용한 모니터 방법
      Lock 모니터의 Resource ID 1 필드는 DBA_OBJECTS 에서의 object_id 이다.
      Lock 모니터의 특정한 Resource ID 1 과 일치하는 테이블명을 찾기 위해서는   다음 Query를 사용한다.
      SQL> SELECT owner, object_id, object_name, object_type
           FROM dba_objects
           WHERE object_id = resource id #;
      ▶ LOCK monitor의 컬럼들
      Username : 연결된 사용자의 명
      Session ID : 사용자 연결을 식별하기 위해 오라클에서 제공되는 ID
      Serial Number : 세션의 시리얼 번호로 각각의 세션을 유일한 번호로 지정하기 위해  Session ID를 함께 사용한다.
      Lock Type : TM은 데이타 조작에 대해 dictionary lock을 표시한다.
                  Resource ID 1 필드는 lock이 걸린 테이블의 ID이다.
                  테이블명을 찾아보려면 DBA_OBJECTS 쿼리를 사용한다.
                  TM lock은 트랜잭션 lock이다.
                  지시하는 row는 lock이 걸리거나 lock 되기 위해 요청된다.
      Resource ID 1 : TM 형태의 lock에 대해 DBA_OBJECTS view로 찾은 테이블 ID를 보여준다. 다른 값은 무시될 수 있다.
      Resource ID 2 : 내부적으로 lock의 형태를 식별하기 위해 사용한다.
      Mode Held : 자원을 쥐고 있는 lock의 모드를 나타낸다.
      Mode Requested : 자원에게 요청된 lock의 모드를 나타낸다.

2011년 10월 20일 목요일

ubuntu에 sun-java6 설치하기

[출처: http://www.ubuntu.or.kr/]

# sudo apt-add-repository ppa:ferramroberto/java && sudo apt-get update
# sudo apt-get install sun-java6-jre sun-java6-jdk sun-java6-plugin sun-java6-fonts

#sudo updata-java-alternatives -l
java-1.6.0-openjdk 1061 /usr/lib/jvm/java-1.6.0-openjdk
java-6-sun  63 /usr/lib/jvm/java-6-sun

#sudo update-java-alternatives -s java-6-sun

2011년 10월 11일 화요일

thunderbird에서 Winmail.dat로 오는 첨부파일 보는 법

[출처: http://zemy.net/tc/zemyblue/153 ]

난 Mail client 프로그램으로 MS Office가 유료이기 때문에 돈을 주고 살 수 없기 때문에 Outlook이 아닌 Thunderbird를 사용한다. 물론 어둠의 경로를 통해서 설치할 수도 있겠지만, 되도록이면 정품을 얘용하기를 원하기 때문에 대체프로그램으로 Thunderbird를 사용한다.

그런데 Winmail.dat 첨부파일 문제 때문에 불편을 격곤 한다. 이 Thunderbird는 Outlook으로 전송한 메일을 받는 사람의 클라이언트가 서식이 있는 문자열(RTF)로 된 메시지를 처리하지 못하는 경우 Winmail.dat라는 파일이 메시지의 끝 부분에 자동으로 첨부된다. 그래서 메일 내용을 모두 볼 수 없는 경우가 생긴다.

그런데 이를 볼 수 있게 해주는 프로그램이 있다. Winmail_opener 로 무료기는 하지만 첨부된 Winmail.dat를 다운로드해서 로드해야하는 불편함이 있다. 그렇지만 Thunderbird에서도 Winmail.dat를 볼 수가 있기 때문에 조금은 위안을 삼는다.

Winmail_opener는 http://www.eolsoft.com/freeware/winmail_opener/ 에서 구할 수 있다.

winmail_opener로 다음과 같이 첨부파일을 확인할 수 있다.
Outlook에서 Winmail.dat를 보내지 않게 하려면, 발송자가 TNEF(전송 중립 포장 포맷, Transport Neutral Encapsulation Format)를 꺼놓으면 된다.
1. 도구(Tool) -> 옵션(Option) -> 메일형식(mail format) 탭을 선택한다.
2. "아웃룩 서식있는 텍스트 메시지를 보낼 때 "HTML 형식으로 변환(Convert to HTML format)" 또는 "일반 텍스트 형식(Convert to Plain Text Format)"으로 설정한다.
Winmail.dat 파일이 전송되지 않도록 하는 방법을 MS에서도 다음 페이지에서 게시해놨다.
http://support.microsoft.com/kb/q138053/
기업메일 시스템과 호환성을 보장하기 위해서 이러한 부분은 설정해 보자. ^^

그런데 맥에서는 어떻게 봐야 하지. ㅡㅜ..

요샌 윈도우보다 맥을 더 많이 사용하는데 말야.

2011년 9월 23일 금요일

인터넷 익스플러7 개인설정 사용자 지정 페이지 오류

인터넷 익스플러7을 처음 실행시 개인 설정 사용자 지정 페이지가 오류가 나면서
더이상 진행되지 않을 때 아래와 같이 수정한다.

해결법 : regedit실행
              내컴퓨터\HKEY_CURRENT_USER\Software\Microsoft\Internat Explore\Main으로 이동
              DWORD 값 추가
                ① RunOnceHasShown : 1
                ② RunOnceComplete   : 1

윈도우 XP,2003,WIN7 패스워트 초기화

[출처 : http://jaewook.net/ ]

예전에 올렸던 파일링크가 깨져서 새로 찾아보면서  예전 글을 업데이트하여 다시 작성해봅니다.
윈도우2000/XP/2003/Vista 의 패스워드를 잊어버렸을때 난감한 기억이 있으실 겁니다.  패스워드를 잊어버렸거나  잘못 변경하여 더이상 시스템에 로그인하는 것이 불가능해 질 수 있습니다.
다시 설치하자니 시간도 매우 많이 걸리고  프로그램은 또 어찌 다시 설치하겠습니까?  또 OS가 서버라면 문제는 더욱 심각해 집니다.  재설치 하면 안되는 경우도 있죠…ㅠ ㅠ  이런 상황이 닥치면 한숨만 나오게 되죠…  하지만  이젠 걱정하지 마세요..
Offline NT Password & Registry Editor‘ 만 있으면 걱정없습니다.
Offline NT Password & Registry Editor‘는 일종의 리눅스부팅 CD로 제공됩니다.
리눅스로 부팅해서 ntfs 파티션을 마운트하여  로컬계정의 패스워드를 초기할수있게 해 줍니다.
Local SAM 편집기라고 할수있겠습니다.
이 프로그램은 매우 작습니다. 4M도 되지않죠..  CD롬으로 구워서 부팅CD로 사용하시면 되겠습니다.
▶ 프로그램 사용법
지금 부터 패스워드를 잊어버린 윈도우 시스템의 어드민 계정의 패스워드를 리셋시켜 보겠습니다
1. 제작한 부팅 CD를 이용하여 문제의 시스템을 부팅
boot: 라는 프롬프트가 보이는데 그냥 엔터를 쳐줍니다.

 2. 윈도우OS가 설치된 파시션 선택 및 SAM 디렉토리 선택
맨처음으로 보이는 것은 로컬 HDD의 파티션입니다. 여기서 XP 윈도우시스템이 설치된 파티션을 선택해줍니다.  용량및 boot여부를 확인하시면 쉽게 구분이 가능합니다.  여기서는 1번이 xp파티션이었습니다 .보통 기본적으로 1번이 선택되어 있으므로 엔터를 쳐줍니다. (default로 보여질 경우 엔터만 쳐주면 됨), default값과 다르다면 맞는 값을 타이핑한후 엔터를 쳐주면 됩니다.
그리고 나서 로컬SAM디렉토리를 보여주는데 보통 기본값으로 보이므로 그냥 엔터치면 되겠습니다. 실제로 로컬SAM값은 windows/system32/config 하단에 보관됩니다.

3.패스워드 리셋 메뉴에 들어감
1번을 눌러서 패스워드 리셋메뉴에 진입하세요

4. 로컬계정의 패스워드 편집메뉴 선택및 어드민 계정 선택
1번 메뉴를 선택한후 엔터를 치면 로컬에 존재하는 계정들을 리스트해줍니다.
이때 로컬 계정중 어드민 계정을 선택하여 엔터를 쳐 줍니다.
보통 administrator계정이 기본적으로 선택됩니다.
그림에선 rename된 administrator계정을 선택하였습니다.

5. admin계정의 패스워드 clear
선택된 admin계정의 정보를 보여주는데 이 정보가 맞는 것을 확인후 계정패스워드 clear를 시킵니다.
변경 메뉴 옵션은 다음과 같습니다.
1 – 패스워드 리셋 (클리어) –> 리부팅후 패스워드를 공란으로 두고 엔터를 치면 되는거죠…
2 – 패스워드 변경 (다른 문자로…)
3 – 계정을 로컬 시스템의 administators 그룹에 넣어줌 (일반 계정을 administrators 로 상승시킵니다)
로컬 administator계정의 패스워드를 변경하지 않고 작업을 할때 유용합니다.
사실 저는 3번을 권하고 싶습니다.  물론 다른 계정이 시스템이 이미 존재했을때의 경우입니다.

6. 패스워드 clear작업을 저장하고 리부팅
패스워드 clear 작업이 잘 되었으면 [ ! ] 누른후 엔터를 쳐서 계정편집 메뉴에서 나옵니다.
[ q ] 키를 누른후 엔터를 쳐서 SAM 편집 메뉴에서 나옵니다.
작업을 잘못했다면 다시 하겠냐는 질문에  [ n ]라고 답한후 엔터 쳐서 모든 작업을 종료합니다.
Press  CTRL-ALT-DEL to reboot now …라고 나오면   모든 작업이 마쳐진 것이므로
컴퓨터를 리부팅해줍니다.

 부팅후 administrator계정의 패스워드란에 아무것도 넣지않은채로 로그인이 가능해졌습니다.
7. 부팅후 즉시  administrator계정의 새로운 패스워드 설정 
제일 먼저 할 것이 바로 패스워드 없이 로그인하 어드민 계정의 패스워드를 신속하게 다시 세팅하는 것입니다.  깜박 잊었다고 한다면 중대한 보안사고의 원인이 될수도 있으니 조심 또 조심 하시길…
  이 툴을 통해서 패스워드 리셋 시킬수있는 것은 로컬계정에 한정됩니다.
도메인 계정을 사용하실 경우 도메인계정에 대해서는 이 프로그램이 건드릴수없습니다.
서버관리시 될수있으면 도메인계정을 사용하는 것이 좋겠죠?
이 툴의 경우 악용의 여지도 있다고 할 수 있습니다.  부디 좋은곳에 사용되길 바래봅니다. ^^
제작사 페이지: http://home.eunet.no/
ISO파일 다운로드 (ZIP을 풀면 iso파일이 나옵니다): << Download >>